Maison  >  Article  >  développement back-end  >  Explication détaillée d'exemples de reconnaissance faciale implémentés par OpenCV en python

Explication détaillée d'exemples de reconnaissance faciale implémentés par OpenCV en python

Y2J
Y2Joriginal
2017-04-27 11:27:244880parcourir

Cet article présente principalement les informations pertinentes sur l'utilisation d'opencv pour implémenter la reconnaissance faciale en Python. A une très bonne valeur de référence. Jetons-y un coup d'oeil avec l'éditeur ci-dessous

Les principales étapes sont les suivantes :

Détection de visage

2. Prétraitement des visages

3. Entraînement de l'algorithme d'apprentissage automatique à partir des visages collectés

4. Reconnaissance faciale

5. Travaux de finition

Algorithme de détection de visage :

L'idée de base du détecteur de visage basé sur Haar est que pour la plupart des zones du devant du visage, la zone où se trouvent les yeux doit être plus foncée que le front et les joues, et la bouche doit être plus foncée que les joues, etc. Il effectue généralement une vingtaine de ces comparaisons pour décider si l’objet détecté est un visage, souvent des milliers de fois en fait.

L'idée de base du détecteur de visage basé sur LBP est similaire à celle du détecteur de visage basé sur Haar, mais il compare les histogrammes de luminosité des pixels, par exemple, les histogrammes de bords, de coins et de zones plates.

Ces deux détecteurs de visages peuvent trouver des visages en entraînant de grands ensembles d'images, qui sont stockés dans des fichiers XML en opencv pour une utilisation ultérieure.

Ces détecteurs de classification en cascade nécessitent généralement au moins 1 000 images de visage uniques et 10 000 images de non-visage pour la formation. Le temps de formation prend généralement plusieurs heures pour la LBP et

Haar nécessite une semaine.

Les codes clés du projet sont les suivants :

initDetectors
faceCascade.load(faceCascadeFilename);
eyeCascade1.load(eyeCascadeFilename1);
eyeCascade2.load(eyeCascadeFilename2);

initWebcam
videoCapture.open(cameraNumber);

cvtColor(img, gray, CV_BGR2GRAY);
//有需要则缩小图片使检测运行更快,之后要恢复原来大小
resize(gray, inputImg, Size(scaledWidth, scaledHeight));
equalizeHist(inputImg, equalizedImg);
cascade.detectMultiScale(equalizedImg......);

Prétraitement du visage :

En pratique, généralement une formation (collecte d'images) et les tests (les images des images de la caméra) seront très différents en raison de (par exemple l'éclairage, l'orientation du visage, l'expression, etc.)

les résultats seront médiocres, l'ensemble de données utilisé pour la formation est donc important.

Le but du prétraitement des visages est de réduire ces problèmes et de contribuer à améliorer la fiabilité de l'ensemble du système de reconnaissance faciale.

La forme la plus simple de prétraitement des visages consiste à utiliser la fonction égalizeHist() pour l'égalisation de l'histogramme, ce qui est la même que l'étape de détection des visages.

En pratique, afin de rendre l'algorithme de détection plus fiable, la détection des traits du visage (telle que la détection des yeux, du nez, de la bouche et des sourcils) est utilisée. Ce projet utilise uniquement la détection des yeux.

Utilisez le détecteur oculaire entraîné fourni avec OpenCV. Par exemple, une fois la détection du visage frontal terminée, un visage est obtenu et le détecteur oculaire est utilisé pour extraire la zone de l'œil gauche et la zone de l'œil droit du visage, et une égalisation de l'histogramme est effectuée sur chaque zone des yeux.

Les opérations impliquées dans cette étape sont les suivantes :

1. Transformation géométrique et recadrage

L'alignement du visage est très important, faites pivoter le visage pour que les yeux restent horizontaux, redimensionnez le visage pour que la distance entre les yeux soit toujours la même, traduisez le visage pour que les yeux soient toujours centrés horizontalement à la hauteur souhaitée,

