| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- 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()
|