|
|
@@ -0,0 +1,108 @@
|
|
|
+from face_recognition_logic import recognize_face
|
|
|
+import os
|
|
|
+import sys
|
|
|
+import grpc
|
|
|
+from concurrent import futures
|
|
|
+
|
|
|
+sys.path.insert(0, os.path.join(os.path.dirname(__file__), "proto"))
|
|
|
+from proto import face_recognition_pb2, face_recognition_pb2_grpc
|
|
|
+
|
|
|
+EMPLOYEE_DB_PATH = "data/employees"
|
|
|
+
|
|
|
+
|
|
|
+class FaceRecognitionServicer(face_recognition_pb2_grpc.FaceRecognitionServiceServicer):
|
|
|
+
|
|
|
+ def Recognize(self, request, context):
|
|
|
+ model_name = request.model_name if request.model_name else None
|
|
|
+ print("DEBUG request.ListFields() =")
|
|
|
+ print(f"[INFO] Received recognition request... {model_name}")
|
|
|
+ try:
|
|
|
+ result = recognize_face(request.image, model_name)
|
|
|
+ return face_recognition_pb2.FaceResponse(
|
|
|
+ name=result["name"],
|
|
|
+ confidence=result["confidence"],
|
|
|
+ image=result["image"]
|
|
|
+ )
|
|
|
+ except Exception as e:
|
|
|
+ print("[ERROR] Recognition failed:", e)
|
|
|
+ return face_recognition_pb2.FaceResponse(
|
|
|
+ name="Error",
|
|
|
+ confidence=0.0,
|
|
|
+ image=b""
|
|
|
+ )
|
|
|
+
|
|
|
+ def EnrollFace(self, request, context):
|
|
|
+ try:
|
|
|
+ name = request.name
|
|
|
+ image_bytes = request.image
|
|
|
+ if not name or not image_bytes:
|
|
|
+ return face_recognition_pb2.EnrollFaceResponse(
|
|
|
+ success=False,
|
|
|
+ message="Name or image missing"
|
|
|
+ )
|
|
|
+
|
|
|
+ os.makedirs(EMPLOYEE_DB_PATH, exist_ok=True)
|
|
|
+ file_path = os.path.join(EMPLOYEE_DB_PATH, f"{name}.jpg")
|
|
|
+ with open(file_path, "wb") as f:
|
|
|
+ f.write(image_bytes)
|
|
|
+
|
|
|
+ print(f"[INFO] Enrolled employee: {name}")
|
|
|
+ return face_recognition_pb2.EnrollFaceResponse(
|
|
|
+ success=True,
|
|
|
+ message="Enrollment successful"
|
|
|
+ )
|
|
|
+ except Exception as e:
|
|
|
+ print(f"[ERROR] Enrollment failed: {e}")
|
|
|
+ return face_recognition_pb2.EnrollFaceResponse(
|
|
|
+ success=False,
|
|
|
+ message=str(e)
|
|
|
+ )
|
|
|
+
|
|
|
+ def GetAllEmployees(self, request, context):
|
|
|
+ try:
|
|
|
+ employee_files = [
|
|
|
+ f for f in os.listdir(EMPLOYEE_DB_PATH)
|
|
|
+ if f.lower().endswith((".jpg", ".png", ".jpeg"))
|
|
|
+ ]
|
|
|
+ employees = []
|
|
|
+ for file in employee_files:
|
|
|
+ path = os.path.join(EMPLOYEE_DB_PATH, file)
|
|
|
+ name = os.path.splitext(file)[0]
|
|
|
+ with open(path, "rb") as f:
|
|
|
+ image_bytes = f.read()
|
|
|
+ employees.append(face_recognition_pb2.Employee(
|
|
|
+ name=name, image=image_bytes))
|
|
|
+
|
|
|
+ return face_recognition_pb2.EmployeeListResponse(employees=employees)
|
|
|
+ except Exception as e:
|
|
|
+ print("[ERROR] Failed to list employees:", e)
|
|
|
+ return face_recognition_pb2.EmployeeListResponse(employees=[])
|
|
|
+
|
|
|
+ def DeleteEmployee(self, request, context):
|
|
|
+ try:
|
|
|
+ found = False
|
|
|
+ for file in os.listdir(EMPLOYEE_DB_PATH):
|
|
|
+ if os.path.splitext(file)[0] == request.name:
|
|
|
+ os.remove(os.path.join(EMPLOYEE_DB_PATH, file))
|
|
|
+ found = True
|
|
|
+ break
|
|
|
+ message = "Deleted successfully" if found else "Employee not found"
|
|
|
+ return face_recognition_pb2.DeleteEmployeeResponse(success=found, message=message)
|
|
|
+ except Exception as e:
|
|
|
+ print("[ERROR] Failed to delete employee:", e)
|
|
|
+ return face_recognition_pb2.DeleteEmployeeResponse(success=False, message=str(e))
|
|
|
+
|
|
|
+
|
|
|
+def serve():
|
|
|
+ server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
|
|
|
+ face_recognition_pb2_grpc.add_FaceRecognitionServiceServicer_to_server(
|
|
|
+ FaceRecognitionServicer(), server)
|
|
|
+ server.add_insecure_port("[::]:50051")
|
|
|
+ server.start()
|
|
|
+ print("[INFO] gRPC Face Recognition server running on port 50051")
|
|
|
+ server.wait_for_termination()
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ os.makedirs(EMPLOYEE_DB_PATH, exist_ok=True)
|
|
|
+ serve()
|