From 7a5aa2a656f1b82379b5e4262b3da528526baf43 Mon Sep 17 00:00:00 2001 From: DiaosWang <2054377007@qq.com> Date: Tue, 21 May 2024 09:24:23 +0800 Subject: [PATCH] add func updateFaceDB and apply enum to func --- proj_deepface/ade20k.jpg | Bin 46288 -> 0 bytes .../face/ds_ghostfacenet_opencv_v2.pkl | Bin 23674 -> 28482 bytes .../face/ds_ghostfacenet_retinaface_v2.pkl | Bin 6 -> 28393 bytes proj_deepface/main.py | 345 ++++++++++++++++++ proj_deepface/realtime.py | 11 +- 5 files changed, 351 insertions(+), 5 deletions(-) delete mode 100644 proj_deepface/ade20k.jpg create mode 100644 proj_deepface/main.py diff --git a/proj_deepface/ade20k.jpg b/proj_deepface/ade20k.jpg deleted file mode 100644 index 70f45b0118d9cfe7217fcd72104a5ebecf553e71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46288 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 Jedm9N{tx+&wQc|a diff --git a/proj_deepface/face/ds_ghostfacenet_opencv_v2.pkl b/proj_deepface/face/ds_ghostfacenet_opencv_v2.pkl index 4e3ee6d361260efe39d7f2046b1deccadf09f618..8534362229bd0faaea021d678e211ee5d8e61de3 100644 GIT binary patch delta 5092 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 Z@SRPY#NDQE#T%QBi9bg7c-hPz{|_0;Z^!@u literal 6 NcmZo*jxA)+0{{jJ0e}Di diff --git a/proj_deepface/main.py b/proj_deepface/main.py new file mode 100644 index 0000000..2fa8b3f --- /dev/null +++ b/proj_deepface/main.py @@ -0,0 +1,345 @@ +from deepface import DeepFace +import cv2 +import time +import os +import sys +import numpy as np +import re +import pandas as pd +from typing import Union +import base64 +from enum import Enum +import requests + +from deepface.modules.streaming import ( + build_demography_models, build_facial_recognition_model, + search_identity, highlight_facial_areas, + grab_facial_areas, extract_facial_areas, + perform_facial_recognition, perform_demography_analysis, +) + +from deepface.modules import recognition, verification, detection, representation +from deepface.models.FacialRecognition import FacialRecognition +from deepface.modules import preprocessing +from deepface.commons.logger import Logger +import pickle + +db_path = "./face" +detector_backend = "opencv" +distance_metric = "euclidean_l2" +model_name = "GhostFaceNet" +model: FacialRecognition = DeepFace.build_model(model_name=model_name) +target_size = model.input_shape +threshold = verification.find_threshold(model_name, distance_metric) + +class Opt(Enum): + ADD = 1 + DELETE = 2 + CHANGE = 3 + SEARCH = 4 + +class Ftype(Enum): + NDARRAY = 0 + PATH = 1 + BASE64 = 2 + URL = 3 + +class Status(Enum): + SUCCESS = 1 # 成功 + HTTP_ERROR = "http error" # http 检索报错 + DELETE_FINISH = "delete finished" + BASE64_EMPTY = "base64 is empty" + NotImplementedError = "Not Implemented Error" + ADD_HAS_EXISTED = "when adding, file has existed" + +GLOBAL_DICT = { + "Opt.ADD": Opt.ADD, + "Opt.DELETE":Opt.DELETE, + "Opt.CHANGE":Opt.CHANGE, + "Opt.SEARCH":Opt.SEARCH, + + "Ftype.NDARRAY": Ftype.NDARRAY, + "Ftype.PATH":Ftype.PATH, + "Ftype.BASE64":Ftype.BASE64, + "Ftype.URL":Ftype.URL +} + + +def get_facial_areas( + img: np.ndarray, detector_backend: str, target_size, +): + """ + Find facial area coordinates in the given image + Args: + img (np.ndarray): image itself + detector_backend (string): face detector backend. Options: 'opencv', 'retinaface', + 'mtcnn', 'ssd', 'dlib', 'mediapipe', 'yolov8' (default is opencv). + target_size (tuple): input shape of the facial recognition model. + Returns + result (list): list of tuple with x, y, w and h coordinates + detected_face + descriptions + """ + print("get facial areas, img.shape: ", img.shape) + beg = time.time() + try: + face_objs = detection.extract_faces( + img_path=img, + target_size=target_size, + detector_backend=detector_backend, + enforce_detection=True, + align=True, + expand_percentage=0, + grayscale=False, + human_readable=False, + ) + + print("detection.extract_faces. use time: ", time.time()-beg ) + beg = time.time() + + faces_coordinates = [ + ( + face_obj["facial_area"]["x"], + face_obj["facial_area"]["y"], + face_obj["facial_area"]["w"], + face_obj["facial_area"]["h"], + ) + for face_obj in face_objs + # if face_obj["facial_area"]["w"] > threshold + ] + faces = [ face_obj["face"] for face_obj in face_objs ] + descriptions = [] + for x,y,w,h in faces_coordinates: + if min(w,h)<40: + descriptions.append(f"width={w}, height={h}. the face is too small, please upload bigger face.") + else: + descriptions.append("success") + return faces_coordinates, faces, descriptions + except: # to avoid exception if no face detected + return [], [], ["no face detected. Blurry Image, Non-frontal View or Face Pixels too small?"] + +def process_img(img, img_mode: Ftype): + target_img = None + if img_mode == Ftype.NDARRAY: # np.ndarray格式 + target_img = img + elif img_mode == Ftype.PATH: # img path + target_img = cv2.imread(img) + elif img_mode == Ftype.BASE64: # base64 + encoded_data_parts = img.split(",") + if len(encoded_data_parts) <= 0: + # raise "base64 is empty" + return Status.BASE64_EMPTY + encoded_data = encoded_data_parts[-1] + nparr = np.fromstring(base64.b64decode(encoded_data), np.uint8) + target_img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) + elif img_mode == Ftype.URL: # url + try: + # response = requests.get(url=img,stream=True,timeout=60) + response = requests.get(url=img, stream=True, timeout=60, proxies={"http": None, "https": None}) + response.raise_for_status() + image_array = np.asarray(bytearray(response.raw.read()), dtype=np.uint8) + target_img = cv2.imdecode(image_array, cv2.IMREAD_COLOR) + except requests.HTTPError as http_err: + # print(f"HTTP error occurred: {http_err}") # 输出 HTTP 错误信息 + return Status.HTTP_ERROR + else: + return Status.NotImplementedError + + return target_img + +# interface 1: update face db. add / remove /change imgs. 我们输出的都是`bgr`颜色空间 +def updateFaceDB(img: Union[str, np.ndarray], img_name: str, img_mode: Ftype, opt_mode: Opt ): + """ + description: in db_path, we just store `.jpg`, other Image format will be changed to `.jpg` + args: + - img: str or np.ndarray + - img_name: str + - img_mode: 0 np.ndarray; 1 img_path 2 base64 + - opt_mode: 0 add; 1 delete; 2 change + ret: + - retjson: dict. + """ + retjson = { + "status": None, # 入库成功 1 or 失败 0 + "detected_img": None, + "description": "None", + } + if opt_mode == Opt.DELETE: #delete + try: + os.remove(os.path.join(db_path, img_name+'.jpg')) + except FileNotFoundError: + pass + return Status.DELETE_FINISH + + ret = process_img(img, img_mode) + if isinstance(ret, Status): + return ret + else: + target_img = ret + + face_coors, detected_faces, descriptions = get_facial_areas(target_img, detector_backend, target_size) + detected_img = target_img.copy() + for x,y,w,h in face_coors: + cv2.rectangle(detected_img, (x,y),(x+w,y+h),(255,0,0),3) + success, encoded_detected_img = cv2.imencode('.png', detected_img) + if success: + detected_img_base64 = base64.b64encode(encoded_detected_img).decode("utf-8") + if len(face_coors) >= 2: + retjson.update({"status": 0, "detected_img": detected_img_base64 , "description": "too many faces, cannot select which one" }) # too many face + elif len(face_coors) <= 0: + retjson.update({"status": 0, "detected_img": detected_img_base64 , "description": descriptions[0]}) # no face + else: # only one face is detected + retjson.update({"status": 1 if descriptions[0] =="success" else 0 , "detected_img": detected_img_base64 , "description": descriptions[0]}) # success + + if retjson['status'] == 0: + return retjson + + db_imgs = os.listdir(db_path) + db_imgs = [db_img.split(".")[0] for db_img in db_imgs] + if opt_mode == Opt.ADD: # add + if img_name in db_imgs: + return Status.ADD_HAS_EXISTED # raise "operate is add, but db has existed the img_name" + cv2.imwrite(os.path.join(db_path, img_name+'.jpg'), target_img ) + elif opt_mode == Opt.CHANGE: # change + cv2.imwrite(os.path.join(db_path, img_name+'.jpg'), target_img ) # whether exist or not in db, save it anymore. + else: + return Status.NotImplementedError + + # update the face_db to keep latest + search_identity( # 保证database是最新的 + detected_face=np.zeros([224, 224, 3]), + db_path=db_path, + detector_backend=detector_backend, + distance_metric=distance_metric, + model_name=model_name, + ) + + return retjson + + +#interface 2: face recognition using embeddings on face_db +def faceRecog(img: Union[str,np.ndarray],img_mode: Ftype): + beg = time.time() + # keep the database is the newest + search_identity( + detected_face=np.zeros([224, 224, 3]), + db_path=db_path, + detector_backend=detector_backend, + distance_metric=distance_metric, + model_name=model_name, + ) + print("search_identity, use time: ", time.time()-beg) + beg = time.time() + + # open and read face db + file_name = f"ds_{model_name}_{detector_backend}_v2.pkl" + file_name = file_name.replace("-", "").lower() + datastore_path = os.path.join(db_path, file_name) + with open(datastore_path, "rb") as f: + db_representations = pickle.load(f) + assert len(db_representations) > 0, 'no face in database' + print(f"{len(db_representations)} faces representataion in {file_name}.") + + print("open and read face db, use time: ", time.time()-beg) + beg = time.time() + + # process the img + ret = process_img(img, img_mode) + if isinstance(ret,Status): + return ret + target_img = ret + + print("process img, use time: ", time.time()-beg) + beg = time.time() + + # begin face recognition + df = pd.DataFrame(db_representations) + labels = [] + + print("copy df, use time: ", time.time()-beg) + beg = time.time() + + face_coors, detected_faces, descriptions = get_facial_areas(target_img, detector_backend, target_size) + + print("get facial areas, use time: ", time.time()-beg) + beg = time.time() + + for idx, (x,y,w,h) in enumerate(face_coors): + detected_face = detected_faces[idx] + unknown_representation = model.find_embeddings( + preprocessing.normalize_input(img=detected_face,normalization='base') + ) + distances = [] + result_df = df.copy() + for _, instance in df.iterrows(): + source_representation = instance['embedding'] + if source_representation is None : + distances.append(float('inf')) + continue + + assert len(unknown_representation) == len(source_representation), 'wrong len of embedding ' + distance = verification.find_distance(source_representation,unknown_representation,distance_metric) + distances.append(distance) + + result_df['distance'] = distances + result_df = result_df.drop(columns=['embedding']) + result_df = result_df[result_df['distance'] < threshold] + if result_df.shape[0] <= 0: + labels.append("unknown") + else: + result_df = result_df.sort_values(by=["distance"], ascending=True).reset_index(drop=True) + target_label, min_dist = result_df.loc[0, "identity"], result_df.loc[0, "distance"] + target_label = re.split(r'[\\\/]', target_label)[-1].split('.')[0] + f" {min_dist:.4f}" + labels.append(target_label) + + print("face recognition, use time: ", time.time()-beg) + # draw the face frame for easy to view + # for label, (x,y,w,h) in zip(labels, face_coors): + for idx, (label, (x, y, w, h)) in enumerate(zip(labels, face_coors)): + color = (0,0,255) if label == 'unknown' else (255,0,0) + cv2.rectangle(target_img,(x,y),(x+w,y+h), color, 3) + cv2.putText(target_img, f"{idx}: " + label, (x,y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, color, 1) + + return labels, face_coors, target_img + + + +if __name__ == "__main__": + + """ + img = sys.argv[1] + img_name = sys.argv[2] + img_mode = GLOBAL_DICT[ sys.argv[3] ] + opt_mode = GLOBAL_DICT[ sys.argv[4] ] + + # call updateFaceDB for handling the picture + ret = updateFaceDB(img = img, + img_name = img_name, + img_mode = img_mode, + opt_mode = opt_mode, + ) + if isinstance(ret, Status): # means error happened + print(ret.value) + else: + print('ret["status"], ret["description"]: ', ret["status"], ret["description"]) + """ + + # use func to face recognition + tic = time.time() + img = sys.argv[1] + # img_name = sys.argv[2] + img_mode = GLOBAL_DICT[ sys.argv[2] ] + # opt_mode = GLOBAL_DICT[ sys.argv[4] ] + + ret = faceRecog( + img = img, + img_mode = img_mode, + ) + tec = time.time() + + print(ret[0], ret[1], tec-tic) + print("img.size = ", ret[2].shape) + cv2.imshow("res",ret[2]) + cv2.waitKey(0) + + diff --git a/proj_deepface/realtime.py b/proj_deepface/realtime.py index d189f83..db32e49 100644 --- a/proj_deepface/realtime.py +++ b/proj_deepface/realtime.py @@ -244,16 +244,16 @@ def realtime( """ Deepface is a hybrid face recognition package. It currently wraps many state-of-the-art face recognition models: -Model Declared LFW Score +model_name Declared LFW Score VGG-Face 98.9% Facenet 99.2% -Facenet512 99.6% pass +Facenet512 99.6% drop OpenFace 92.9% DeepID 97.4% Dlib 99.3% SFace 99.5% -ArcFace 99.5% 阈值调整为1.00 -GhostFaceNet 99.7% +ArcFace 99.5% 阈值调整为1.00 ** +GhostFaceNet 99.7% ** Human-beings 97.5% The default configuration uses VGG-Face model. @@ -286,4 +286,5 @@ if __name__ == "__main__": distance_metric="euclidean_l2", enable_face_analysis=False, source=0, # 流媒体来源 - ) \ No newline at end of file + ) +