DeepFace es un marco liviano de reconocimiento facial y análisis de atributos faciales (edad, género, emoción y raza) para Python. Es un marco híbrido de reconocimiento facial que incluye modelos de última generación : VGG-Face
, FaceNet
, OpenFace
, DeepFace
, DeepID
, ArcFace
, Dlib
, SFace
y GhostFaceNet
.
Experiments
muestran que los seres humanos tienen un 97,53% de precisión en las tareas de reconocimiento facial, mientras que esos modelos ya alcanzaron y superaron ese nivel de precisión.
La forma más sencilla de instalar Deepface es descargarlo desde PyPI
. También instalará la biblioteca y sus requisitos previos.
$ pip install deepface
Alternativamente, también puedes instalar deepface desde su código fuente. Es posible que el código fuente tenga nuevas funciones que aún no se hayan publicado en la versión de pip.
$ git clone https://github.com/serengil/deepface.git
$ cd deepface
$ pip install -e .
Una vez que haya instalado la biblioteca, podrá importarla y utilizar sus funcionalidades.
from deepface import DeepFace
Un canal moderno de reconocimiento facial : Demo
Un proceso de reconocimiento facial moderno consta de cinco etapas comunes: detectar, alinear, normalizar, representar y verificar. Si bien DeepFace maneja todas estas etapas comunes en segundo plano, no es necesario adquirir un conocimiento profundo sobre todos los procesos detrás de ellas. Puede simplemente llamar a su función de verificación, búsqueda o análisis con una sola línea de código.
Verificación facial : Demo
Esta función verifica que los pares de caras sean la misma persona o personas diferentes. Espera rutas de imágenes exactas como entradas. También es bienvenido pasar imágenes codificadas en base64 o numpy. Luego, devolverá un diccionario y deberá verificar solo su clave verificada.
result = DeepFace . verify (
img1_path = "img1.jpg" ,
img2_path = "img2.jpg" ,
)
Reconocimiento facial - Demo
El reconocimiento facial requiere aplicar la verificación facial muchas veces. Aquí, deepface tiene una función de búsqueda lista para usar para manejar esta acción. Buscará la identidad de la imagen de entrada en la ruta de la base de datos y devolverá una lista del marco de datos de pandas como salida. Mientras tanto, las incrustaciones faciales de la base de datos facial se almacenan en un archivo pickle para buscarlas más rápido la próxima vez. El resultado será el tamaño de las caras que aparecerán en la imagen de origen. Además, las imágenes de destino en la base de datos también pueden tener muchas caras.
dfs = DeepFace . find (
img_path = "img1.jpg" ,
db_path = "C:/workspace/my_db" ,
)
Incrustaciones - Demo
Los modelos de reconocimiento facial básicamente representan imágenes faciales como vectores multidimensionales. A veces, necesitas esos vectores de incrustación directamente. DeepFace viene con una función de representación dedicada. La función Representar devuelve una lista de incrustaciones. El resultado será el tamaño de las caras que aparecerán en la ruta de la imagen.
embedding_objs = DeepFace . represent (
img_path = "img.jpg"
)
Esta función devuelve una matriz como incrustada. El tamaño de la matriz de incrustación sería diferente según el nombre del modelo. Por ejemplo, VGG-Face es el modelo predeterminado y representa imágenes faciales como vectores de 4096 dimensiones.
for embedding_obj in embedding_objs :
embedding = embedding_obj [ "embedding" ]
assert isinstance ( embedding , list )
assert (
model_name == "VGG-Face"
and len ( embedding ) == 4096
)
Aquí también se traza la incrustación con 4096 ranuras horizontalmente. Cada ranura corresponde a un valor de dimensión en el vector de incrustación y el valor de dimensión se explica en la barra de colores de la derecha. Al igual que los códigos de barras 2D, la dimensión vertical no almacena información en la ilustración.
Modelos de reconocimiento facial - Demo
DeepFace es un paquete híbrido de reconocimiento facial. Actualmente incluye muchos modelos de reconocimiento facial de última generación : VGG-Face
, FaceNet
, OpenFace
, DeepFace
, DeepID
, ArcFace
, Dlib
, SFace
y GhostFaceNet
. La configuración predeterminada utiliza el modelo 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 y Dlib tienen un rendimiento superior según experimentos; consulte BENCHMARKS
para obtener más detalles. Puede encontrar las puntuaciones medidas de varios modelos en DeepFace y las puntuaciones informadas de sus estudios originales en la siguiente tabla.
Modelo | Puntuación medida | Puntuación declarada |
---|---|---|
facenet512 | 98,4% | 99,6% |
Seres humanos | 97,5% | 97,5% |
facenet | 97,4% | 99,2% |
Dlib | 96,8% | 99,3% |
Cara VGG | 96,7% | 98,9% |
ArcFace | 96,7% | 99,5% |
carafantasma | 93,3% | 99,7% |
cara | 93,0% | 99,5% |
cara abierta | 78,7% | 92,9% |
cara profunda | 69,0% | 97,3% |
identificación profunda | 66,5% | 97,4% |
La realización de experimentos con esos modelos dentro de DeepFace puede revelar disparidades en comparación con los estudios originales, debido a la adopción de distintas técnicas de detección o normalización. Además, algunos modelos se han lanzado únicamente con la columna vertebral y carecen de pesos previamente entrenados. Por lo tanto, estamos utilizando sus reimplementaciones en lugar de los pesos originales previamente entrenados.
Similitud - Demo
Los modelos de reconocimiento facial son redes neuronales convolucionales regulares y se encargan de representar rostros como vectores. Esperamos que un par de caras de la misma persona sea más similar que un par de caras de personas diferentes.
La similitud podría calcularse mediante diferentes métricas, como la similitud del coseno, la distancia euclidiana o la euclidiana normalizada L2. La configuración predeterminada utiliza similitud de coseno. Según los experimentos, ninguna métrica de distancia tiene un rendimiento superior a otra.
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 ],
)
Análisis de atributos faciales : Demo
DeepFace también viene con un potente módulo de análisis de atributos faciales que incluye age
, gender
, facial expression
(que incluye enojo, miedo, neutral, tristeza, disgusto, felicidad y sorpresa) y race
(que incluye asiático, blanco, del Medio Oriente, indio, latino y negro). predicciones El resultado será el tamaño de las caras que aparecerán en la imagen de origen.
objs = DeepFace . analyze (
img_path = "img4.jpg" ,
actions = [ 'age' , 'gender' , 'race' , 'emotion' ],
)
El modelo de edad obtuvo ± 4,65 MAE; El modelo de género obtuvo 97,44% de precisión, 96,29% de precisión y 95,05% de recuperación como se menciona en su tutorial.
Detección y alineación de rostros : Demo
La detección y alineación de rostros son etapas iniciales importantes de un proceso de reconocimiento facial moderno. Los experimentos muestran que la detección aumenta la precisión del reconocimiento facial hasta un 42%, mientras que la alineación la aumenta hasta un 6%. Los detectores OpenCV
, Ssd
, Dlib
, MtCnn
, Faster MtCnn
, RetinaFace
, MediaPipe
, Yolo
, YuNet
y CenterFace
están envueltos en deepface.
Todas las funciones de deepface aceptan el backend del detector opcional y alinean los argumentos de entrada. Puede cambiar entre esos detectores y modos de alineación con estos argumentos. OpenCV es el detector predeterminado y la alineación está activada de forma predeterminada.
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 ],
)
Los modelos de reconocimiento facial son en realidad modelos CNN y esperan entradas de tamaño estándar. Por lo tanto, es necesario cambiar el tamaño antes de la representación. Para evitar la deformación, deepface agrega píxeles de relleno negros de acuerdo con el argumento del tamaño objetivo después de la detección y alineación.
RetinaFace y MtCnn parecen tener un rendimiento superior en las etapas de detección y alineación, pero son mucho más lentos. Si la velocidad de su canalización es más importante, entonces debería usar opencv o ssd. Por otro lado, si considera la precisión, entonces debería usar retinaface o mtcnn.
El rendimiento de RetinaFace es muy satisfactorio incluso entre la multitud, como se ve en la siguiente ilustración. Además, viene con un increíble rendimiento de detección de puntos de referencia faciales. Los puntos rojos resaltados muestran algunos puntos de referencia faciales, como ojos, nariz y boca. Por eso, la puntuación de alineación de RetinaFace también es alta.
Los Ángeles Amarillos - Equipo de voleibol femenino Fenerbahce
Puede obtener más información sobre RetinaFace en este repositorio.
Análisis en tiempo real - Demo
También puedes ejecutar deepface para vídeos en tiempo real. La función de transmisión accederá a su cámara web y aplicará tanto el reconocimiento facial como el análisis de atributos faciales. La función comienza a analizar un cuadro si puede enfocar una cara secuencialmente 5 cuadros. Luego, muestra resultados 5 segundos.
DeepFace . stream ( db_path = "C:/User/Sefik/Desktop/database" )
Aunque el reconocimiento facial se basa en el aprendizaje de una sola vez, también puedes utilizar varias imágenes de rostros de una persona. Debe reorganizar la estructura de su directorio como se ilustra a continuación.
user
├── database
│ ├── Alice
│ │ ├── Alice1.jpg
│ │ ├── Alice2.jpg
│ ├── Bob
│ │ ├── Bob.jpg
React UI - Demo part-i
, Demo part-ii
Si tiene la intención de realizar tareas de verificación facial directamente desde su navegador, deepface-react-ui es un repositorio separado creado con ReactJS dependiendo de la API de Deepface.
Anti suplantación de rostros - Demo
DeepFace también incluye un módulo de análisis anti-spoofing para comprender que una imagen dada es real o falsa. Para activar esta función, establezca el argumento anti_spoofing
en Verdadero en cualquier tarea de 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
)
API - Demo
DeepFace también ofrece una API; consulte api folder
para obtener más detalles. Puede clonar el código fuente de Deepface y ejecutar la API con el siguiente comando. Utilizará el servidor Gunicorn para activar un servicio de descanso. De esta manera, puedes llamar a Deepface desde un sistema externo como una aplicación móvil o una web.
cd scripts
./service.sh
La API cubre las funciones de reconocimiento facial, análisis de atributos faciales y representación vectorial. Se espera que llame a estas funciones como métodos de publicación http. Los puntos finales de servicio predeterminados serán http://localhost:5005/verify
para reconocimiento facial, http://localhost:5005/analyze
para análisis de atributos faciales y http://localhost:5005/represent
para representación vectorial. La API acepta imágenes como cargas de archivos (a través de datos de formulario) o como rutas de imagen exactas, URL o cadenas codificadas en base64 (a través de JSON o datos de formulario), lo que proporciona opciones versátiles para los diferentes requisitos del cliente. Aquí puede encontrar un proyecto de cartero para descubrir cómo se deben llamar estos métodos.
Servicio Dockerizado - Demo
El siguiente conjunto de comandos servirá a deepface en localhost:5005
a través de Docker. Luego, podrá consumir servicios profundos como verificar, analizar y representar. Además, si desea crear la imagen usted mismo en lugar de una imagen prediseñadas desde Docker Hub, Dockerfile está disponible en la carpeta raíz del proyecto.
# 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
Interfaz de línea de comando : Demo
DeepFace también viene con una interfaz de línea de comandos. Puede acceder a sus funciones en la línea de comando como se muestra a continuación. El comando deepface espera el nombre de la función como primer argumento y los argumentos de la función a partir de entonces.
# 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
También puedes ejecutar estos comandos si estás ejecutando deepface con Docker. Siga las instrucciones del script de shell.
Reconocimiento facial a gran escala : Playlist
Si su tarea requiere reconocimiento facial en grandes conjuntos de datos, debe combinar DeepFace con un índice vectorial o una base de datos vectorial. Esta configuración realizará búsquedas aproximadas del vecino más cercano en lugar de búsquedas exactas, lo que le permitirá identificar una cara en una base de datos que contiene miles de millones de entradas en milisegundos. Las soluciones de índice vectorial comunes incluyen Annoy, Faiss, Voyager, NMSLIB, ElasticSearch. Para bases de datos vectoriales, las opciones populares son Postgres con su extensión pgvector y RediSearch.
Por el contrario, si su tarea implica el reconocimiento facial en bases de datos de tamaño pequeño a moderado, puede adoptar bases de datos relacionales como Postgres o SQLite, o bases de datos NoSQL como Mongo, Redis o Cassandra para realizar una búsqueda exacta del vecino más cercano.
¡Las solicitudes de extracción son más que bienvenidas! Si planea contribuir con un parche grande, primero cree un problema para eliminar cualquier pregunta inicial o decisión de diseño.
Antes de crear un PR, debe ejecutar las pruebas unitarias y linting localmente ejecutando el comando make test && make lint
. Una vez enviado un PR, el flujo de trabajo de prueba de GitHub se ejecutará automáticamente y los trabajos de prueba unitaria y linting estarán disponibles en las acciones de GitHub antes de su aprobación.
Hay muchas maneras de respaldar un proyecto: protagonizado por el repositorio de GitHub es solo una
Si te gusta este trabajo, puedes apoyarlo financieramente en Patreon, GitHub Sponsors o Buy Me a Coffee.
Además, el logotipo de su empresa se mostrará en README en GitHub y PyPI si se convierte en patrocinador en los niveles oro, plata o bronce.
Cite deepface en sus publicaciones si le ayuda en su investigación; consulte CITATIONS
para obtener más detalles. Aquí están sus entradas BibTex:
Si utiliza deepface en su investigación con fines de reconocimiento o detección facial, cite estas publicaciones:
@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 }
}
Por otro lado, si utiliza deepface en su investigación con fines de análisis de atributos faciales, como tareas de predicción de edad, género, emociones o etnia, cite esta publicación.
@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 }
}
Además, si usa deepface en sus proyectos de GitHub, agregue deepface
en el archivo requirements.txt
.
DeepFace tiene la licencia MIT; consulte LICENSE
para obtener más detalles.
DeepFace incluye algunos modelos de reconocimiento facial externo: VGG-Face, Facenet (tanto 128d como 512d), OpenFace, DeepFace, DeepID, ArcFace, Dlib, SFace y GhostFaceNet. Además, se entrenaron modelos de edad, género y raza/etnia en la columna vertebral de VGG-Face con aprendizaje por transferencia. De manera similar, DeepFace incluye muchos detectores de rostros: OpenCv, Ssd, Dlib, MtCnn, Fast MtCnn, RetinaFace, MediaPipe, YuNet, Yolo y CenterFace. Finalmente, DeepFace utiliza opcionalmente la lucha contra la suplantación de rostros para determinar que las imágenes dadas son reales o falsas. Los tipos de licencia se heredarán cuando pretenda utilizar esos modelos. Verifique los tipos de licencia de esos modelos para fines de producción.
El logotipo de DeepFace fue creado por Adrien Coquet y tiene la licencia Creative Commons: By Attribution 3.0.