recadrer la périphérie du visage (comme le fond de l'image, les cheveux, le front, les oreilles et le menton).

2. Utilisez l'égalisation de l'histogramme sur les côtés gauche et droit du visage respectivement

3. >Utilisez un filtre bilatéral pour réduire le bruit de l'image

4. Masque elliptiqueMettez les cheveux restants et suppression de l'arrière-plan de l'image du visage

Les codes clés du projet sont les suivants :

detectBothEyes(const Mat &face, CascadeClassifier &eyeCascade1, CascadeClassifier &eyeCascade2,
Point &leftEye, Point &rightEye, Rect *searchedLeftEye, Rect *searchedRightEye);
topLeftOfFace = face(Rect(leftX, topY, widthX, heightY));
//在左脸区域内检测左眼
detectLargestObject(topLeftOfFace, eyeCascade1, leftEyeRect, topLeftOfFace.cols);
//右眼类似,这样眼睛中心点就得到了
leftEye = Point(leftEyeRect.x + leftEyeRect.width/2, leftEyeRect.y + leftEyeRect.height/2);
//再得到两眼的中点,然后计算两眼之间的角度
Point2f eyesCenter = Point2f( (leftEye.x + rightEye.x) * 0.5f, (leftEye.y + rightEye.y) * 0.5f );
//仿射扭曲(Affine Warping)需要一个仿射矩阵
rot_mat = getRotationMatrix2D(eyesCenter, angle, scale);
//现在可变换人脸来得到检测到的双眼出现在人脸的所需位置
warpAffine(gray, warped, rot_mat, warped.size());

//先对人脸左侧和右侧分开进行直方图均衡
equalizeHist(leftSide, leftSide);
equalizeHist(rightSide, rightSide);
//再合并,这里合并时左侧1/4和右侧1/4直接取像素值,中间的2/4区域像素值通过一定计算进行处理。

//双边滤波
bilateralFilter(warped, filtered, 0, 20.0, 2.0);

//采用椭圆掩码来删除一些区域
filtered.copyTo(dstImg, mask);
Collecter et entraîner les visages :

Une bonne donnée L'ensemble doit contenir divers scénarios de transformations de visage qui peuvent apparaître dans l'ensemble de formation. Si vous testez uniquement les visages frontaux, vous n'avez besoin que d'avoir des visages frontaux complets dans les images d'entraînement.

Ainsi, un bon ensemble de formation doit contenir de nombreuses situations réelles.

Ce projet collecte des images espacées d'au moins une seconde et utilise un critère d'évaluation d'erreur relative basé sur la norme L2 pour comparer la similarité entre les pixels des deux images.

Comparez-le ensuite avec le seuil de collecte de nouveaux visages pour décider de collecter ou non cette image.
errorL2 = norm(A, B, CV_L2);
similarity = errorL2 / (double)(A.rows * A.cols);

De nombreuses techniques peuvent être utilisées pour obtenir plus de données d'entraînement, telles que l'utilisation de visages en miroir, l'ajout de bruit aléatoire, la modification de certains pixels de l'image du visage, la rotation, etc.

Après avoir collecté suffisamment d'images de visage pour chaque personne, vous devez ensuite choisir un algorithme d'apprentissage automatique adapté à la reconnaissance faciale et l'utiliser pour apprendre les données collectées afin d'entraîner un système de reconnaissance faciale.
//翻转
flip(preprocessedFace, mirroredFace, 1);

Algorithme de reconnaissance faciale :

1. Eigenface, également appelé PCA (analyse en composantes principales)

2. Visage de Fisher, également connu sous le nom de LDA (analyse discriminante linéaire)

3. Histogrammes de motifs (LBPH) Autres algorithmes de reconnaissance faciale : www.face-rec.org/algorithms/

OpenCV fournit la classe CV::Algorithm, cette classe a plusieurs différents algorithmes, et vous pouvez utiliser l'un de ces algorithmes pour compléter une reconnaissance faciale simple et universelle.

Il existe une classe FaceRecognizer dans le modèle de contribution d'OpenCV, qui implémente les algorithmes de reconnaissance faciale ci-dessus.

Ce code exécutera l'intégralité de l'algorithme d'entraînement pour la reconnaissance faciale sélectionnée.
initModule_contrib();
model = Algorithm::create<FaceRecognizer>(facerecAlgorithm);

model->train(preprocessedFaces, faceLabels);

Reconnaissance faciale :

1. Reconnaissance faciale : Identifiez la personne par son visage

Vous pouvez simplement appeler la fonction FaceRecognizer::predict() pour identifier la personne sur la photo ,

int identity = model->predict(preprocessedFace);

Le problème que cela pose est qu'il peut toujours prédire une personne donnée (même si l'image d'entrée n'appartient pas à la personne dans l'ensemble de formation).

La façon de résoudre ce problème est d'établir une norme de confiance. Si la confiance est trop faible, il peut être jugé qu'il s'agit d'une personne inconnue.

2. Vérification du visage : Vérifiez s'il y a la personne que vous recherchez dans l'image

Afin de vérifier si elle est fiable , ou si le système peut correctement Corriger l'identification d'une personne inconnue nécessite une vérification du visage.

La méthode de calcul de la confiance ici est la suivante :

Utilisez des vecteurs propres et des valeurs propres pour reconstruire l'image du visage, puis comparez l'image d'entrée avec l'image reconstruite. Si une personne a plusieurs images de visage dans l'ensemble d'entraînement, la reconstruction avec des vecteurs de caractéristiques et des valeurs de caractéristiques

devrait donner de très bons résultats. Sinon, il y aura une grande différence, indiquant qu'il peut s'agir d'une inconnue. personne.

La fonction subspaceProject() mappe l'image du visage à l'espace des fonctionnalités, puis utilise la fonction subspaceReconstruct() pour reconstruire l'image à partir de l'espace des fonctionnalités.

Finition : interface graphique interactive

En utilisant les fonctions OpenCV, il est facile de dessiner certains composants, clics de souris, etc.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn