예제 #1
0
class FaceDetectionProcess():
    def __init__(self):
        self.logger = LoggerFactory()
        self.config = ConfigReader()
        self.request_manager = DetectionRequestsManager()
        self.directory = DirectoryManager()
        self.faceDetectionRepository = FaceDetectionRepository()
        self.pathsProvider = PathsProvider()

    @exception
    def run_face_detection(self):
        self.logger.info("  START FaceDetection")
        requests = self.faceDetectionRepository.get_all_not_completed()
        if not requests == null:
            for request in requests:
                try:
                    self.request_manager.process_request(request)
                    self.faceDetectionRepository.complete_request(request.id)
                except Exception as ex:
                    self.logger.error(
                        f"Exception when processing detection {request.id}.\n Error: {str(ex)}"
                    )
                    self.faceDetectionRepository.complete_with_error(
                        request.id)
            self.directory.clean_directory(
                self.pathsProvider.local_detection_image_path())
        self.logger.info("  END FaceDetection")
예제 #2
0
class CameraOperator():
    def __init__(self):
        self.logger = LoggerFactory()

    def init_camera(self):
        if PI_CAMERA_USED:
            print("Picamera cannot be launch on windows")
            raise Exception("Picamera cannot be launch on windows")
        # COnfiguration for Raspberry
        # camera = PiCamera()
        # camera.resolution = tuple(conf["resolution"])
        # camera.framerate = conf["fps"]
        # rawCapture = PiRGBArray(camera, size=tuple(conf["resolution"]))
        else:
            self.camera = cv2.VideoCapture(CAMERA_PORT)
        time.sleep(CAMERA_WARMUP_TIME)

    def release_camera(self):
        self.camera.release()
        cv2.destroyAllWindows()

    def grab_frame(self):
        grabbed, frame = self.camera.read()
        if not grabbed:
            self.logger.error("Camera didn't grab a frame, raising error")
            raise Exception("Camera didn't grab a frame, raising error")
        return frame

    def show_video(self, frame):
        cv2.imshow("Security Feed", frame)
class AzureLargeGroupTrainer():
    def __init__(self):
        self.logger = LoggerFactory()
        self.largeGroupClient = AzureLargeGroupsClient()
        self.nnFilesRepo = NeuralNetworkFileRepository()
        self.nnTypes = NeuralNetworkTypes()

    def train_large_group(self, request_id, name, people_with_image_paths):
        try:
            start = time.time()
            self.largeGroupClient.create_large_group(request_id, name)
            people_ids = set(
                person_id for person_id, image_path in people_with_image_paths)
            people_dictionary = {}
            for person_id in people_ids:
                person_in_group_id = self.largeGroupClient.create_person_in_large_group(
                    request_id, person_id)
                people_dictionary[f'{person_id}'] = person_in_group_id
            for person_id, image_path in people_with_image_paths:
                group_person_id = people_dictionary[f'{person_id}']
                self.largeGroupClient.add_face_to_person_in_large_group(
                    group_person_id, request_id, image_path)
            self.largeGroupClient.train_large_group(request_id)
            end = time.time()
            file_size = '0'
            neural_network_file_entity = NeuralNetworkFile(
                str(request_id), request_id, self.nnTypes.azure_large_group_id,
                str(end - start), '1>', file_size, str(people_dictionary))
            # people dictionary may become problematic when group is very big
            self.nnFilesRepo.add_neural_network_file(
                neural_network_file_entity)

        except Exception as ex:
            self.logger.error(
                f"Exception when creating Azure Large Group. Exception: {ex}")
예제 #4
0
class Dht11Reader:
    def __init__(self):
        self.logger = LoggerFactory()
        gpio.setmode(gpio.BCM)

    def get_readings(self):
        self.logger.info(f"Reading value from dht11")
        try:
            self.logger.info(f"read value here")
        except Exception as ex:
            self.logger.error(f"Error '{ex}' when reading value from DHT11")
