Opencv project combat: 07 reconocimiento facial y sistema de asistencia

1. Visualización de efectos

Reconocimiento facial:

fafb42116b9e4342b317665d63394fb0.gif

Efecto de asistencia:

2c09a39d7e05411ebb0c69ca20935732.png

 

2. Introducción del proyecto

A continuación, aprenderemos cómo realizar el reconocimiento facial con alta precisión, comenzando con una breve introducción a la teoría y aprendiendo la implementación básica. Luego, crearemos un proyecto de asistencia que usará una cámara web para detectar rostros y registrar la asistencia en tiempo real en una hoja de Excel.

3. Teoría básica del proyecto

(1) Construcción del paquete del proyecto

Antes de eso, debería haber leído este artículo y completado la construcción del paquete del proyecto (37 mensajes) La forma más fácil para que Python 3.7 resuelva el problema de descargar dlib y face_recognition

Además, también necesitamos instalar un paquete, solo sigue los pasos:

pip install face_recognition_models

(2) Construcción de archivos

7cde9cce89c74e128806652830afa324.png

De acuerdo con la configuración que se muestra en la figura, el contenido en el archivo Attendance.csv es solo (Nombre, Hora).En el archivo Attendance_images, puede agregar las imágenes que desee agregar, preferiblemente imágenes de personajes individuales, y nombrar las imágenes con sus nombres en inglés.

(3) visualización y explicación del código basic.py

import cv2
import face_recognition

imgElon = face_recognition.load_image_file('ImagesBasic/Elon Musk.png')
imgElon = cv2.cvtColor(imgElon, cv2.COLOR_BGR2RGB)
imgTest = face_recognition.load_image_file('ImagesBasic/Elon test.png')
imgTest = cv2.cvtColor(imgTest, cv2.COLOR_BGR2RGB)

faceLoc = face_recognition.face_locations(imgElon)[0]
encodeElon = face_recognition.face_encodings(imgElon)[0]
cv2.rectangle(imgElon, (faceLoc[3], faceLoc[0]), (faceLoc[1], faceLoc[2]), (255, 0, 255), 2)

faceLocTest = face_recognition.face_locations(imgTest)[0]
encodeTest = face_recognition.face_encodings(imgTest)[0]
cv2.rectangle(imgTest, (faceLocTest[3], faceLocTest[0]), (faceLocTest[1], faceLocTest[2]), (255, 0, 255), 2)

results = face_recognition.compare_faces([encodeElon], encodeTest)
faceDis = face_recognition.face_distance([encodeElon], encodeTest)
print(results, faceDis)
cv2.putText(imgTest, f'{results} {round(faceDis[0], 2)}', (50, 50), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 0, 255), 2)

cv2.imshow('Elon Musk', imgElon)
cv2.imshow('Elon Test', imgTest)
cv2.waitKey(0)

Usaremos la imagen del Sr. Musk como prueba estándar, 'Elon Musk.png'. Las otras dos fotos son del Sr. Bill Gates y el Sr. Musk.

La explicación de hoy se dividirá en dos partes, esta es la parte básica de la explicación.

  • Primero, importe las imágenes en estos dos códigos. Usamos la función load_image_file en face_recognition, que cargará el archivo de imagen (.jpg, .png, etc.) en una matriz numérica, y el modo predeterminado = formato 'RGB', así que hay una transformación aquí.
  • En segundo lugar, faceLoc acepta la matriz de cuadros delimitadores de la cara en la imagen devuelta por la función face_locations(), consulte la Nota 1, tome el primer número, esperará hasta una tupla, tenemos que presionar css (arriba, derecha, abajo , izquierda ) lista de tuplas de posiciones de rostro encontradas secuencialmente. La función encodeElon() devuelve una lista de codificación de caras de 128 dimensiones (una para cada cara de la imagen), ¿por qué tiene 128 dimensiones? Ver Nota 2. Después de esto, es la operación del marco de nuevo. Creo que los que han leído mis artículos anteriores deben estar demasiado familiarizados. Ingrese las coordenadas de acuerdo con la Nota 3.
  • Después de eso, compare_faces() compara la lista de codificaciones faciales con las codificaciones candidatas para ver si coinciden, recuerde, solo la primera es una lista, que devolverá una lista de valores verdaderos/falsos; face_distance() requiere una codificación facial determinada lista, compárela con codificaciones de caras conocidas y obtenga la distancia euclidiana para cada cara comparada. La distancia te dirá qué tan similares son las caras. Nuevamente, solo el primero es una lista. Véase la Nota 4 anterior.
  • Finalmente, coloque la información enmarcada en un lugar adecuado para mostrar la imagen.

Nota 1: [(44, 306, 152, 199)]

