From ea5d9d32eb4d5cbce4f5aae3d907cbf3bace32fb Mon Sep 17 00:00:00 2001 From: Rodrigo Andrade Date: Sun, 8 May 2022 21:19:32 -0300 Subject: [PATCH 1/6] updated requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 48b8aec..240fb8c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ pandas>=0.23.4 gdown>=3.10.1 tqdm>=4.30.0 Pillow>=5.2.0 -opencv-python>=4.2.0.34 +opencv-python>=4.5.0.34 opencv-contrib-python>=4.3.0.36 tensorflow>=1.9.0 keras>=2.2.0 From f74e944dc66a7b984b64edd629f35ac26a4b9134 Mon Sep 17 00:00:00 2001 From: Rodrigo Andrade Date: Sun, 8 May 2022 21:19:41 -0300 Subject: [PATCH 2/6] sface wrapper --- deepface/basemodels/sface_opencv_wrapper.py | 55 +++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 deepface/basemodels/sface_opencv_wrapper.py diff --git a/deepface/basemodels/sface_opencv_wrapper.py b/deepface/basemodels/sface_opencv_wrapper.py new file mode 100644 index 0000000..3c6ea0e --- /dev/null +++ b/deepface/basemodels/sface_opencv_wrapper.py @@ -0,0 +1,55 @@ +import os + +import cv2 as cv +import gdown + +from deepface.commons import functions + +_url = "https://github.com/opencv/opencv_zoo/raw/master/models/face_recognition_sface/face_recognition_sface_2021dec.onnx" + + +class _Layer: + input_shape = (None, 112, 122, 3) + + +class SFace: + def __init__(self, model_path, backend_id=0, target_id=0): + self._modelPath = model_path + self._backendId = backend_id + self._targetId = target_id + self._model = cv.FaceRecognizerSF.create( + model=self._modelPath, + config="", + backend_id=self._backendId, + target_id=self._targetId) + + self.layers = [_Layer()] + + def _preprocess(self, image, bbox): + if bbox is None: + return image + else: + return self._model.alignCrop(image, bbox) + + def predict(self, image, bbox=None, **kwargs): + # Preprocess + # print(image.max()) + # input_blob = self._preprocess(image, bbox) + + # Forward + features = self._model.feature(image[0]) + return features + + +def load_model(*args, **kwargs): + home = functions.get_deepface_home() + + file_name = home + '/.deepface/weights/face_recognition_sface_2021dec.onnx' + if not os.path.isfile(file_name): + print("sface weights will be downloaded...") + + output = file_name + gdown.download(_url, output, quiet=False) + + model = SFace(file_name, 0, 0) + return model From 9852bbe48236dfa79689e15cdc047297a4c07de4 Mon Sep 17 00:00:00 2001 From: Rodrigo Andrade Date: Sun, 8 May 2022 21:19:52 -0300 Subject: [PATCH 3/6] added sface --- deepface/DeepFace.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deepface/DeepFace.py b/deepface/DeepFace.py index dade599..543bcb2 100644 --- a/deepface/DeepFace.py +++ b/deepface/DeepFace.py @@ -12,7 +12,8 @@ import pandas as pd from tqdm import tqdm import pickle -from deepface.basemodels import VGGFace, OpenFace, Facenet, Facenet512, FbDeepFace, DeepID, DlibWrapper, ArcFace, Boosting +from deepface.basemodels import VGGFace, OpenFace, Facenet, Facenet512, FbDeepFace, DeepID, DlibWrapper, ArcFace, \ + Boosting, sface_opencv_wrapper from deepface.extendedmodels import Age, Gender, Race, Emotion from deepface.commons import functions, realtime, distance as dst @@ -46,6 +47,7 @@ def build_model(model_name): 'DeepID': DeepID.loadModel, 'Dlib': DlibWrapper.loadModel, 'ArcFace': ArcFace.loadModel, + 'SFace': sface_opencv_wrapper.load_model, 'Emotion': Emotion.loadModel, 'Age': Age.loadModel, 'Gender': Gender.loadModel, From a5ecdc1d8cf854a8725e6ee8f539af400899bf0b Mon Sep 17 00:00:00 2001 From: Rodrigo Andrade Date: Sun, 8 May 2022 21:27:42 -0300 Subject: [PATCH 4/6] use preprocessing from opencv --- deepface/basemodels/sface_opencv_wrapper.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/deepface/basemodels/sface_opencv_wrapper.py b/deepface/basemodels/sface_opencv_wrapper.py index 3c6ea0e..d28444b 100644 --- a/deepface/basemodels/sface_opencv_wrapper.py +++ b/deepface/basemodels/sface_opencv_wrapper.py @@ -1,5 +1,6 @@ import os +import numpy as np import cv2 as cv import gdown @@ -33,11 +34,11 @@ class SFace: def predict(self, image, bbox=None, **kwargs): # Preprocess - # print(image.max()) - # input_blob = self._preprocess(image, bbox) + image = (image[0] * 255).astype(np.uint8) # revert the iamge to original format and preprocess using the model + input_blob = self._preprocess(image, bbox) # Forward - features = self._model.feature(image[0]) + features = self._model.feature(input_blob) return features From 1d18013978e77805bf25164053fea18e259fce10 Mon Sep 17 00:00:00 2001 From: Rodrigo Andrade Date: Sun, 8 May 2022 21:27:56 -0300 Subject: [PATCH 5/6] fix typo --- deepface/basemodels/sface_opencv_wrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepface/basemodels/sface_opencv_wrapper.py b/deepface/basemodels/sface_opencv_wrapper.py index d28444b..8d97ff1 100644 --- a/deepface/basemodels/sface_opencv_wrapper.py +++ b/deepface/basemodels/sface_opencv_wrapper.py @@ -34,7 +34,7 @@ class SFace: def predict(self, image, bbox=None, **kwargs): # Preprocess - image = (image[0] * 255).astype(np.uint8) # revert the iamge to original format and preprocess using the model + image = (image[0] * 255).astype(np.uint8) # revert the image to original format and preprocess using the model input_blob = self._preprocess(image, bbox) # Forward From 3c0d84e34b2d610770297d6e19bda75678262a45 Mon Sep 17 00:00:00 2001 From: Rodrigo Andrade Date: Sun, 8 May 2022 21:35:25 -0300 Subject: [PATCH 6/6] fix input shape size --- deepface/basemodels/sface_opencv_wrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepface/basemodels/sface_opencv_wrapper.py b/deepface/basemodels/sface_opencv_wrapper.py index 8d97ff1..2cca4a1 100644 --- a/deepface/basemodels/sface_opencv_wrapper.py +++ b/deepface/basemodels/sface_opencv_wrapper.py @@ -10,7 +10,7 @@ _url = "https://github.com/opencv/opencv_zoo/raw/master/models/face_recognition_ class _Layer: - input_shape = (None, 112, 122, 3) + input_shape = (None, 112, 112, 3) class SFace: