Système de reconnaissance faciale simple basé sur OpenCV


Clause de non-responsabilité: Ce programme est basé sur la programmation du module OpenCV de Python, utilisant le détecteur de visage et le reconnaissance de visage existants d'opencv pour la reconnaissance faciale en temps réel

1. Appeler les fonctions de la bibliothèque

import cv2
import numpy as np

2. Appelez la caméra et réglez la fenêtre

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

3. Définissez le chemin de l'ensemble de données d'échantillon positif et négatif d'image

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

4. Appelez le détecteur de visage

Remarque: le reconnaissance de visage est installé lorsque la bibliothèque opencv est installée et se trouve sous le chemin d'installation d'opencv.

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

5. Chargement des échantillons positifs et négatifs

Étant donné que les données de visage de cet ensemble de données sont obtenues en traitant la vidéo par le programme, il est pratique de les importer dans le programme par lots.

Le rapport de l'échantillon positif (face) à l'échantillon négatif (environnement) est d'environ 1: 3. On dit que ce rapport fonctionne bien, l'étiquette est 0,1.
La déclaration d'importation est la suivante:

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. Extraire la zone du visage

Ici, aucun traitement n'est effectué sur les images où la zone du visage n'est pas détectée. Pour la zone du visage, environ 20 pixels autour d'elle sont extraits

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. Établir un modèle de reconnaissance faciale LBPH

Le module de reconnaissance faciale LBPH est utilisé ici, car cette méthode ne nécessite pas que l'ensemble de données d'image ait une taille uniforme, et les modules EigenFaces et Fisherfaces nécessitent tous deux que l'image de l'ensemble d'apprentissage et la taille de l'image de test soient cohérentes.

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

8. Détection en temps réel

Dans la détection de visage, si aucun visage n'est détecté, le visage renvoyé est un tuple vide. Une fois le visage détecté, la zone du visage est extraite et la reconnaissance du visage est utilisée pour la reconnaissance. Pour la valeur renvoyée de confiance, le résultat est inférieur à 50. Fiable, mais supérieur à 80 est considéré comme une plus grande différence.

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. Résultats des tests

Il peut essentiellement réaliser la fonction de reconnaissance faciale spécifique.

10. Lacunes

  1. Pas de section de formation et de section de détection distinctes, entraînant à chaque fois un recyclage, ne consomment qu'un certain temps, actuellement seulement une reconnaissance; - Résolu
  2. Puisque les données sont une image dérivée de la vidéo, elles n'ont pas traité les situations de visage non détectées qui peuvent exister dans l'ensemble d'apprentissage;
  3. La taille de toutes les images n'a pas été redimensionnée à une taille uniforme, donc le module LBPH ne peut être utilisé que pour la reconnaissance faciale. Cependant, d'un autre côté, l'utilisation de cv2.resize peut poser le problème du déséquilibre du rapport d'image et de la perte d'effet d'entraînement;
  4. De plus, pour les échantillons négatifs, seules les images d'arrière-plan sont utilisées et les objets peuvent être essayés plus tard.
    En bref, seule une simple fonction de reconnaissance faciale en temps réel a été mise en œuvre à l'heure actuelle, et il sera temps de l'améliorer plus tard.

11. Méthodes d'amélioration

  1. La phrase suivante peut enregistrer et lire le modèle entraîné, de sorte que la partie formation peut être séparée de la partie reconnaissance
recognizer = cv2.face.LBPHFaceRecognizer_create()

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

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45371989/article/details/107707761
conseillé
Classement