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}
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)))
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
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
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))
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))
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)