- use for Detection, Facial Expression, Age & Gender Estimation and Recognition with PyTorch
- this repository works with CPU and GPU(Cuda)
Authors -> https://github.com/sajjjadayobi/FaceLib
- add some new features
- add default argument for all functions and classes
- automatic download weight files into codes
- an example jupyter notebooks
- fix some bugs
- Webcam Classes
- WebcamVerifier
- WebcamFaceDetector
- WebcamAgeGenderEstimator
- WebcamEmotionDetector
- Clone and install with this command:
-
with pip and automatic installs everything all you need
pip install git+https://github.com/idini/FaceLib.git
-
or with cloning the repo and install required packages
git clone https://github.com/idini/FaceLib.git
-
- you can see the required packages in requirements.txt
- the simplest way is at example_notebook.ipynb
- for low-level usage check out the following sections
- if you have an NVIDIA GPU don't change the device param if not use
cpu
- you can use these backbone networks: Resnet50, mobilenet
- default weights and model is
mobilenet
and it will be automatically download
- default weights and model is
- for more details, you can see the documentation
- The following example illustrates the ease of use of this package:
from facelib import FaceDetector
detector = FaceDetector()
boxes, scores, landmarks = detector.detect_faces(image)
- FaceDetection live on your webcam
from facelib import WebcamFaceDetector
detector = WebcamFaceDetector()
detector.run()
- you can check or change it Face Detector
Style | easy | medium | hard |
---|---|---|---|
Pytorch (same parameter with Mxnet) | 88.67% | 87.09% | 80.99% |
Pytorch (original image scale) | 90.70% | 88.16% | 73.82% |
Mxnet(original image scale) | 89.58% | 87.11% | 69.12% |
- always use detect_align it gives you better performance
- you can use this module like this:
detect_align
instead ofdetect_faces
from facelib import FaceDetector
detector = FaceDetector()
faces, boxes, scores, landmarks = detector.detect_align(image)
- for more details read detect_image function documentation
- let's see a few examples
Original | Aligned & Resized | Original | Aligned & Resized |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- I used UTKFace DataSet for Age & Gender Estimation
- default weights and model is
ShufflenetFull
and it will be automatically download
- default weights and model is
- you can use this module like this:
from facelib import FaceDetector, AgeGenderEstimator
face_detector = FaceDetector()
age_gender_detector = AgeGenderEstimator()
faces, boxes, scores, landmarks = face_detector.detect_align(image)
genders, ages = age_gender_detector.detect(faces)
print(genders, ages)
- AgeGenderEstimation live on your webcam
from facelib import WebcamAgeGenderEstimator
estimator = WebcamAgeGenderEstimator()
estimator.run()
- Facial Expression Recognition using Residual Masking Network
- default weights and model is
densnet121
and it will be automatically download
- default weights and model is
- face size must be (224, 224), you can fix it in FaceDetector init function with face_size=(224, 224)
from facelib import FaceDetector, EmotionDetector
face_detector = FaceDetector(face_size=(224, 224))
emotion_detector = EmotionDetector()
faces, boxes, scores, landmarks = face_detector.detect_align(image)
list_of_emotions, probab = emotion_detector.detect_emotion(faces)
print(list_of_emotions)
- EmotionDetector live on your webcam
from facelib import WebcamEmotionDetector
detector = WebcamEmotionDetector()
detector.run()
- on my Webcam 🙂
- This module is a reimplementation of Arcface(paper), or Insightface(Github)
- IR-SE50
LFW(%) | CFP-FF(%) | CFP-FP(%) | AgeDB-30(%) | calfw(%) | cplfw(%) | vgg2_fp(%) |
---|---|---|---|---|---|---|
0.9952 | 0.9962 | 0.9504 | 0.9622 | 0.9557 | 0.9107 | 0.9386 |
- Mobilefacenet
LFW(%) | CFP-FF(%) | CFP-FP(%) | AgeDB-30(%) | calfw(%) | cplfw(%) | vgg2_fp(%) |
---|---|---|---|---|---|---|
0.9918 | 0.9891 | 0.8986 | 0.9347 | 0.9402 | 0.866 | 0.9100 |
-
the faces images you want to detect it save them in this folder:
Insightface/models/data/facebank/ ---> person_1/ ---> img_1.jpg ---> img_2.jpg ---> person_2/ ---> img_1.jpg ---> img_2.jpg
-
you can save a new preson in facebank with 3 ways:
- use
add_from_webcam
: it takes 4 images and saves them on facebank
from facelib import add_from_webcam add_from_webcam(person_name='sajjad')
- use
add_from_folder
: it takes a path with some images from just a person
from facelib import add_from_folder add_from_folder(folder_path='./', person_name='sajjad')
- or add faces manually (just face of a person not image of a person)
- I don't suggest this
- use
- default weights and model is
mobilenet
and it will be automatically download
import cv2
from facelib import FaceRecognizer, FaceDetector
from facelib import update_facebank, load_facebank, special_draw, get_config
conf = get_config()
detector = FaceDetector()
face_rec = FaceRecognizer(conf)
face_rec.model.eval()
# set True when you add someone new
update_facebank_for_add_new_person = False
if update_facebank_for_add_new_person:
targets, names = update_facebank(conf, face_rec.model, detector)
else:
targets, names = load_facebank(conf)
image = cv2.imread(your_path)
faces, boxes, scores, landmarks = detector.detect_align(image)
results, score = face_rec.infer(conf, faces, targets)
print(names[results.cpu()])
for idx, bbox in enumerate(boxes):
special_draw(image, bbox, landmarks[idx], names[results[idx]+1], score[idx])
- Face Recognition live on your webcam
from facelib import WebcamVerify
verifier = WebcamVerify(update=True)
verifier.run()
- example of run this code:
- Author : Sajjad Ayoubi
- Title : FaceLib
- Year = 2021