server.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. from face_recognition_logic import recognize_face
  2. import os
  3. import sys
  4. import grpc
  5. from concurrent import futures
  6. sys.path.insert(0, os.path.join(os.path.dirname(__file__), "proto"))
  7. from proto import face_recognition_pb2, face_recognition_pb2_grpc
  8. EMPLOYEE_DB_PATH = "data/employees"
  9. class FaceRecognitionServicer(face_recognition_pb2_grpc.FaceRecognitionServiceServicer):
  10. def Recognize(self, request, context):
  11. model_name = request.model_name if request.model_name else None
  12. print("DEBUG request.ListFields() =")
  13. print(f"[INFO] Received recognition request... {model_name}")
  14. try:
  15. result = recognize_face(request.image, model_name)
  16. return face_recognition_pb2.FaceResponse(
  17. name=result["name"],
  18. confidence=result["confidence"],
  19. image=result["image"]
  20. )
  21. except Exception as e:
  22. print("[ERROR] Recognition failed:", e)
  23. return face_recognition_pb2.FaceResponse(
  24. name="Error",
  25. confidence=0.0,
  26. image=b""
  27. )
  28. def EnrollFace(self, request, context):
  29. try:
  30. name = request.name
  31. image_bytes = request.image
  32. if not name or not image_bytes:
  33. return face_recognition_pb2.EnrollFaceResponse(
  34. success=False,
  35. message="Name or image missing"
  36. )
  37. os.makedirs(EMPLOYEE_DB_PATH, exist_ok=True)
  38. file_path = os.path.join(EMPLOYEE_DB_PATH, f"{name}.jpg")
  39. with open(file_path, "wb") as f:
  40. f.write(image_bytes)
  41. print(f"[INFO] Enrolled employee: {name}")
  42. return face_recognition_pb2.EnrollFaceResponse(
  43. success=True,
  44. message="Enrollment successful"
  45. )
  46. except Exception as e:
  47. print(f"[ERROR] Enrollment failed: {e}")
  48. return face_recognition_pb2.EnrollFaceResponse(
  49. success=False,
  50. message=str(e)
  51. )
  52. def GetAllEmployees(self, request, context):
  53. try:
  54. employee_files = [
  55. f for f in os.listdir(EMPLOYEE_DB_PATH)
  56. if f.lower().endswith((".jpg", ".png", ".jpeg"))
  57. ]
  58. employees = []
  59. for file in employee_files:
  60. path = os.path.join(EMPLOYEE_DB_PATH, file)
  61. name = os.path.splitext(file)[0]
  62. with open(path, "rb") as f:
  63. image_bytes = f.read()
  64. employees.append(face_recognition_pb2.Employee(
  65. name=name, image=image_bytes))
  66. return face_recognition_pb2.EmployeeListResponse(employees=employees)
  67. except Exception as e:
  68. print("[ERROR] Failed to list employees:", e)
  69. return face_recognition_pb2.EmployeeListResponse(employees=[])
  70. def DeleteEmployee(self, request, context):
  71. try:
  72. found = False
  73. for file in os.listdir(EMPLOYEE_DB_PATH):
  74. if os.path.splitext(file)[0] == request.name:
  75. os.remove(os.path.join(EMPLOYEE_DB_PATH, file))
  76. found = True
  77. break
  78. message = "Deleted successfully" if found else "Employee not found"
  79. return face_recognition_pb2.DeleteEmployeeResponse(success=found, message=message)
  80. except Exception as e:
  81. print("[ERROR] Failed to delete employee:", e)
  82. return face_recognition_pb2.DeleteEmployeeResponse(success=False, message=str(e))
  83. def serve():
  84. server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
  85. face_recognition_pb2_grpc.add_FaceRecognitionServiceServicer_to_server(
  86. FaceRecognitionServicer(), server)
  87. server.add_insecure_port("[::]:50051")
  88. server.start()
  89. print("[INFO] gRPC Face Recognition server running on port 50051")
  90. server.wait_for_termination()
  91. if __name__ == "__main__":
  92. os.makedirs(EMPLOYEE_DB_PATH, exist_ok=True)
  93. serve()