Example #1
0
    def append_to_face_group(self, fg_name, img, label):
        img = np.array(img)
        obj = self.encode(img)
        faces = obj.get('detections', [])

        if len(faces) == 0:
            return AccessException('No face found', error_code=400)
        elif len(faces) > 1:
            return AccessException('More than one face found', error_code=400)
        else:
            embedding = obj['embeddings'][0]
            face_id = self.fg_manager.append_to_face_group(fg_name, embedding, label)
            return {'face_id': face_id}
Example #2
0
 def _delete_face_group(self, fg_name):
     with self.io_lock:
         file_path = self.get_file_path(fg_name)
         try:
             del self.face_group_store[fg_name]
             os.remove(file_path)
         except Exception as ex:
             raise AccessException('Could not delete {}. Error {}'.format(
                 file_path, str(ex)))
Example #3
0
    def _get_face_group(self, fg_name):
        with self.io_lock:
            fg = self.face_group_store.get(fg_name)
            if fg is not None:
                return self.face_group_store.get(fg_name)
            else:
                file_path = self.get_file_path(fg_name)

                try:
                    fg = np.load(file_path)
                except IOError as ioe:
                    raise AccessException(str(ioe))
                except ValueError as ve:
                    raise AccessException(str(ve))

                fg = FaceGroup(fg['faceIds'], fg['embeddings'], fg['labels'])
                self.face_group_store[fg_name] = fg
                return fg
Example #4
0
    def _save_face_group(self, fg_name, fg, overwrite=True):

        file_path = self.get_file_path(fg_name)
        if os.path.exists(file_path) and overwrite is False:
            raise AccessException(
                "FaceGroup {} already exists.".format(fg_name), error_code=409)

        with self.io_lock:
            savez_compressed(file_path,
                             faceIds=fg.faceIds,
                             embeddings=fg.embeddings,
                             labels=fg.labels)
            self.face_group_store[fg_name] = fg
Example #5
0
    async def append_to_face_group(request):

        req_json = request.json

        received_keys = req_json.keys()
        required_keys = ['face_group']
        validate_request_keys(received_keys, required_keys)

        if 'face_group' not in required_keys:
            raise AccessException('face_group is required', 400)

        face_group = req_json['face_group']
        label = req_json['label']
        img_bytes = base64.decodebytes(req_json['image'].encode('utf-8'))
        img = Image.frombytes('RGB', (req_json['width'], req_json['height']),
                              img_bytes, 'raw')
        return await handle_request(afv.append_to_face_group,
                                    *(face_group, img, label))
Example #6
0
    def delete_from_face_group(self, face_id, fg_name):

        fg = self._get_face_group(fg_name)

        delete_index = np.where(fg.faceIds == face_id)

        if len(delete_index) > 0:
            delete_index = delete_index[0]
            faceIds = np.delete(fg.faceIds, delete_index, axis=0)
            embeddings = np.delete(fg.embeddings, delete_index, axis=0)
            labels = np.delete(fg.labels, delete_index, axis=0)

            fg.faceIds = faceIds
            fg.embeddings = embeddings
            fg.labels = labels

            self._save_face_group(fg_name, fg)
            return fg

        else:
            raise AccessException('faceId not found: {}'.format(face_id))
Example #7
0
    def validate_request_keys(received_keys, required_keys):

        for key in required_keys:
            if key not in received_keys:
                raise AccessException('{} is required.'.format(key),
                                      error_code=400)