Sistema de reconocimiento facial simple basado en OpenCV


Descargo de responsabilidad: este programa se basa en la programación del módulo OpenCV de Python, utilizando el detector facial y el reconocedor facial existentes de opencv para el reconocimiento facial en tiempo real

1. Funciones de la biblioteca de llamadas

import cv2
import numpy as np

2. Llame a la cámara y configure la ventana

frameWidth = 640
frameHeight = 480
cap = cv2.VideoCapture(0)
cap.set(3, frameWidth)      #设置参数,10为亮度
cap.set(4, frameHeight)
cap.set(10,150)

3. Establezca la ruta del conjunto de datos de muestra positivo y negativo de la imagen

pos_path = './resource/face_detect/video2imagem3/'
neg_path = './resource/face_detect/video2imagec1/'
test_path = './resource/face/'
images = []
labels = []

4. Invocar el detector facial

Nota: El reconocedor de rostros se instala cuando se instala la biblioteca opencv y se puede encontrar en la ruta de instalación de opencv.

faceCascade = cv2.CascadeClassifier("resource/haarcascade_frontalface_default.xml")

5. Carga de muestras positivas y negativas

Dado que los datos faciales de este conjunto de datos se obtienen procesando el video por el programa, es conveniente importarlos al programa en lotes.

La relación entre la muestra positiva (cara) y la muestra negativa (ambiente) es aproximadamente 1: 3. Se dice que esta relación funciona bien, la etiqueta es 0,1.
La declaración de importación es la siguiente:

for i in range(60):         # 正样本
    images.append(cv2.imread(pos_path+str(2*(i+1))+'.jpg',cv2.IMREAD_GRAYSCALE))
    labels.append(0)

for i in range(173):        # 负样本
    images.append(cv2.imread(neg_path+str(2*(i+1))+'.jpg',cv2.IMREAD_GRAYSCALE))
    labels.append(1)

6. Extrae el área de la cara

Aquí, no se realiza ningún procesamiento en las imágenes donde no se detecta el área de la cara. Para el área de la cara, se extraen aproximadamente 20 píxeles a su alrededor

def processing(imageslist):
    for j in range(len(imageslist)):
        faces = faceCascade.detectMultiScale(imageslist[j], 1.1, 4)
        for x,y,w,h in faces:
            if x >= 20 and y >= 20:		# 未处理没检测到人脸的情况
               imageslist[j] = imageslist[j][y-20:y+h+20, x-20:x+w+20]
    return imageslist

7. Establecer un modelo de reconocimiento facial de LBPH

El módulo de reconocimiento facial LBPH se usa aquí, porque este método no requiere que el conjunto de datos de imagen tenga un tamaño uniforme, y los módulos EigenFaces y Fisherfaces requieren que la imagen del conjunto de entrenamiento y el tamaño de la imagen de prueba sean consistentes.

imagesCopy = images
# 提取图像中人脸的区域
imagesCopy = processing(imagesCopy)
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.train(imagesCopy, np.array(labels))

8. Detección en tiempo real

En la detección de rostros, si no se detecta ningún rostro, el rostro devuelto es una tupla vacía. Después de que se detecta el rostro, se extrae el área del rostro y se utiliza Recognizer.predict para el reconocimiento. Para el valor de retorno de confianza, el resultado es menos de 50. Fiable, pero superior a 80 se considera una diferencia mayor.

while True:
    success,img = cap.read()
    predict_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    face = faceCascade.detectMultiScale(predict_image, 1.1, 4)
    # print(face)     # 空的元组有可能
    if face != ():
        for x, y, w, h in face:
            if x >= 20 and y >= 20:
                faceArea = predict_image[y-20:y+h+20, x-20:x+w+20]
                cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 1)
                label, confidence = recognizer.predict(faceArea)
                if confidence <= 80 and label == 0:
                    cv2.putText(img, "LQL",(x, y-20), cv2.FONT_HERSHEY_COMPLEX, 1,(255,0,0,1))
                    print("YOU ARE LQL")
                else:
                    cv2.putText(img, "OTHERS", (x, y-20), cv2.FONT_HERSHEY_COMPLEX, 1,(255,0,0),1)
                    print("OTHERS")
                    print(confidence)
                    print(label)
    else:
        cv2.putText(img, "None", (320, 240), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 0, 255), 1)
        print("None")
    cv2.imshow("img", img)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

9. Resultados de la prueba

Básicamente, puede realizar la función de reconocimiento facial específico.

10. Deficiencias

  1. Ninguna sección de entrenamiento separada y sección de detección, cada vez que resulta en reentrenamiento, consume una cierta cantidad de tiempo, en la actualidad solo un reconocimiento; - Resuelto
  2. Dado que los datos son una imagen derivada del video, no se han ocupado de las situaciones faciales no detectadas que pueden existir en el conjunto de entrenamiento;
  3. El tamaño de todas las imágenes no se ha cambiado a un tamaño uniforme, por lo que el módulo LBPH solo se puede utilizar para el reconocimiento facial. Sin embargo, por otro lado, el uso de cv2.resize puede tener el problema del desequilibrio de la relación de imagen y la pérdida del efecto de entrenamiento;
  4. Además, para las muestras negativas, solo se utilizan imágenes de fondo y los objetos se pueden probar más tarde.
    En resumen, en la actualidad solo se ha implementado una función simple de reconocimiento facial en tiempo real, y habrá tiempo para mejorarla más adelante.

11. Métodos de mejora

  1. La siguiente oración puede guardar y leer el modelo entrenado, por lo que la parte de capacitación se puede separar de la parte de reconocimiento
recognizer = cv2.face.LBPHFaceRecognizer_create()

recognizer.save('./resource/face_detect/MyFaceModel.xml')
recognizer.read('./resource/face_detect/MyFaceModel.xml')

Supongo que te gusta

Origin blog.csdn.net/weixin_45371989/article/details/107707761
Recomendado
Clasificación