Python implementa reconhecimento facial (face_recognition)

1. Definição

1. Introdução

Este projeto é a biblioteca de reconhecimento facial mais poderosa e concisa do mundo. Você pode usar Python e ferramentas de linha de comando para extrair, reconhecer e operar rostos.
O reconhecimento facial neste projeto é baseado no modelo de aprendizado profundo da biblioteca de código aberto C++ líder do setor, dlib. Ele foi testado com o conjunto de dados faciais Labeled Faces in the Wild e alcançou uma precisão de até 99,38%. No entanto, a precisão do reconhecimento de crianças e rostos asiáticos precisa de ser melhorada.
Labeled Faces in the Wild é um conjunto de dados faciais produzido pela Universidade de Massachusetts Amherst. O conjunto de dados contém mais de 13.000 imagens faciais coletadas da Internet.

github e URL do site oficial:

https://github.com/ageitgey/face_recognition/blob/master/README_Simplified_Chinese.md
https://face-recognition.readthedocs.io/en/latest/face_recognition.html

2. Etapas de reconhecimento facial:

1) Detecção de rosto

Para reconhecer rostos, primeiro você precisa encontrar a localização de todos os rostos nas imagens ou quadros de vídeo e recortar as partes dos rostos da imagem.

O histograma de gradientes orientados (HOG) pode ser usado para detectar a posição do rosto. A imagem é primeiro em escala de cinza, porque a cor não desempenha um papel significativo na localização da posição do rosto, e então o gradiente de cada pixel da imagem é calculado.

Ao transformar a imagem no formato HOG, podemos extrair as características da imagem e obter a posição do rosto.

2) Alinhamento facial

Um rosto em uma imagem pode estar inclinado ou simplesmente de perfil. Para codificar faces facilmente, as faces precisam estar alinhadas no mesmo formato padrão.


A primeira etapa no alinhamento da face é estimar os pontos característicos da face. Dlib possui funções e modelos especializados que podem localizar 68 pontos característicos de um rosto humano.


Depois de encontrar os pontos característicos, você pode alinhar cada ponto característico (mover os olhos, boca, etc. para a mesma posição) por meio da transformação geométrica da imagem (afim, rotação, dimensionamento).

3) Codificação facial


Treine uma rede neural para gerar previsões de 128 dimensões a partir de imagens faciais de entrada.
O processo geral de treinamento é: alimentar duas fotos diferentes da mesma pessoa e uma foto de outra pessoa na rede neural e treinar continuamente de forma iterativa, de modo que os valores previstos após a codificação das duas fotos da mesma pessoa sejam próximos , e os valores previstos das fotos de diferentes pessoas são menores. Ou seja, a distância intraclasse é reduzida e a distância interclasse aumenta. Para algoritmos específicos, consulte facenet[3].

4) Identificação

Coloque os rostos de todos no banco de dados de rostos com antecedência e use a rede neural mencionada acima para codificá-los em 128 dimensões e salvá-los. Durante o reconhecimento, o rosto é previsto como um vetor de 128 dimensões e comparado com os dados do banco de dados facial.

Existem muitos métodos de comparação, você pode encontrar diretamente o rosto com a menor distância euclidiana dentro da faixa de limite ou treinar um terminal SVM ou classificador knn para gerar diretamente o codinome (identidade) da pessoa.
Para o método de construção do classificador knn, consulte este código .

O código geral para usar Python para implementar o reconhecimento facial pode ser encontrado em Usando OpenCV, Python e Deep Learning para reconhecimento facial .

2. Implementação através de código python

1. Instalação

1) Instale o dlib em python3.10 no sistema Windows 

Steins-Gate-Divergence-Meter-Clock-VisitorCounter/dlib-19.22.99-cp310-cp310-win_amd64.whl at main · longsongline/Steins-Gate-Divergence-Meter-Clock-VisitorCounter · GitHub

2) Instale a biblioteca face_recognition

pip3 install face_recognition

2. Casos de código 

# coding=utf-8
import sys
import cv2
from PIL import Image,ImageDraw,ImageFont
import numpy as np
import face_recognition

# 加载已知人脸图像
known_image = face_recognition.load_image_file("know_img.jpg")

# 提取已知人脸的编码
known_face_encoding = face_recognition.face_encodings(known_image)[0]

# 初始化摄像头
video_capture = cv2.VideoCapture(0)

def cv2AddChineseText(frame, name, position, fill):
    font = ImageFont.truetype('simsun.ttc', 30)
    img_pil = Image.fromarray(frame)
    draw = ImageDraw.Draw(img_pil)
    draw.text(position, name, font=font, fill=fill)
    return np.array((img_pil))

while True:
    # 读取摄像头中的图像
    ret, frame = video_capture.read()

    # 将图像转换为RGB格式
    rgb_frame = frame[:, :, ::-1]

    # 检测图像中的人脸
    face_locations = face_recognition.face_locations(rgb_frame)
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    # 在图像中标记人脸位置
    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
        # 判断检测到的人脸是否和已知人脸匹配
        matches = face_recognition.compare_faces([known_face_encoding], face_encoding, tolerance=0.38)

        # 如果匹配,则标记人脸为已知人脸
        name = "unknow"
        if True in matches:
            name = "know"

        # 在图像中标记人脸位置和姓名
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
        # cv2.putText(frame, name, (left + 6, bottom - 6), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 1)
        frame = cv2AddChineseText(frame, name, (left, top - 38), (0, 0, 255))
        

    # 显示图像
    cv2.imshow('Video', frame)

    # 按下q键退出程序
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头
video_capture.release()

# 关闭所有窗口
cv2.destroyAllWindows()

Acho que você gosta

Origin blog.csdn.net/m0_68949064/article/details/130243639
Recomendado
Clasificación