DeepFace는 Python을 위한 경량 얼굴 인식 및 얼굴 속성 분석(연령, 성별, 감정, 인종) 프레임워크입니다. VGG-Face
, FaceNet
, OpenFace
, DeepFace
, DeepID
, ArcFace
, Dlib
, SFace
및 GhostFaceNet
과 같은 최첨단 모델을 포함하는 하이브리드 얼굴 인식 프레임워크입니다.
Experiments
따르면 인간은 얼굴 인식 작업에서 97.53%의 정확도를 가지고 있는 반면, 해당 모델은 이미 해당 정확도 수준에 도달하고 통과했습니다.
deepface를 설치하는 가장 쉬운 방법은 PyPI
에서 다운로드하는 것입니다. 라이브러리 자체와 필수 구성 요소도 설치됩니다.
$ pip install deepface
또는 소스 코드에서 deepface를 설치할 수도 있습니다. 소스 코드에는 아직 pip 릴리스에 게시되지 않은 새로운 기능이 있을 수 있습니다.
$ git clone https://github.com/serengil/deepface.git
$ cd deepface
$ pip install -e .
라이브러리를 설치한 후에는 해당 라이브러리를 가져와 해당 기능을 사용할 수 있습니다.
from deepface import DeepFace
현대적인 얼굴 인식 파이프라인 - Demo
최신 얼굴 인식 파이프라인은 감지, 정렬, 정규화, 표현 및 확인의 5가지 공통 단계로 구성됩니다. DeepFace는 백그라운드에서 이러한 모든 일반적인 단계를 처리하지만, 그 뒤에 있는 모든 프로세스에 대한 심층적인 지식을 얻을 필요는 없습니다. 한 줄의 코드로 확인, 찾기 또는 분석 기능을 호출할 수 있습니다.
얼굴 인증 - Demo
이 기능은 얼굴 쌍이 동일한 사람인지 다른 사람인지 확인합니다. 입력으로 정확한 이미지 경로가 필요합니다. numpy 또는 base64로 인코딩된 이미지를 전달하는 것도 환영합니다. 그런 다음 사전을 반환하고 확인된 키만 확인해야 합니다.
result = DeepFace . verify (
img1_path = "img1.jpg" ,
img2_path = "img2.jpg" ,
)
얼굴 인식 - Demo
얼굴 인식을 위해서는 얼굴 인증을 여러 번 적용해야 합니다. 여기서 deepface에는 이 작업을 처리할 수 있는 기본 찾기 기능이 있습니다. 데이터베이스 경로에서 입력 이미지의 ID를 찾고 Pandas 데이터 프레임 목록을 출력으로 반환합니다. 한편, 얼굴 데이터베이스의 얼굴 임베딩은 다음 번에 더 빠르게 검색할 수 있도록 피클 파일에 저장됩니다. 결과는 원본 이미지에 나타나는 얼굴의 크기가 됩니다. 게다가 데이터베이스의 대상 이미지에도 여러 얼굴이 있을 수 있습니다.
dfs = DeepFace . find (
img_path = "img1.jpg" ,
db_path = "C:/workspace/my_db" ,
)
임베딩 - Demo
얼굴 인식 모델은 기본적으로 얼굴 이미지를 다차원 벡터로 표현합니다. 때로는 임베딩 벡터가 직접 필요한 경우도 있습니다. DeepFace에는 전용 표현 기능이 제공됩니다. Represent 함수는 임베딩 목록을 반환합니다. 결과는 이미지 경로에 나타나는 얼굴의 크기가 됩니다.
embedding_objs = DeepFace . represent (
img_path = "img.jpg"
)
이 함수는 배열을 포함으로 반환합니다. 임베딩 배열의 크기는 모델 이름에 따라 다릅니다. 예를 들어 VGG-Face는 기본 모델이며 얼굴 이미지를 4096차원 벡터로 표현합니다.
for embedding_obj in embedding_objs :
embedding = embedding_obj [ "embedding" ]
assert isinstance ( embedding , list )
assert (
model_name == "VGG-Face"
and len ( embedding ) == 4096
)
여기서도 임베딩은 가로로 4096개의 슬롯으로 표시됩니다. 각 슬롯은 임베딩 벡터의 차원 값에 해당하며 차원 값은 오른쪽 색상 막대에 설명되어 있습니다. 2D 바코드와 유사하게 수직 치수는 그림에 정보를 저장하지 않습니다.
얼굴 인식 모델 - Demo
DeepFace는 하이브리드 얼굴 인식 패키지입니다. 현재 VGG-Face
, FaceNet
, OpenFace
, DeepFace
, DeepID
, ArcFace
, Dlib
, SFace
및 GhostFaceNet
등 다양한 최첨단 얼굴 인식 모델을 포함하고 있습니다. 기본 구성은 VGG-Face 모델을 사용합니다.
models = [
"VGG-Face" ,
"Facenet" ,
"Facenet512" ,
"OpenFace" ,
"DeepFace" ,
"DeepID" ,
"ArcFace" ,
"Dlib" ,
"SFace" ,
"GhostFaceNet" ,
]
#face verification
result = DeepFace . verify (
img1_path = "img1.jpg" ,
img2_path = "img2.jpg" ,
model_name = models [ 0 ],
)
#face recognition
dfs = DeepFace . find (
img_path = "img1.jpg" ,
db_path = "C:/workspace/my_db" ,
model_name = models [ 1 ],
)
#embeddings
embedding_objs = DeepFace . represent (
img_path = "img.jpg" ,
model_name = models [ 2 ],
)
FaceNet, VGG-Face, ArcFace 및 Dlib는 실험에 따르면 성능이 뛰어납니다. 자세한 내용은 BENCHMARKS
참조하세요. 다음 표에서는 DeepFace에서 다양한 모델의 측정된 점수와 원래 연구에서 보고된 점수를 확인할 수 있습니다.
모델 | 측정된 점수 | 선언된 점수 |
---|---|---|
페이스넷512 | 98.4% | 99.6% |
인간 | 97.5% | 97.5% |
페이스넷 | 97.4% | 99.2% |
드립 | 96.8% | 99.3% |
VGG-얼굴 | 96.7% | 98.9% |
아크페이스 | 96.7% | 99.5% |
고스트페이스넷 | 93.3% | 99.7% |
에스페이스 | 93.0% | 99.5% |
오픈페이스 | 78.7% | 92.9% |
딥페이스 | 69.0% | 97.3% |
DeepID | 66.5% | 97.4% |
DeepFace 내에서 이러한 모델을 사용하여 실험을 수행하면 고유한 탐지 또는 정규화 기술의 채택으로 인해 원래 연구와 비교하여 차이가 드러날 수 있습니다. 게다가 일부 모델은 사전 훈련된 가중치가 부족하여 백본만 가지고 출시되었습니다. 따라서 우리는 원래의 사전 훈련된 가중치 대신 재구현을 활용하고 있습니다.
유사성 - Demo
얼굴 인식 모델은 일반 컨볼루션 신경망이며 얼굴을 벡터로 표현하는 역할을 합니다. 우리는 같은 사람의 얼굴 쌍이 다른 사람의 얼굴 쌍보다 더 유사할 것이라고 기대합니다.
유사성은 코사인 유사성, 유클리드 거리 또는 L2 정규화된 유클리드와 같은 다양한 측정항목으로 계산할 수 있습니다. 기본 구성은 코사인 유사성을 사용합니다. 실험에 따르면 어떤 거리 측정법도 다른 측정법보다 성능이 뛰어나지 않습니다.
metrics = [ "cosine" , "euclidean" , "euclidean_l2" ]
#face verification
result = DeepFace . verify (
img1_path = "img1.jpg" ,
img2_path = "img2.jpg" ,
distance_metric = metrics [ 1 ],
)
#face recognition
dfs = DeepFace . find (
img_path = "img1.jpg" ,
db_path = "C:/workspace/my_db" ,
distance_metric = metrics [ 2 ],
)
얼굴 속성 분석 - Demo
DeepFace에는 age
, gender
, facial expression
(화남, 두려움, 중립, 슬픔, 혐오, 행복, 놀라움 포함) 및 race
(아시아인, 백인, 중동, 인도인, 라틴계 및 흑인 포함)을 포함한 강력한 얼굴 속성 분석 모듈도 함께 제공됩니다. 예측. 결과는 원본 이미지에 나타나는 얼굴의 크기가 됩니다.
objs = DeepFace . analyze (
img_path = "img4.jpg" ,
actions = [ 'age' , 'gender' , 'race' , 'emotion' ],
)
연령 모델은 ± 4.65 MAE를 얻었습니다. 성별 모델은 튜토리얼에서 언급한 대로 97.44%의 정확도, 96.29%의 정밀도, 95.05%의 재현율을 얻었습니다.
얼굴 감지 및 정렬 - Demo
얼굴 감지 및 정렬은 현대 얼굴 인식 파이프라인의 중요한 초기 단계입니다. 실험에 따르면 감지 기능을 사용하면 얼굴 인식 정확도가 최대 42% 증가하고 정렬 기능을 사용하면 얼굴 인식 정확도가 최대 6% 증가하는 것으로 나타났습니다. OpenCV
, Ssd
, Dlib
, MtCnn
, Faster MtCnn
, RetinaFace
, MediaPipe
, Yolo
, YuNet
및 CenterFace
감지기는 deepface로 래핑됩니다.
모든 deepface 함수는 선택적 감지기 백엔드를 허용하고 입력 인수를 정렬합니다. 이러한 인수를 사용하여 해당 감지기와 정렬 모드 간에 전환할 수 있습니다. OpenCV는 기본 감지기이며 정렬은 기본적으로 켜져 있습니다.
backends = [
'opencv' ,
'ssd' ,
'dlib' ,
'mtcnn' ,
'fastmtcnn' ,
'retinaface' ,
'mediapipe' ,
'yolov8' ,
'yunet' ,
'centerface' ,
]
alignment_modes = [ True , False ]
#face verification
obj = DeepFace . verify (
img1_path = "img1.jpg" ,
img2_path = "img2.jpg" ,
detector_backend = backends [ 0 ],
align = alignment_modes [ 0 ],
)
#face recognition
dfs = DeepFace . find (
img_path = "img.jpg" ,
db_path = "my_db" ,
detector_backend = backends [ 1 ],
align = alignment_modes [ 0 ],
)
#embeddings
embedding_objs = DeepFace . represent (
img_path = "img.jpg" ,
detector_backend = backends [ 2 ],
align = alignment_modes [ 0 ],
)
#facial analysis
demographies = DeepFace . analyze (
img_path = "img4.jpg" ,
detector_backend = backends [ 3 ],
align = alignment_modes [ 0 ],
)
#face detection and alignment
face_objs = DeepFace . extract_faces (
img_path = "img.jpg" ,
detector_backend = backends [ 4 ],
align = alignment_modes [ 0 ],
)
얼굴 인식 모델은 실제로 CNN 모델이며 표준 크기의 입력을 기대합니다. 따라서 표현하기 전에 크기 조정이 필요합니다. 변형을 방지하기 위해 deepface는 감지 및 정렬 후 대상 크기 인수에 따라 검은색 패딩 픽셀을 추가합니다.
RetinaFace와 MtCnn은 감지 및 정렬 단계에서 뛰어난 성능을 보이는 것처럼 보이지만 훨씬 느립니다. 파이프라인 속도가 더 중요하다면 opencv 또는 SSD를 사용해야 합니다. 반면 정확도를 고려한다면 Retinaface나 mtcnn을 사용하는 것이 좋습니다.
RetinaFace의 성능은 다음 그림에서 볼 수 있듯이 군중 속에서도 매우 만족스럽습니다. 게다가 놀라운 얼굴 랜드마크 감지 성능도 제공됩니다. 강조 표시된 빨간색 점은 눈, 코, 입과 같은 일부 얼굴 특징을 보여줍니다. 그래서 RetinaFace의 정렬 점수도 높습니다.
옐로우 엔젤스 - 페네르바체 여자 배구팀
이 저장소에서 RetinaFace에 대해 자세히 알아볼 수 있습니다.
실시간 분석 - Demo
실시간 비디오를 위해 deepface를 실행할 수도 있습니다. 스트림 기능은 웹캠에 액세스하여 얼굴 인식과 얼굴 속성 분석을 모두 적용합니다. 이 기능은 얼굴에 5프레임씩 순차적으로 초점을 맞출 수 있으면 프레임 분석을 시작합니다. 그러면 5초 후에 결과가 표시됩니다.
DeepFace . stream ( db_path = "C:/User/Sefik/Desktop/database" )
얼굴 인식은 일회성 학습을 기반으로 하지만 한 사람의 얼굴 사진을 여러 장 사용할 수도 있습니다. 아래 그림과 같이 디렉터리 구조를 다시 정렬해야 합니다.
user
├── database
│ ├── Alice
│ │ ├── Alice1.jpg
│ │ ├── Alice2.jpg
│ ├── Bob
│ │ ├── Bob.jpg
React UI - Demo part-i
, Demo part-ii
브라우저에서 직접 얼굴 확인 작업을 수행하려는 경우 deepface-react-ui는 deepface API에 따라 ReactJS를 사용하여 구축된 별도의 저장소입니다.
얼굴 스푸핑 방지 - Demo
DeepFace에는 특정 이미지가 진짜인지 가짜인지 파악하는 스푸핑 방지 분석 모듈도 포함되어 있습니다. 이 기능을 활성화하려면 모든 DeepFace 작업에서 anti_spoofing
인수를 True로 설정하세요.
# anti spoofing test in face detection
face_objs = DeepFace . extract_faces (
img_path = "dataset/img1.jpg" ,
anti_spoofing = True
)
assert all ( face_obj [ "is_real" ] is True for face_obj in face_objs )
# anti spoofing test in real time analysis
DeepFace . stream (
db_path = "C:/User/Sefik/Desktop/database" ,
anti_spoofing = True
)
API - Demo
DeepFace는 API도 제공합니다. 자세한 내용은 api folder
참조하세요. 다음 명령을 사용하여 deepface 소스 코드를 복제하고 API를 실행할 수 있습니다. 나머지 서비스를 시작하기 위해 Gunicorn 서버를 사용합니다. 이런 방식으로 모바일 앱이나 웹 등 외부 시스템에서 deepface를 호출할 수 있습니다.
cd scripts
./service.sh
얼굴 인식, 얼굴 속성 분석 및 벡터 표현 기능은 API에서 다룹니다. 이러한 함수를 http 게시 메소드로 호출해야 합니다. 기본 서비스 엔드포인트는 얼굴 인식의 경우 http://localhost:5005/verify
, 얼굴 속성 분석의 경우 http://localhost:5005/analyze
, 벡터 표현의 경우 http://localhost:5005/represent
입니다. API는 이미지를 파일 업로드(양식 데이터를 통해) 또는 정확한 이미지 경로, URL 또는 base64 인코딩 문자열(JSON 또는 양식 데이터를 통해)로 허용하여 다양한 클라이언트 요구 사항에 대한 다양한 옵션을 제공합니다. 여기에서 postman 프로젝트를 찾아 이러한 메서드를 호출하는 방법을 알아볼 수 있습니다.
도커화된 서비스 - Demo
다음 명령 세트는 docker를 통해 localhost:5005
에서 deepface를 제공합니다. 그러면 검증, 분석, 표현 등의 딥페이스 서비스를 이용하실 수 있습니다. 또한, Docker 허브에서 미리 빌드된 이미지 대신 직접 이미지를 빌드하려는 경우 프로젝트의 루트 폴더에 있는 Dockerfile을 사용할 수 있습니다.
# docker build -t serengil/deepface . # build docker image from Dockerfile
docker pull serengil/deepface # use pre-built docker image from docker hub
docker run -p 5005:5000 serengil/deepface
명령줄 인터페이스 - Demo
DeepFace에는 명령줄 인터페이스도 함께 제공됩니다. 아래와 같이 명령줄에서 해당 기능에 액세스할 수 있습니다. deepface 명령은 함수 이름을 첫 번째 인수로 예상하고 그 이후의 함수 인수를 기대합니다.
# face verification
$ deepface verify -img1_path tests/dataset/img1.jpg -img2_path tests/dataset/img2.jpg
# facial analysis
$ deepface analyze -img_path tests/dataset/img1.jpg
docker로 deepface를 실행하는 경우에도 이 명령을 실행할 수 있습니다. 쉘 스크립트의 지침을 따르십시오.
대규모 얼굴 인식 - Playlist
작업에 대규모 데이터 세트에 대한 얼굴 인식이 필요한 경우 DeepFace를 벡터 인덱스 또는 벡터 데이터베이스와 결합해야 합니다. 이 설정은 정확한 검색 대신 대략적으로 가장 가까운 이웃 검색을 수행하므로 밀리초 내에 수십억 개의 항목이 포함된 데이터베이스에서 얼굴을 식별할 수 있습니다. 일반적인 벡터 인덱스 솔루션에는 Annoy, Faiss, Voyager, NMSLIB, ElasticSearch가 포함됩니다. 벡터 데이터베이스의 경우 인기 있는 옵션은 pgVector 확장자를 갖춘 Postgres와 RediSearch입니다.
반대로 작업이 중소 규모 데이터베이스의 얼굴 인식과 관련된 경우 Postgres 또는 SQLite와 같은 관계형 데이터베이스 또는 Mongo, Redis 또는 Cassandra와 같은 NoSQL 데이터베이스를 사용하여 가장 가까운 이웃 검색을 수행할 수 있습니다.
끌어오기 요청은 환영할 만한 일입니다! 대규모 패치를 제공할 계획이라면 먼저 이슈를 생성하여 사전 질문이나 디자인 결정을 방해하지 않도록 하세요.
PR을 만들기 전에 make test && make lint
명령을 실행하여 로컬에서 단위 테스트와 Linting을 실행해야 합니다. PR이 전송되면 GitHub 테스트 워크플로가 자동으로 실행되고 승인 전에 GitHub 작업에서 단위 테스트 및 Linting 작업을 사용할 수 있습니다.
프로젝트를 지원하는 방법은 여러 가지가 있습니다. GitHub 저장소를 주연하는 것은 그 중 하나일 뿐입니다.
이 작업이 마음에 들면 Patreon, GitHub 후원자 또는 Buy Me a Coffee에서 재정적으로 후원할 수 있습니다.
또한, 골드, 실버, 브론즈 등급의 후원자가 되시면 GitHub 및 PyPI의 README에 회사 로고가 표시됩니다.
연구에 도움이 된다면 출판물에 딥페이스를 인용해 주세요. 자세한 내용은 CITATIONS
참조하세요. BibTex 항목은 다음과 같습니다.
연구에서 얼굴 인식이나 얼굴 감지 목적으로 딥페이스를 사용하는 경우 다음 출판물을 인용해 주세요.
@article { serengil2024lightface ,
title = { A Benchmark of Facial Recognition Pipelines and Co-Usability Performances of Modules } ,
author = { Serengil, Sefik and Ozpinar, Alper } ,
journal = { Journal of Information Technologies } ,
volume = { 17 } ,
number = { 2 } ,
pages = { 95-107 } ,
year = { 2024 } ,
doi = { 10.17671/gazibtd.1399077 } ,
url = { https://dergipark.org.tr/en/pub/gazibtd/issue/84331/1399077 } ,
publisher = { Gazi University }
}
@inproceedings { serengil2020lightface ,
title = { LightFace: A Hybrid Deep Face Recognition Framework } ,
author = { Serengil, Sefik Ilkin and Ozpinar, Alper } ,
booktitle = { 2020 Innovations in Intelligent Systems and Applications Conference (ASYU) } ,
pages = { 23-27 } ,
year = { 2020 } ,
doi = { 10.1109/ASYU50717.2020.9259802 } ,
url = { https://ieeexplore.ieee.org/document/9259802 } ,
organization = { IEEE }
}
반면, 나이, 성별, 감정, 인종 예측 작업 등 얼굴 특성 분석 목적으로 연구에 딥페이스를 사용하는 경우 이 출판물을 인용해 주세요.
@inproceedings { serengil2021lightface ,
title = { HyperExtended LightFace: A Facial Attribute Analysis Framework } ,
author = { Serengil, Sefik Ilkin and Ozpinar, Alper } ,
booktitle = { 2021 International Conference on Engineering and Emerging Technologies (ICEET) } ,
pages = { 1-4 } ,
year = { 2021 } ,
doi = { 10.1109/ICEET53442.2021.9659697 } ,
url = { https://ieeexplore.ieee.org/document/9659697 } ,
organization = { IEEE }
}
또한 GitHub 프로젝트에서 deepface를 사용하는 경우 requirements.txt
에 deepface
추가하세요.
DeepFace는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE
참조하세요.
DeepFace는 VGG-Face, Facenet(128d 및 512d 모두), OpenFace, DeepFace, DeepID, ArcFace, Dlib, SFace 및 GhostFaceNet과 같은 일부 외부 얼굴 인식 모델을 포함합니다. 게다가 연령, 성별, 인종/민족 모델은 전이 학습을 통해 VGG-Face의 백본에서 훈련되었습니다. 마찬가지로 DeepFace는 OpenCv, Ssd, Dlib, MtCnn, Fast MtCnn, RetinaFace, MediaPipe, YuNet, Yolo 및 CenterFace와 같은 다양한 얼굴 감지기를 래핑합니다. 마지막으로 DeepFace는 선택적으로 얼굴 스푸핑 방지를 사용하여 주어진 이미지가 진짜인지 가짜인지 판단합니다. 해당 모델을 활용하려는 경우 라이선스 유형이 상속됩니다. 생산 목적으로 해당 모델의 라이센스 유형을 확인하십시오.
DeepFace 로고는 Adrien Coquet이 제작했으며 Creative Commons: By Attribution 3.0 라이선스에 따라 라이선스가 부여됩니다.