예제 #5
0
class Tester:
    def __init__(self):
        self.logger = LoggerFactory()
        self.imagesProvider = PeopleImagesProvider()
        self.recognizersProvider = FaceRecognizerProvider()
        self.openCvRecognizer = OpenCvFaceRecognizerForTesting()
        self.azureRecognizer = AzureFaceRecognizer()
        self.faceDetector = FaceDetectorsManager()
        self.neuralNetworkToUse = 44

    def test_all_photos(self):
        azure_counter = 0
        fisher_counter = 0
        eigen_counter = 0
        lbph_counter = 0
        faces = 0
        all_photos_with_people = self.imagesProvider.get_image_paths_for_people(
            range(2, 102), 20)
        fisher, eigen, lbph = self.recognizersProvider.create_open_cv_face_recognizers_with_type(
            self.neuralNetworkToUse)
        self.logger.info("test")
        for person_id, person_image in all_photos_with_people:
            faces = faces + 1
            azure_result = 0
            fisher_result = 0
            eigen_result = 0
            lbph_result = 0
            try:
                azure_result = self.azureRecognizer.recognize_face_without_db(
                    18, person_image)
                fisher_result = self.openCvRecognizer.recognize_with_single_recognizer_with_dnn(
                    fisher, person_image)
                eigen_result = self.openCvRecognizer.recognize_with_single_recognizer_with_dnn(
                    eigen, person_image)
                lbph_result = self.openCvRecognizer.recognize_with_single_recognizer_with_dnn(
                    lbph, person_image)
            except Exception as exception:
                self.logger.error(exception)
            if person_id == int(azure_result):
                azure_counter = azure_counter + 1
            if person_id == fisher_result:
                fisher_counter = fisher_counter + 1
            if person_id == eigen_result:
                eigen_counter = eigen_counter + 1
            if person_id == lbph_result:
                lbph_counter = lbph_counter + 1
            self.logger.info(
                f"FACES: {faces} Azure: {azure_counter} Fisher: {fisher_counter}"
                f" Eigen: {eigen_counter} LBPH: {lbph_counter}")
class TrainingDataProvider():
    def __init__(self):
        self.logger = LoggerFactory()
        self.faceDetector = DnnFaceDetector()
        self.imageConverter = ImageConverter()
        self.face_samples = []
        self.ids = []

    def get_training_data_for_neural_network(self, request_id: int,
                                             people_with_image_paths):
        self.logger.info(
            f"Preparing training data for NeuralNetwork request : {request_id}"
        )
        self.face_samples.clear()
        self.ids.clear()
        for person_id, person_image in people_with_image_paths:
            self.__extract_training_data__(person_image, person_id)
        self.logger.info(f"face_samples:\n {self.face_samples}"
                         f"\nids: {self.ids}")
        self.logger.info(
            f"Preparing training data for NeuralNetwork request : {request_id} FINISHED"
        )
        return self.face_samples, np.array(self.ids)

    def __extract_training_data__(self, image_path, person_id):
        self.logger.info(image_path)
        open_cv_image = cv2.imread(image_path)
        faces = []
        try:
            faces = self.faceDetector.run_detector(open_cv_image)
        except Exception as ex:
            self.logger.info(
                f"Exception when extracting data from {image_path}. Ex: {ex}")
        if len(faces) is not 0:
            self.__add_sample__(faces, open_cv_image, person_id)

    def __add_sample__(self, faces, open_cv_image, person_id):
        try:
            (startX, startY, endX, endY) = faces[0]
            cropped_image = open_cv_image[startY:endY, startX:endX]
            np_image = self.imageConverter.convert_to_np_array(cropped_image)
            self.face_samples.append(np_image)
            self.ids.append(person_id)
        except Exception as exception:
            self.logger.error(
                f"Exception when converting to np array.Ex {exception}")
class NeuralNetworkTrainingRunner():
    def __init__(self):
        self.logger = LoggerFactory()
        self.peopleManager = PeopleDownloader()
        self.nnManager = NeuralNetworkRequestsManager()
        self.nnRepo = NeuralNetworkRepository()

    @exception
    def run_training(self):
        self.logger.info("  START NeuralNetworkTraining")
        requests = self.nnRepo.get_all_not_completed()
        if not requests == null and requests.count() is not 0:
            self.peopleManager.download_people_to_local()
            for request in requests:
                try:
                    self.nnManager.process_request(request)
                except Exception as ex:
                    self.logger.error(f"Exception when processing neural network training {request.id}.\n Error: {str(ex)}")
                    self.nnRepo.complete_with_error(request.id)
        self.logger.info("  END NeuralNetworkTraining")
