1. Visualización de efectos
Reconocimiento facial:
Efecto de asistencia:
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
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
Nota 4: [Verdadero] [0.4559636]
(5) Visualización de efectos
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)
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
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! !