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 有一個開箱即用的查找功能來處理此操作。它將在資料庫路徑中尋找輸入影像的標識,並將傳回 pandas 資料幀列表作為輸出。同時,臉部資料庫的臉部嵌入儲存在pickle檔案中,以便下次更快搜尋。結果將是來源影像中出現的臉部尺寸。此外,資料庫中的目標影像也可以有多個面孔。
dfs = DeepFace . find (
img_path = "img1.jpg" ,
db_path = "C:/workspace/my_db" ,
)
嵌入- Demo
人臉辨識模型基本上將臉部影像表示為多維向量。有時,您直接需要這些嵌入向量。 DeepFace 附有專用的表示功能。表示函數傳回嵌入列表。結果將是影像路徑中出現的臉部尺寸。
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 個槽水平繪製。每個槽對應嵌入向量中的一個維度值,維度值在右側的顏色欄中解釋。與二維條碼類似,垂直尺寸在插圖中不會儲存任何資訊。
人臉辨識模型- 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 中各種模型的測量分數以及原始研究報告的分數。
模型 | 實測分數 | 公佈分數 |
---|---|---|
Facenet512 | 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% |
深度ID | 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 是一個使用 ReactJS 建立的獨立儲存庫,具體取決於 deepface api。
人臉反欺騙- 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 post 方法。預設服務端點將是http://localhost:5005/verify
(用於臉部辨識)、 http://localhost:5005/analyze
(用於臉部屬性分析)和http://localhost:5005/represent
(用於向量表示)。該 API 接受圖像作為檔案上傳(透過表單資料),或作為精確的圖像路徑、URL 或 base64 編碼字串(透過 JSON 或表單資料),為不同的用戶端需求提供多種選項。在這裡,您可以找到一個郵遞員專案來了解應該如何呼叫這些方法。
Docker 化服務- Demo
以下命令集將透過 docker 在localhost:5005
上為 deepface 提供服務。然後,您將能夠使用 Deepface 服務,例如驗證、分析和表示。另外,如果您想自己建立映像而不是從 docker hub 預先建置映像,則可以在專案的根資料夾中使用 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,您也可以執行這些命令。請按照 shell 腳本中的說明進行操作。
大規模臉部辨識- Playlist
如果您的任務需要在大型資料集上進行臉部識別,您應該將 DeepFace 與向量索引或向量資料庫結合。此設定將執行近似最近鄰搜索而不是精確搜索,使您可以在幾毫秒內識別包含數十億條目的資料庫中的人臉。常見的向量索引解決方案包括 Annoy、Faiss、Voyager、NMSLIB、ElasticSearch。對於向量資料庫,流行的選擇是帶有 pgvector 擴充功能的 Postgres 和 RediSearch。
相反,如果您的任務涉及中小型資料庫上的臉部識別,您可以採用關聯式資料庫(例如 Postgres 或 SQLite)或 NoSQL 資料庫(例如 Mongo、Redis 或 Cassandra)來執行精確的最近鄰搜尋。
非常歡迎請求請求!如果您計劃貢獻一個大補丁,請先建立一個問題,以便先解決任何預先問題或設計決策。
在建立 PR 之前,您應該透過執行make test && make lint
指令在本機上執行單元測試和 linting。發送 PR 後,GitHub 測試工作流程將自動執行,單元測試和 linting 作業將在批准之前在 GitHub 作業中可用。
支援專案的方法有很多種 - GitHub 儲存庫只是其中之一
如果您確實喜歡這項工作,那麼您可以在 Patreon、GitHub Sponsors 或 Buy Me a Coffee 上為其提供財務支援。
此外,如果您成為金級、銀級或銅級贊助商,您公司的商標將顯示在 GitHub 和 PyPI 上的自述文件中。
如果 Deepface 對您的研究有幫助,請在您的出版物中引用它 - 有關更多詳細信息,請參閱CITATIONS
。以下是其 BibTex 條目:
如果您在研究中使用 Deepface 進行臉部辨識或臉部偵測,請引用以下出版品:
@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 }
}
另一方面,如果您在研究中使用 Deepface 進行臉部屬性分析,例如年齡、性別、情緒或種族預測任務,請引用該出版物。
@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 授權。