class AzureLargeGroupTester:
    def __init__(self):
        self.logger = LoggerFactory()
        self.cfClient = CognitiveClient()

    def run_program(self):
        self.logger.info("START CleanUp")
        number = 1
        while True:
            try:
                self.logger.info(f"Deleting large group with id {number}")
                self.cfClient.delete_large_person_group(number)
                number = number + 1
            except Exception as ex:
                number = number + 1
                self.logger.error(ex)
        self.logger.info("END CleanUp")

    def check_name(self):
        self.logger.info("START CleanUp")
        res = self.cfClient.get_person_name(
            4, 'f6a55407-1bb7-49f2-976d-a1fc58d52127')
        self.logger.info(res)
        self.logger.info("END CleanUp")

    def check_status(self):
        self.logger.info("START checkstatus")
        res = self.cfClient.get_large_group_status(8)
        self.logger.info(res)
        self.logger.info("END checkstatus")

    def get_azure_group(self):
        self.logger.info("START checkstatus")
        res = self.cfClient.get_large_group(6)
        self.logger.info(res)
        self.logger.info("END checkstatus")
class FaceRecognitionProcess():
    def __init__(self):
        self.logger = LoggerFactory()
        self.config = ConfigReader()
        self.faceRecognitionManager = RecognitionRequestManager()
        self.faceRecognitionRepo = FaceRecognitionRepository()
        self.neuralNetworksManager = NeuralNetworksProvider()

    @exception
    def run_face_recognition(self):
        self.logger.info("  START FaceRecognition")
        requests = self.faceRecognitionRepo.get_all_not_completed()
        if not requests == null and requests.count() is not 0:
            self.neuralNetworksManager.download_neural_networks_to_local()
            for request in requests:
                try:
                    self.faceRecognitionManager.process_request(request)
                    self.faceRecognitionRepo.complete_request(request.id)
                except Exception as ex:
                    self.logger.error(
                        f"Exception when processing recognition {request.id}.\n Error: {str(ex)}"
                    )
                    self.faceRecognitionRepo.complete_with_error(request.id)
        self.logger.info("  END FaceRecognition")
예제 #10
0
class AzureFaceClient():
    def __init__(self):
        self.cognitiveClient = CognitiveClient()
        self.resultsConverter = ResultsConverter()
        self.logger = LoggerFactory()

    def get_face_rectangles(self, image_path):
        self.logger.info(f"Getting face rectangles for image {image_path}")
        try:
            result = self.cognitiveClient.detect_faces(image_path)
            faces = self.resultsConverter.get_face_rectangles_from_result(
                result)
            return faces
        except CognitiveFaceException as exp:
            self.logger.error(
                f'Exception when sending face detection request. Response: {exp.code}. {exp.msg}'
            )

    def get_face_ids(self, path):
        self.logger.info(f"Getting face ids for image {path}")
        try:
            result = self.cognitiveClient.detect_faces(path)
            faces = self.resultsConverter.get_face_ids_from_result(result)
            return faces
        except CognitiveFaceException as exp:
            self.logger.error(
                f'Exception when sending face detection request. Response: {exp.code}. {exp.msg}'
            )

    def get_faces_identity(self, faces_ids, large_group_id):
        self.logger.info(f"Getting faces identity for faces_ids {faces_ids}")
        try:
            result = self.cognitiveClient.identify_faces(
                faces_ids, large_group_id)
            azure_faces_identities = self.resultsConverter.get_face_identities_from_result(
                result)
            return azure_faces_identities
        except CognitiveFaceException as exp:
            self.logger.error(
                f'Exception when sending identify face request. Response: {exp.code}. {exp.msg}'
            )
