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 はこれらすべての一般的な段階をバックグラウンドで処理しますが、その背後にあるすべてのプロセスについて深い知識を取得する必要はありません。検証、検索、または分析関数を 1 行のコードで呼び出すことができます。
顔認証- Demo
この機能は、顔のペアが同一人物であるか別人であるかを検証します。入力として正確な画像パスを期待します。 numpy または Base64 でエンコードされた画像を渡すことも歓迎します。次に、辞書が返されるので、その検証済みのキーだけをチェックする必要があります。
result = DeepFace . verify (
img1_path = "img1.jpg" ,
img2_path = "img2.jpg" ,
)
顔認識- Demo
顔認識では、顔認証を何度も適用する必要があります。ここで、deepface には、このアクションを処理するためのすぐに使える検索機能があります。データベース パスで入力画像の ID を検索し、pandas データ フレームのリストを出力として返します。一方、顔データベースの顔の埋め込みは、次回より高速に検索できるように、pickle ファイルに保存されます。結果は、ソース画像に表示される顔のサイズになります。さらに、データベース内のターゲット画像には多くの顔が含まれる場合もあります。
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% |
ディープ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 は、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 post メソッドとして呼び出すことが期待されます。デフォルトのサービス エンドポイントは、顔認識の場合はhttp://localhost:5005/verify
、顔属性分析の場合はhttp://localhost:5005/analyze
、ベクトル表現の場合はhttp://localhost:5005/represent
になります。 API は、画像をファイル アップロード (フォーム データ経由) として、または正確な画像パス、URL、または Base64 でエンコードされた文字列 (JSON またはフォーム データ経由) として受け入れ、さまざまなクライアント要件に合わせた多彩なオプションを提供します。ここでは、これらのメソッドを呼び出す方法を見つけるための postman プロジェクトを見つけることができます。
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 を実行している場合は、これらのコマンドを実行することもできます。シェルスクリプトの指示に従ってください。
大規模な顔認識- Playlist
タスクで大規模なデータセットに対する顔認識が必要な場合は、DeepFace とベクトル インデックスまたはベクトル データベースを組み合わせる必要があります。この設定では、正確な検索ではなく近似最近傍検索が実行され、数十億のエントリを含むデータベース内の顔をミリ秒以内に識別できるようになります。一般的なベクトル インデックス ソリューションには、Annoy、Faiss、Voyager、NMSLIB、ElasticSearch などがあります。ベクター データベースの場合、pgvector 拡張機能を備えた Postgres と RediSearch が一般的なオプションです。
逆に、小規模から中規模のデータベースでの顔認識がタスクに含まれる場合は、Postgres や SQLite などのリレーショナル データベース、または Mongo、Redis、Cassandra などの NoSQL データベースを使用して、正確な最近傍検索を実行できます。
プルリクエストは大歓迎です!大規模なパッチを提供する予定がある場合は、最初に問題を作成して、事前の質問や設計上の決定を最初に解決してください。
PR を作成する前に、 make test && make lint
コマンドを実行して、単体テストと lint をローカルで実行する必要があります。 PR が送信されると、GitHub テスト ワークフローが自動的に実行され、承認前に GitHub アクションで単体テストと lint ジョブを使用できるようになります。
プロジェクトをサポートするにはさまざまな方法があります - 主要な GitHub リポジトリはその 1 つです
この作品が気に入ったら、Patreon、GitHub Sponsors、または Buy Me a Coffee で経済的にサポートすることができます。
また、ゴールド、シルバー、ブロンズ レベルのスポンサーになると、GitHub および PyPI の README に会社のロゴが表示されます。
研究に役立つ場合は、出版物で 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 によって作成され、クリエイティブ コモンズ: 表示 3.0 ライセンスに基づいてライセンスされています。