Nota 2: ¡El aprendizaje automático es divertido! Parte 4: Reconocimiento facial moderno y aprendizaje profundo - Ranking Fintech (fintechranking.com) por Adam Geitgey  .

Nota 3: diagrama de coordenadas

2e2024a3f83d4c16975004f7d2180630.png

Nota 4: [Verdadero] [0.4559636]

 (5) Visualización de efectos

aaf56405413c4224bc77000eea0a7589.png

 Al modificar el código aquí, implementamos inicialmente el reconocimiento facial.

imgTest = face_recognition.load_image_file('ImagesBasic/Bill Gates.png')
imgTest = cv2.cvtColor(imgTest, cv2.COLOR_BGR2RGB)

fa0b34327a0f44978af4a73a52526125.png

 

4. Visualización y explicación del código del proyecto

import cv2
import numpy as np
import face_recognition
import os
from datetime import datetime

# from PIL import ImageGrab

path = 'Attendance_images'
images = []
classNames = []
myList = os.listdir(path)
print(myList)
for cl in myList:
    curImg = cv2.imread(f'{path}/{cl}')
    images.append(curImg)
    classNames.append(os.path.splitext(cl)[0])
print(classNames)


def findEncodings(images):
    encodeList = []
    for img in images:
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        encode = face_recognition.face_encodings(img)[0]
        encodeList.append(encode)
    return encodeList


def markAttendance(name):
    with open('Attendance_lists.csv', 'r+') as f:
        myDataList = f.readlines()
        nameList = []
        for line in myDataList:
            entry = line.split(',')
            nameList.append(entry[0])
        if name not in nameList:
            now = datetime.now()
            dtString = now.strftime('%H:%M:%S')
            f.writelines(f'\n{name},{dtString}')


#### FOR CAPTURING SCREEN RATHER THAN WEBCAM
# def captureScreen(bbox=(300,300,690+300,530+300)):
#     capScr = np.array(ImageGrab.grab(bbox))
#     capScr = cv2.cvtColor(capScr, cv2.COLOR_RGB2BGR)
#     return capScr

encodeListKnown = findEncodings(images)
print('Encoding Complete')

cap = cv2.VideoCapture(1)

while True:
    success, img = cap.read()
    # img = captureScreen()
    imgS = cv2.resize(img, (0, 0), None, 0.25, 0.25)
    imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)

    facesCurFrame = face_recognition.face_locations(imgS)
    encodesCurFrame = face_recognition.face_encodings(imgS, facesCurFrame)

    for encodeFace, faceLoc in zip(encodesCurFrame, facesCurFrame):
        matches = face_recognition.compare_faces(encodeListKnown, encodeFace)
        faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)
        # print(faceDis)
        matchIndex = np.argmin(faceDis)

        if matches[matchIndex]:
            name = classNames[matchIndex].upper()
            # print(name)
            y1, x2, y2, x1 = faceLoc
            y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4
            cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.rectangle(img, (x1, y2 - 35), (x2, y2), (0, 255, 0), cv2.FILLED)
            cv2.putText(img, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
            markAttendance(name)


    cv2.imshow('Webcam', img)
    cv2.waitKey(1)

Algunas de las operaciones aquí han sido mencionadas en mi blog anterior, y lo he explicado muy claramente, por lo que hablaré brevemente al respecto.

  • Primero, lea el nombre de la imagen en el archivo Attendance_images, tenga en cuenta que tiene .png y nuestro nombre no lo requiere, así que tome un [0].
  • En segundo lugar, escriba findEncodings() para almacenar las codificaciones de imágenes estándar, en forma de lista. La función markAttendance() se usa para leer la información del archivo de Attendance_lists.csv y escribirla en Excel, donde también se puede escribir la hora.
  • Entonces, por lo demás, creo que no debería haber problema en referirse a la explicación anterior. Hablemos de y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4, por qué multiplicar por 4, recuerda el cambio de tamaño anterior, no requiere cambios de píxeles, pero se encoge La proporción es exactamente 0.25.

 

5. Materiales del proyecto

Github: Opencv-project-training/Opencv project training/07 Sistema de asistencia y reconocimiento facial en principal · Auorui/Opencv-project-training · GitHub

 

6. Resumen del proyecto

El proyecto de hoy es aún más difícil que la detección de objetos anterior. Para mí, la eficiencia actual no es muy alta. La descarga de los paquetes dlib y face_recognition ayer realmente no se hizo. Cambié un proyecto temporalmente y lo hice hoy mucho tiempo. .

¡Así que espero que te diviertas con este proyecto! !

f95ce6a2ac5047c7beb428f01ad37338.jpeg

 

 

Supongo que te gusta

Origin blog.csdn.net/m0_62919535/article/details/126679859
Recomendado
Clasificación