예제 #11
0
class NeuralNetworkTypes:
    def __init__(self):
        self.logger = LoggerFactory()

    @property
    def lbph(self):
        return "LBPH"

    @property
    def eigen(self):
        return "Eigen"

    @property
    def fisher(self):
        return "Fisher"

    @property
    def azure_large_group(self):
        return "AzureLargeGroup"

    @property
    def lbph_id(self):
        return 1

    @property
    def eigen_id(self):
        return 2

    @property
    def fisher_id(self):
        return 3

    @property
    def azure_large_group_id(self):
        return 4

    def get_type_id(self, nn_type_name: str):
        if nn_type_name.lower() == self.lbph.lower():
            return self.lbph_id
        elif nn_type_name.lower() == self.eigen.lower():
            return self.eigen_id
        elif nn_type_name.lower() == self.fisher.lower():
            return self.fisher_id
        elif nn_type_name.lower() == self.azure_large_group.lower():
            return self.azure_large_group_id
        else:
            raise Exception(
                f"Wrong nn_type_name. Cant find a match for : {nn_type_name}")

    def get_type_name(self, nn_type_id: int):
        if nn_type_id is self.lbph_id:
            return self.lbph
        elif nn_type_id is self.fisher_id:
            return self.fisher
        elif nn_type_id is self.eigen_id:
            return self.eigen
        elif nn_type_id is self.azure_large_group_id:
            return self.azure_large_group
        else:
            self.logger.error(f"Unknown nn_type_id: {nn_type_id}")
            return "Unknown"
class AzureLargeGroupsClient():
    def __init__(self):
        self.cognitiveClient = CognitiveClient()
        self.logger = LoggerFactory()
        self.resultsConverter = ResultsConverter()

    def create_large_group(self, request_id: int, name: str):
        self.logger.info(
            f"Creating Azure LargePersonGroup with id: {request_id}, name : {name} at {datetime.datetime.now()}"
        )
        try:
            self.cognitiveClient.create_large_group(request_id, name)
        except Exception as ex:
            self.logger.error(f"Exception when creating large group. Ex: {ex}")
            raise

    def create_person_in_large_group(self, large_group_id, person_name):
        self.logger.info(
            f"Creating person: {person_name} in large group: {large_group_id}")
        try:
            res = self.cognitiveClient.create_person_in_large_group(
                large_group_id, person_name)
            person_id = res['personId']
            return person_id
        except Exception as ex:
            self.logger.error(
                f"Exception when creating person in large group. Ex: {ex}")
            raise

    def add_face_to_person_in_large_group(self, person_id, large_group_id,
                                          image_path):
        self.logger.info(
            f"Adding image {image_path} to person {person_id} in large group {large_group_id}"
        )
        try:
            self.cognitiveClient.add_face_to_person_in_large_group(
                person_id, large_group_id, image_path)
        except self.cognitiveClient.client.CognitiveFaceException as ex:
            self.logger.error(
                f"Exception when adding face from {image_path}.Process will continue. Ex: {ex}"
            )
            if not (ex.status_code == 400 and ex.code == 'InvalidImage'):
                raise
        except Exception as ex:
            self.logger.error(
                f"Exception when adding face to person in large group. ImagePath: {image_path}. Ex: {ex}"
            )
            raise

    def train_large_group(self, large_group_id):
        self.logger.info(
            f"Starting training of azure large group id: {large_group_id} at: {datetime.datetime.now()}"
        )
        try:
            self.cognitiveClient.train_large_group(large_group_id)
        except Exception as ex:
            self.logger.error(f"Exception when training large group. Ex: {ex}")
            raise

    def get_large_group_status(self, large_group_id):
        self.logger.info(
            f"Checking status of large group id: {large_group_id}")
        try:
            res = self.cognitiveClient.get_large_group_status(large_group_id)
            self.logger.info(f"Azure NN status :{res}")
            return res
        except Exception as ex:
            self.logger.error(
                f"Exception when checking large group status. Ex: {ex}")
            raise

    def get_person_in_large_group_name(self, large_group_id,
                                       person_specific_number):
        self.logger.info(
            f"Checking Name of person in large group :{large_group_id} under id :{person_specific_number}"
        )
        try:
            res = self.cognitiveClient.get_person_name(large_group_id,
                                                       person_specific_number)
            self.logger.info(f"Person name :{res['name']}")
            return res['name']
        except Exception as ex:
            self.logger.error(
                f"Exception when getting name of person in large group. Ex: {ex}"
            )
            raise