DeepFace é uma estrutura leve de reconhecimento facial e análise de atributos faciais (idade, gênero, emoção e raça) para python. É uma estrutura híbrida de reconhecimento facial que envolve modelos de última geração : VGG-Face
, FaceNet
, OpenFace
, DeepFace
, DeepID
, ArcFace
, Dlib
, SFace
e GhostFaceNet
.
Experiments
mostram que os seres humanos têm 97,53% de precisão em tarefas de reconhecimento facial, enquanto esses modelos já atingiram e ultrapassaram esse nível de precisão.
A maneira mais fácil de instalar o deepface é baixá-lo do PyPI
. Ele instalará a própria biblioteca e seus pré-requisitos também.
$ pip install deepface
Alternativamente, você também pode instalar o deepface a partir de seu código-fonte. O código-fonte pode ter novos recursos ainda não publicados no lançamento do pip.
$ git clone https://github.com/serengil/deepface.git
$ cd deepface
$ pip install -e .
Depois de instalar a biblioteca, você poderá importá-la e utilizar suas funcionalidades.
from deepface import DeepFace
Um pipeline moderno de reconhecimento facial - Demo
Um pipeline moderno de reconhecimento facial consiste em 5 estágios comuns: detectar, alinhar, normalizar, representar e verificar. Embora o DeepFace lide com todos esses estágios comuns em segundo plano, você não precisa adquirir conhecimento profundo sobre todos os processos por trás dele. Você pode simplesmente chamar sua função de verificação, localização ou análise com uma única linha de código.
Verificação facial – Demo
Esta função verifica pares de rostos como a mesma pessoa ou pessoas diferentes. Ele espera caminhos exatos de imagem como entradas. Passar imagens numpy ou codificadas em base64 também é bem-vindo. Então, ele retornará um dicionário e você deverá verificar apenas sua chave verificada.
result = DeepFace . verify (
img1_path = "img1.jpg" ,
img2_path = "img2.jpg" ,
)
Reconhecimento facial - Demo
O reconhecimento facial requer a aplicação de verificação facial muitas vezes. Aqui, deepface tem uma função de localização pronta para uso para lidar com essa ação. Ele irá procurar a identidade da imagem de entrada no caminho do banco de dados e retornará uma lista de quadros de dados do pandas como saída. Enquanto isso, os embeddings faciais do banco de dados facial são armazenados em um arquivo pickle para serem pesquisados mais rapidamente na próxima vez. O resultado será o tamanho dos rostos que aparecem na imagem de origem. Além disso, as imagens alvo no banco de dados também podem ter muitas faces.
dfs = DeepFace . find (
img_path = "img1.jpg" ,
db_path = "C:/workspace/my_db" ,
)
Incorporações - Demo
Os modelos de reconhecimento facial representam basicamente imagens faciais como vetores multidimensionais. Às vezes, você precisa desses vetores incorporados diretamente. DeepFace vem com uma função de representação dedicada. A função Represent retorna uma lista de embeddings. O resultado será o tamanho dos rostos que aparecem no caminho da imagem.
embedding_objs = DeepFace . represent (
img_path = "img.jpg"
)
Esta função retorna um array como incorporação. O tamanho da matriz de incorporação seria diferente com base no nome do modelo. Por exemplo, VGG-Face é o modelo padrão e representa imagens faciais como vetores dimensionais de 4.096.
for embedding_obj in embedding_objs :
embedding = embedding_obj [ "embedding" ]
assert isinstance ( embedding , list )
assert (
model_name == "VGG-Face"
and len ( embedding ) == 4096
)
Aqui, a incorporação também é plotada com 4.096 slots horizontalmente. Cada slot corresponde a um valor de dimensão no vetor de incorporação e o valor da dimensão é explicado na barra de cores à direita. Semelhante aos códigos de barras 2D, a dimensão vertical não armazena nenhuma informação na ilustração.
Modelos de reconhecimento facial – Demo
DeepFace é um pacote híbrido de reconhecimento facial. Atualmente, ele envolve muitos modelos de reconhecimento facial de última geração : VGG-Face
, FaceNet
, OpenFace
, DeepFace
, DeepID
, ArcFace
, Dlib
, SFace
e GhostFaceNet
. A configuração padrão usa o 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 e Dlib apresentam desempenho superior com base em experimentos - consulte BENCHMARKS
para obter mais detalhes. Você pode encontrar as pontuações medidas de vários modelos no DeepFace e as pontuações relatadas de seus estudos originais na tabela a seguir.
Modelo | Pontuação medida | Pontuação Declarada |
---|---|---|
Facenet512 | 98,4% | 99,6% |
Seres humanos | 97,5% | 97,5% |
97,4% | 99,2% | |
Dlib | 96,8% | 99,3% |
Rosto VGG | 96,7% | 98,9% |
Arcface | 96,7% | 99,5% |
FantasmaFaceNet | 93,3% | 99,7% |
Sface | 93,0% | 99,5% |
OpenFace | 78,7% | 92,9% |
DeepFace | 69,0% | 97,3% |
ID profundo | 66,5% | 97,4% |
A realização de experimentos com esses modelos no DeepFace pode revelar disparidades em relação aos estudos originais, devido à adoção de técnicas distintas de detecção ou normalização. Além disso, alguns modelos foram lançados apenas com backbones, sem pesos pré-treinados. Assim, estamos utilizando suas reimplementações em vez dos pesos originais pré-treinados.
Semelhança - Demo
Os modelos de reconhecimento facial são redes neurais convolucionais regulares e são responsáveis por representar faces como vetores. Esperamos que um par de faces da mesma pessoa seja mais semelhante do que um par de faces de pessoas diferentes.
A similaridade pode ser calculada por diferentes métricas, como similaridade de cosseno, distância euclidiana ou euclidiana normalizada L2. A configuração padrão usa similaridade de cosseno. De acordo com experimentos, nenhuma métrica de distância tem desempenho superior a outra.
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álise de Atributos Faciais – Demo
DeepFace também vem com um forte módulo de análise de atributos faciais, incluindo age
, gender
, facial expression
(incluindo raiva, medo, neutro, tristeza, nojo, felicidade e surpresa) e race
(incluindo asiático, branco, Oriente Médio, indiano, latino e negro) previsões. O resultado será o tamanho dos rostos que aparecem na imagem de origem.
objs = DeepFace . analyze (
img_path = "img4.jpg" ,
actions = [ 'age' , 'gender' , 'race' , 'emotion' ],
)
O modelo de idade obteve ± 4,65 MAE; o modelo de gênero obteve 97,44% de precisão, 96,29% de precisão e 95,05% de recall conforme mencionado em seu tutorial.
Detecção e alinhamento de rosto - Demo
A detecção e o alinhamento facial são estágios iniciais importantes de um pipeline moderno de reconhecimento facial. Experimentos mostram que a detecção aumenta a precisão do reconhecimento facial em até 42%, enquanto o alinhamento aumenta em até 6%. Os detectores OpenCV
, Ssd
, Dlib
, MtCnn
, Faster MtCnn
, RetinaFace
, MediaPipe
, Yolo
, YuNet
e CenterFace
são envolvidos em deepface.
Todas as funções deepface aceitam back-end de detector opcional e alinham argumentos de entrada. Você pode alternar entre esses detectores e modos de alinhamento com estes argumentos. OpenCV é o detector padrão e o alinhamento está ativado por padrão.
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 ],
)
Os modelos de reconhecimento facial são, na verdade, modelos CNN e esperam entradas de tamanho padrão. Portanto, o redimensionamento é necessário antes da representação. Para evitar deformação, o deepface adiciona pixels de preenchimento preto de acordo com o argumento do tamanho do alvo após a detecção e alinhamento.
RetinaFace e MtCnn parecem ter desempenho superior nos estágios de detecção e alinhamento, mas são muito mais lentos. Se a velocidade do seu pipeline for mais importante, você deve usar opencv ou ssd. Por outro lado, se você considerar a precisão, deverá usar retinaface ou mtcnn.
O desempenho do RetinaFace é muito satisfatório mesmo no meio da multidão, como pode ser visto na ilustração a seguir. Além disso, ele vem com um incrível desempenho de detecção de pontos de referência faciais. Os pontos vermelhos destacados mostram alguns pontos de referência faciais, como olhos, nariz e boca. É por isso que a pontuação de alinhamento do RetinaFace também é alta.
The Yellow Angels - Seleção Feminina de Voleibol do Fenerbahçe
Você pode descobrir mais sobre o RetinaFace neste repositório.
Análise em Tempo Real - Demo
Você também pode executar o deepface para vídeos em tempo real. A função Stream acessará sua webcam e aplicará reconhecimento facial e análise de atributos faciais. A função começa a analisar um quadro se conseguir focar um rosto sequencialmente 5 quadros. Em seguida, mostra os resultados em 5 segundos.
DeepFace . stream ( db_path = "C:/User/Sefik/Desktop/database" )
Embora o reconhecimento facial seja baseado no aprendizado único, você também pode usar várias imagens faciais de uma pessoa. Você deve reorganizar sua estrutura de diretórios conforme ilustrado abaixo.
user
├── database
│ ├── Alice
│ │ ├── Alice1.jpg
│ │ ├── Alice2.jpg
│ ├── Bob
│ │ ├── Bob.jpg
React UI - Demo part-i
, Demo part-ii
Se você pretende realizar tarefas de verificação facial diretamente de seu navegador, deepface-react-ui é um repositório separado construído usando ReactJS dependendo da API deepface.
Face Anti-Spoofing - Demo
DeepFace também inclui um módulo de análise anti-spoofing para entender se uma determinada imagem é real ou falsa. Para ativar esse recurso, defina o argumento anti_spoofing
como True em qualquer tarefa do 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 também serve uma API - consulte api folder
para obter mais detalhes. Você pode clonar o código-fonte do deepface e executar a API com o seguinte comando. Ele usará o servidor gunicorn para ativar um serviço de descanso. Dessa forma, você pode chamar o deepface de um sistema externo, como um aplicativo móvel ou web.
cd scripts
./service.sh
Reconhecimento facial, análise de atributos faciais e funções de representação vetorial são abordadas na API. Espera-se que você chame essas funções como métodos de postagem http. Os endpoints de serviço padrão serão http://localhost:5005/verify
para reconhecimento facial, http://localhost:5005/analyze
para análise de atributos faciais e http://localhost:5005/represent
para representação vetorial. A API aceita imagens como uploads de arquivos (por meio de dados de formulário) ou como caminhos exatos de imagem, URLs ou strings codificadas em base64 (por meio de JSON ou dados de formulário), fornecendo opções versáteis para diferentes requisitos do cliente. Aqui você pode encontrar um projeto postman para descobrir como esses métodos devem ser chamados.
Serviço Dockerizado – Demo
O conjunto de comandos a seguir servirá deepface em localhost:5005
via docker. Então, você poderá consumir serviços deepface como verificar, analisar e representar. Além disso, se você deseja construir a imagem por conta própria, em vez de uma imagem pré-construída no docker hub, o Dockerfile está disponível na pasta raiz do projeto.
# 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
Interface de linha de comando - Demo
DeepFace também vem com uma interface de linha de comando. Você pode acessar suas funções na linha de comando conforme mostrado abaixo. O comando deepface espera o nome da função como primeiro argumento e os argumentos da função depois disso.
# 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
Você também pode executar esses comandos se estiver executando o deepface com docker. Por favor, siga as instruções no script de shell.
Reconhecimento facial em grande escala - Playlist
Se sua tarefa exigir reconhecimento facial em grandes conjuntos de dados, você deverá combinar o DeepFace com um índice vetorial ou banco de dados vetorial. Esta configuração realizará pesquisas aproximadas de vizinhos mais próximos em vez de pesquisas exatas, permitindo identificar um rosto em um banco de dados contendo bilhões de entradas em milissegundos. Soluções comuns de índice vetorial incluem Annoy, Faiss, Voyager, NMSLIB, ElasticSearch. Para bancos de dados vetoriais, as opções populares são Postgres com sua extensão pgvector e RediSearch.
Por outro lado, se sua tarefa envolve reconhecimento facial em bancos de dados de tamanho pequeno a moderado, você pode adotar o uso de bancos de dados relacionais, como Postgres ou SQLite, ou bancos de dados NoSQL, como Mongo, Redis ou Cassandra, para realizar pesquisas exatas no vizinho mais próximo.
Solicitações pull são mais que bem-vindas! Se você está planejando contribuir com um patch grande, crie um problema primeiro para esclarecer quaisquer dúvidas iniciais ou decisões de design.
Antes de criar um PR, você deve executar os testes de unidade e linting localmente executando o comando make test && make lint
. Assim que um PR for enviado, o fluxo de trabalho de teste do GitHub será executado automaticamente e os trabalhos de teste de unidade e linting estarão disponíveis nas ações do GitHub antes da aprovação.
Há muitas maneiras de apoiar um projeto - estrelar️ o repositório GitHub é apenas uma
Se você gosta deste trabalho, você pode apoiá-lo financeiramente no Patreon, GitHub Sponsors ou Buy Me a Coffee.
Além disso, o logotipo da sua empresa será mostrado no README no GitHub e PyPI se você se tornar um patrocinador nas camadas ouro, prata ou bronze.
Por favor, cite deepface em suas publicações se isso ajudar em sua pesquisa - veja CITATIONS
para mais detalhes. Aqui estão suas entradas BibTex:
Se você usa deepface em sua pesquisa para fins de reconhecimento facial ou detecção facial, cite estas publicações:
@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 outro lado, se você usa deepface em sua pesquisa para fins de análise de atributos faciais, como idade, gênero, emoção ou tarefas de previsão de etnia, cite esta publicação.
@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 }
}
Além disso, se você usa deepface em seus projetos GitHub, adicione deepface
em requirements.txt
.
DeepFace é licenciado sob a licença MIT - consulte LICENSE
para obter mais detalhes.
DeepFace envolve alguns modelos externos de reconhecimento facial: VGG-Face, Facenet (128d e 512d), OpenFace, DeepFace, DeepID, ArcFace, Dlib, SFace e GhostFaceNet. Além disso, modelos de idade, gênero e raça/etnia foram treinados na espinha dorsal do VGG-Face com aprendizagem por transferência. Da mesma forma, DeepFace envolve muitos detectores faciais: OpenCv, Ssd, Dlib, MtCnn, Fast MtCnn, RetinaFace, MediaPipe, YuNet, Yolo e CenterFace. Por fim, o DeepFace usa opcionalmente anti-spoofing facial para determinar se as imagens fornecidas são reais ou falsas. Os tipos de licença serão herdados quando você pretender utilizar esses modelos. Verifique os tipos de licença desses modelos para fins de produção.
O logotipo DeepFace foi criado por Adrien Coquet e está licenciado sob Creative Commons: By Attribution 3.0 License.