DeepFace عبارة عن إطار خفيف للتعرف على الوجه وتحليل سمات الوجه (العمر والجنس والعاطفة والعرق) لبيثون. إنه إطار عمل هجين للتعرف على الوجوه يشمل أحدث النماذج: VGG-Face
و FaceNet
و OpenFace
و DeepFace
و DeepID
و ArcFace
و Dlib
و SFace
و GhostFaceNet
.
تظهر Experiments
أن البشر يتمتعون بدقة تصل إلى 97.53% في مهام التعرف على الوجه، بينما وصلت تلك النماذج بالفعل إلى مستوى الدقة هذا وتجاوزته.
أسهل طريقة لتثبيت Deepface هي تنزيله من PyPI
. سيتم تثبيت المكتبة نفسها ومتطلباتها الأساسية أيضًا.
$ pip install deepface
وبدلاً من ذلك، يمكنك أيضًا تثبيت Deepface من كود المصدر الخاص به. قد تحتوي التعليمات البرمجية المصدرية على ميزات جديدة لم يتم نشرها في إصدار النقطة بعد.
$ 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 على وظيفة بحث مبتكرة للتعامل مع هذا الإجراء. سيبحث عن هوية صورة الإدخال في مسار قاعدة البيانات وسيُرجع قائمة إطار بيانات الباندا كمخرجات. وفي الوقت نفسه، يتم تخزين تضمينات الوجه لقاعدة بيانات الوجه في ملف مخلل ليتم البحث فيها بشكل أسرع في المرة القادمة. ستكون النتيجة حجم الوجوه التي تظهر في الصورة المصدر. علاوة على ذلك، يمكن أن تحتوي الصور المستهدفة في قاعدة البيانات على العديد من الوجوه أيضًا.
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% |
GhostFaceNet | 93.3% | 99.7% |
سفاس | 93.0% | 99.5% |
وجه مفتوح | 78.7% | 92.9% |
ديب فيس | 69.0% | 97.3% |
معرف عميق | 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
بطبقة عميقة.
تقبل جميع وظائف الوجه العميق الواجهة الخلفية للكاشف الاختياري وتقوم بمحاذاة وسائط الإدخال. يمكنك التبديل بين تلك الكاشفات وأوضاع المحاذاة باستخدام هذه الوسائط. 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 وتتوقع مدخلات ذات حجم قياسي. لذلك، تغيير الحجم مطلوب قبل التمثيل. لتجنب التشوه، يضيف الوجه العميق وحدات بكسل حشوة سوداء وفقًا لوسيطة الحجم المستهدف بعد الكشف والمحاذاة.
يبدو أن أداء 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.
مكافحة انتحال الوجه – Demo
يتضمن DeepFace أيضًا وحدة تحليل مضادة للانتحال لفهم أن الصورة المعطاة حقيقية أو مزيفة. لتنشيط هذه الميزة، قم بتعيين وسيطة anti_spoofing
على True في أي مهام DeepFace.
# 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
)
واجهة برمجة التطبيقات - Demo
يقدم DeepFace واجهة برمجة التطبيقات أيضًا - راجع api folder
لمزيد من التفاصيل. يمكنك استنساخ كود مصدر Deepface وتشغيل واجهة برمجة التطبيقات باستخدام الأمر التالي. سوف يستخدم خادم gunicorn للحصول على خدمة الراحة. بهذه الطريقة، يمكنك الاتصال بـ Deepface من نظام خارجي مثل تطبيق الهاتف المحمول أو الويب.
cd scripts
./service.sh
تتم تغطية وظائف التعرف على الوجه وتحليل سمات الوجه وتمثيل المتجهات في واجهة برمجة التطبيقات. من المتوقع أن تقوم باستدعاء هذه الوظائف كطرق نشر http. ستكون نقاط نهاية الخدمة الافتراضية هي http://localhost:5005/verify
للتعرف على الوجه، http://localhost:5005/analyze
لتحليل سمات الوجه، و http://localhost:5005/represent
لتمثيل المتجهات. تقبل واجهة برمجة التطبيقات الصور كتحميلات للملفات (عبر بيانات النموذج)، أو كمسارات صور دقيقة، أو عناوين URL، أو سلاسل مشفرة بـ base64 (إما عبر JSON أو بيانات النموذج)، مما يوفر خيارات متعددة الاستخدامات لمتطلبات العميل المختلفة. هنا، يمكنك العثور على مشروع ساعي البريد لمعرفة كيفية استدعاء هذه الأساليب.
خدمة Dockerized - Demo
ستخدم مجموعة الأوامر التالية الوجه العميق على localhost:5005
عبر عامل الإرساء. بعد ذلك، ستتمكن من استخدام خدمات الوجه العميق مثل التحقق والتحليل والتمثيل. أيضًا، إذا كنت تريد إنشاء الصورة بنفسك بدلاً من الصورة المعدة مسبقًا من 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
يمكنك أيضًا تشغيل هذه الأوامر إذا كنت تقوم بتشغيل Deepface باستخدام docker. يرجى اتباع التعليمات الموجودة في برنامج Shell النصي.
التعرف على الوجه على نطاق واسع - Playlist
إذا كانت مهمتك تتطلب التعرف على الوجه في مجموعات بيانات كبيرة، فيجب عليك دمج DeepFace مع فهرس متجه أو قاعدة بيانات متجهة. سيؤدي هذا الإعداد إلى إجراء عمليات بحث تقريبية لأقرب جيران بدلاً من عمليات بحث دقيقة، مما يسمح لك بالتعرف على الوجه في قاعدة بيانات تحتوي على مليارات الإدخالات خلال أجزاء من الثانية. تتضمن حلول فهرس المتجهات الشائعة Annoy وFaiss وVoyager وNMSLIB وElasticSearch. بالنسبة لقواعد بيانات المتجهات، الخيارات الشائعة هي Postgres بامتداد pgvector وRediSearch.
على العكس من ذلك، إذا كانت مهمتك تتضمن التعرف على الوجه في قواعد بيانات صغيرة إلى متوسطة الحجم، فيمكنك اعتماد استخدام قواعد البيانات العلائقية مثل Postgres أو SQLite، أو قواعد بيانات NoSQL مثل Mongo أو Redis أو Cassandra لإجراء بحث دقيق عن أقرب جيران.
طلبات السحب هي أكثر من موضع ترحيب! إذا كنت تخطط للمساهمة في تصحيح كبير، فيرجى إنشاء مشكلة أولاً لطرح أي أسئلة مسبقة أو قرارات التصميم أولاً.
قبل إنشاء PR، يجب عليك تشغيل اختبارات الوحدة والفحص محليًا عن طريق تشغيل الأمر make test && make lint
. بمجرد إرسال العلاقات العامة، سيتم تشغيل سير عمل اختبار GitHub تلقائيًا وستكون مهام اختبار الوحدة والفحص متاحة في إجراءات GitHub قبل الموافقة.
هناك العديد من الطرق لدعم المشروع - بطولة GitHub repo هي واحدة فقط
إذا أعجبك هذا العمل، فيمكنك دعمه ماليًا على Patreon أو رعاة GitHub أو Buy Me a Coffee.
أيضًا، سيتم عرض شعار شركتك على README على GitHub وPyPI إذا أصبحت راعيًا في المستويات الذهبية أو الفضية أو البرونزية.
يرجى ذكر الوجه العميق في منشوراتك إذا كان ذلك يساعد في بحثك - راجع 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 }
}
من ناحية أخرى، إذا كنت تستخدم الوجه العميق في بحثك لأغراض تحليل سمات الوجه مثل مهام التنبؤ بالعمر أو الجنس أو العاطفة أو العرق، فيرجى الاستشهاد بهذا المنشور.
@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 }
}
أيضًا، إذا كنت تستخدم Deepface في مشاريع GitHub الخاصة بك، فيرجى إضافة deepface
في ملف requirements.txt
.
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، وCentreFace. أخيرًا، يستخدم DeepFace اختياريًا ميزة مكافحة انتحال الوجه لتحديد ما إذا كانت الصور المقدمة حقيقية أم مزيفة. سيتم توريث أنواع التراخيص عندما تنوي استخدام تلك النماذج. يرجى التحقق من أنواع تراخيص تلك النماذج لأغراض الإنتاج.
تم إنشاء شعار DeepFace بواسطة Adrien Coquet وهو مرخص بموجب ترخيص Creative Commons: By Attribution 3.0 License.