Opencv Advanced 10-Description et exemples de principes de reconnaissance faciale-cv2.CascadeClassifier.detectMultiScale()

La reconnaissance faciale fait référence au processus par lequel le programme juge l'image faciale saisie et reconnaît la personne correspondante. Les programmes de reconnaissance faciale, comme nous, les humains, peuvent déterminer si une personne est un membre de la famille, un ami ou une célébrité après avoir « vu » un visage.

Bien entendu, pour réaliser la reconnaissance faciale, il faut d’abord déterminer si un visage apparaît dans l’image actuelle, c’est-à-dire la détection de visage. Ce n’est que lorsqu’un visage humain est détecté dans l’image qu’il est possible de déterminer qui est la personne sur la base du visage humain.

Détection facial

La « classification » se produit lorsque nous prédisons des valeurs discrètes. Par exemple, prédire si un enfant deviendra un bon athlète dépend de sa classification comme « bon enfant » ou comme « enfant moyen ». Pour les tâches de « deux classifications » impliquant seulement deux catégories, nous appelons généralement l'une des classes « classe positive » (échantillon positif) et l'autre classe « classe négative » (classe négative, échantillon négatif).

Par exemple, dans la détection de visages, la tâche principale est de construire un classificateur capable de distinguer les instances contenant des visages de celles qui n’en contiennent pas. Ces instances sont appelées « classe positive » (contient des images de visage) et « classe négative » (ne contient pas d'images de visage).

Cette section présente la méthode de construction de base du classificateur et comment appeler le classificateur formé dans OpenCV pour réaliser la détection de visage.

Fondamental

OpenCV fournit trois classificateurs en cascade formés différents, certains des concepts impliqués sont brièvement présentés ci-dessous.

  1. Classificateurs en cascade
    Généralement, un classificateur doit reconnaître plusieurs caractéristiques d'une image. Par exemple, pour déterminer si un animal est un chien (classe positive) ou d’autres animaux (classe négative), nous devrons peut-être juger en fonction de plusieurs conditions, ce qui est très difficile à comparer.
    Cependant, si l’on compare d’abord le nombre de pattes qu’ils ont :
  • Les animaux à « quatre pattes » sont considérés comme « peut-être des chiens », et les objets compris dans cette fourchette continuent d'être analysés et jugés.
  • Les animaux sans « quatre pattes » sont directement rejetés, c'est-à-dire qu'ils ne peuvent pas être des chiens.

De cette manière, uniquement en comparant le nombre de pattes, un grand nombre de classes négatives de l'ensemble d'échantillons (telles que les poulets, les canards, les oies et d'autres instances d'animaux qui ne sont pas des chiens) peuvent être exclues sur la base de cette caractéristique. Le classificateur en cascade est basé sur cette idée, qui consiste à mettre en cascade plusieurs classificateurs simples dans un certain ordre.

Le principe de base du classificateur en cascade est illustré à la figure 23-1.

insérez la description de l'image ici
L’avantage du classificateur en cascade est qu’il peut exclure les instances qui ne répondent manifestement pas aux exigences en effectuant un jugement très simple au début. La classe négative exclue au stade initial ne participera plus au classement ultérieur, ce qui peut grandement améliorer la rapidité du classement ultérieur. C'est un peu comme les SMS frauduleux que nous recevons souvent : la plupart des gens peuvent généralement reconnaître ces SMS comme frauduleux en un coup d'œil, et il est impossible de tomber dans le piège. Les escrocs inondent au hasard des messages texte dans lesquels la plupart des gens ne craqueront évidemment pas, et même si cela peut paraître idiot, quelqu'un tombera quand même dans le piège. Ces messages texte, après un simple filtrage au tout début, peuvent exclure des personnes qu'il est totalement impossible de tromper. Ceux qui ne répondent pas aux SMS ne peuvent pas être trompés ; ceux qui répondent aux SMS constituent le groupe cible.

De cette manière, les fraudeurs peuvent facilement identifier et trouver le groupe cible, et peuvent se concentrer davantage sur le « service » de leur « groupe cible ultime » (en interaction constante avec les SMS), évitant ainsi efficacement tout contact avec un « groupe non cible » (pas de réponse). messages texte), d'autres
contacts ont lieu et le temps et l'énergie sont "perdus".

OpenCV fournit des outils pour former des classificateurs en cascade, ainsi que des classificateurs en cascade formés pour le positionnement des visages, qui peuvent être utilisés comme ressources prêtes à l'emploi.

  1. Classificateur en cascade Haar
    OpenCV fournit un classificateur en cascade Haar formé pour la localisation des visages. La mise en œuvre du classificateur en cascade Haar a traversé la longue histoire suivante :
  • Tout d’abord, certains chercheurs ont proposé d’utiliser les fonctionnalités de Haar pour la détection des visages, mais à l’heure actuelle, la complexité informatique des fonctionnalités de Haar est extrêmement grande et cette solution n’est pas pratique.

  • Ensuite, certains chercheurs ont proposé une méthode de simplification des caractéristiques de Haar, qui rendait facile l'opération de détection des visages à l'aide des caractéristiques de Haar, et ont proposé l'utilisation de classificateurs en cascade pour améliorer l'efficacité de la classification.

  • Plus tard, certains chercheurs ont proposé un schéma de type Haar pour améliorer Haar, qui définissait davantage de fonctionnalités pour les visages et améliorait encore l'efficacité de la détection des visages.

Le schéma ci-dessus est décrit ci-dessous avec un exemple simple. Supposons qu'il y ait deux images 4×4, comme le montre la figure 23-2.

Pour ces deux images, nous pouvons utiliser des calculs simples pour déterminer si elles sont liées dans la dimension de la relation gauche-droite.

insérez la description de l'image ici
'Soustrayez la somme des valeurs des pixels à droite de la somme des valeurs des pixels à gauche des deux images :

  • Pour l'image de gauche, somme (pixel gauche) - somme (pixel droit) = (128+96) - (108+76) = 40
  • Pour l'image de droite, somme (pixel gauche) - somme (pixel droit) = (47+88) - (27+68) = 40

Dans les deux images, « somme des valeurs de pixels à gauche » moins « somme des valeurs de pixels à droite » est de 40. Par conséquent, on peut considérer que les deux images ont une certaine corrélation dans l'angle de "la somme des valeurs des pixels à gauche" moins la "somme des valeurs des pixels à droite" .

En l'étendant plus loin, nous pouvons considérer les caractéristiques des images sous plus de perspectives. Les chercheurs Papageorgiou et al. ont proposé les caractéristiques de Haar illustrées à la figure 23-3. Ces caractéristiques comprennent des caractéristiques verticales, des caractéristiques horizontales et des caractéristiques diagonales . Ils ont utilisé ces fonctionnalités
pour mettre en œuvre la détection des piétons (Détection des piétons à l'aide de modèles d'ondelettes) et la détection des visages (Un cadre général pour la détection d'objets).

insérez la description de l'image ici

La fonction Haar reflète le changement d'échelle de gris de l'image, qui divise les pixels en modules et calcule la différence. La fonctionnalité Haar utilise deux types de boîtes rectangulaires noires et blanches pour former un modèle de fonctionnalité. Dans le modèle de fonctionnalité, la somme de pixels du bloc de pixels rectangulaire blanc est utilisée pour soustraire la somme de pixels du bloc de pixels rectangulaire noir pour représenter la caractéristique de le gabarit.

Après le traitement ci-dessus, certaines caractéristiques du visage humain peuvent être simplement représentées par la différence du cadre rectangulaire. Par exemple, les yeux sont plus foncés que les joues, les côtés de l’arête du nez sont plus foncés que l’arête du nez et les lèvres sont plus foncées que la zone autour des lèvres.

Concernant le cadre rectangulaire dans la fonction de Harr, il y a trois variables comme suit.

  • Position rectangulaire : le cadre rectangulaire doit traverser (traverser) toute l'image pixel par pixel pour obtenir la différence de chaque position.
  • Taille du rectangle : la taille du rectangle peut être ajustée arbitrairement selon les besoins.
  • Type de rectangle : contient différents types tels que vertical, horizontal et diagonal.

Les trois variables ci-dessus garantissent que les informations caractéristiques de l'image peuvent être obtenues de manière méticuleuse et complète. Cependant, plus le nombre de variables est élevé, plus le nombre de fonctionnalités est important.

Par exemple, le nombre de fonctionnalités dans une seule fenêtre de détection 24×24 est proche de 200 000. Cette solution n'est pas pratique en raison de la complexité informatique, à moins que quelqu'un ne propose une solution simplifiant les fonctionnalités.

Plus tard, deux chercheurs, Viola et Jones, ont proposé une méthode pour calculer rapidement les caractéristiques de Haar à l'aide d'images intégrales dans les articles Rapid Object Detection Using A Boosted Cascade Of Simple Features et Robust Real-time Face Detection. Ils ont proposé qu'en construisant une « image intégrale », les caractéristiques de Haar puissent être obtenues rapidement grâce à la méthode de la table de recherche et à un nombre limité d'opérations simples, ce qui réduit considérablement la quantité de calcul. Dans le même temps, dans ces deux articles, ils ont proposé qu'en construisant un classificateur en cascade, les images d'arrière-plan non qualifiées (échantillons négatifs) puissent être rapidement éliminées, afin que la puissance de calcul puisse être appliquée aux objets pouvant contenir des visages.

Afin d'améliorer encore l'efficacité, deux chercheurs, Lienhart et Maydt, ont proposé d'étendre la bibliothèque de fonctionnalités Haar dans l'article An Extended Set Of Haar-LikeFeatures For Rapid Object Detection. Ils ont ensuite divisé les caractéristiques de Haar en 4 catégories, comme le montre la figure 23-4 :

  • 4 fonctionnalités de bord.
  • 8 fonctionnalités de ligne.
  • 2 fonctionnalités de point central.
  • 1 élément diagonal.

insérez la description de l'image ici
Lienhart et Maydt pensent qu'en utilisation réelle, "e" et "g" dans les éléments diagonaux (voir le bas de la figure 23-4) et les éléments linéaires (voir la deuxième ligne de la figure 23-4, (e) et (g) figure) sont similaires, il n’est donc généralement pas nécessaire de recalculer.
Dans le même temps, l'article donne également la méthode de calcul du numéro de caractéristique Haar, la méthode de calcul rapide et la méthode de construction du classificateur en cascade.

Sur la base des recherches ci-dessus, OpenCV réalise l'utilisation de classificateurs en cascade Haar pour la localisation des traits du visage. Nous pouvons appeler directement le classificateur de fonctionnalités en cascade Haar fourni avec OpenCV pour réaliser le positionnement du visage.

Utilisation de classificateurs en cascade

Dans OpenCV
1. Fonctionnalité Edge
2. Fonctionnalité de ligne
3. Fonctionnalité de point central
4. Fonctionnalité diagonale, il existe des classificateurs en cascade formés que les utilisateurs peuvent utiliser. Ces classificateurs peuvent être utilisés pour détecter des visages, des traits du visage (yeux,
nez), des humains et d'autres objets. Ces classificateurs en cascade sont stockés dans le répertoire de données des fichiers sources OpenCV sous forme de fichiers XML, et différents objets peuvent être détectés en chargeant des fichiers XML de différents classificateurs en cascade.

lien de téléchargement

https://github.com/opencv/opencv/tree/4.x/data/haarcascades

Les classificateurs en cascade fournis avec OpenCV sont stockés dans le dossier data du dossier racine d'OpenCV. Ce dossier contient trois sous-dossiers : haarcascades, hogcascades et lbpcascades, qui stockent respectivement les classificateurs en cascade Harr, les classificateurs en cascade HOG et les classificateurs en cascade LBP.
Parmi eux, il existe plus de 20 classificateurs en cascade Harr (qui continueront d'augmenter avec les mises à jour de versions), offrant des fonctions de détection pour divers objets. Certains classificateurs en cascade sont présentés dans le Tableau 23-1.

insérez la description de l'image ici

La syntaxe de chargement d'un classificateur en cascade est :

<CascadeClassifier object> = cv2.CascadeClassifier( filename )

où filename est le chemin et le nom du classificateur.
Le code suivant est un exemple d'appel :

faceCascade =
cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

Remarque lors de l'utilisation du classificateur en cascade : si vous avez installé OpenCV en utilisant pip dans anaconda, vous ne pouvez pas obtenir directement le fichier XML du classificateur en cascade. Le fichier XML du classificateur en cascade requis
peut être obtenu des deux manières suivantes :

  • Après avoir installé OpenCV, recherchez le fichier XML dans le dossier data sous son répertoire d'installation.
  • Recherchez le fichier XML correspondant directement sur Internet, téléchargez-le et utilisez-le.

De même, si vous utilisez opencv_createsamples.exe et opencv_traincascade.exe, vous devez également utiliser la méthode ci-dessus pour obtenir le fichier XML.

Présentation de la fonction cv2.CascadeClassifier.detectMultiScale()

Dans OpenCV, la détection des visages utilise la fonction cv2.CascadeClassifier.detectMultiScale(), qui peut détecter
tous les visages de l'image. Cette fonction est appelée par l'objet classificateur et son format de syntaxe est :

objets = cv2.CascadeClassifier.detectMultiScale( image[,
scaleFactor[, minNeighbors[, flags[, minSize[, maxSize]]]]] )

Les significations de chaque paramètre et valeur de retour dans la formule sont :

  • image : L'image à détecter, généralement une image en niveaux de gris.
  • scaleFactor : indique le taux de zoom de la fenêtre de recherche dans deux analyses consécutives.
  • minNeighbors : Indique le nombre minimum de rectangles adjacents qui constituent la cible de détection. Par défaut, la valeur est 3, ce qui signifie qu'un visage est considéré comme existant uniquement lorsqu'il y a plus de 3 marqueurs de détection. Si vous souhaitez améliorer la précision de la détection, vous pouvez définir une valeur plus grande, mais en même temps, certains visages peuvent ne pas être détectés.
  • flags : ce paramètre est généralement omis. Lorsque vous utilisez une version inférieure d'OpenCV (version OpenCV 1.X), il peut être défini sur CV_HAAR_DO_CANNY_PRUNING, ce qui signifie que le détecteur de bord Canny est utilisé pour rejeter certaines zones.
  • minSize : La taille minimale de la cible, les cibles plus petites que cette taille seront ignorées.
  • maxSize : La taille maximale de la cible, les cibles supérieures à cette taille seront ignorées.
  • objets : la valeur de retour, le groupe vectoriel de cadre rectangulaire d'objets cibles.

Exemple : Utilisez la fonction cv2.CascadeClassifier.detectMultiScale() pour détecter des visages dans une image

Image originale:

insérez la description de l'image ici

import cv2
# 读取待检测的图像
image = cv2.imread('face\\face3.jpg')
# 获取 XML 文件,加载人脸检测器
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 色彩转换,转换为灰度图像
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# 调用函数 detectMultiScale
faces = faceCascade.detectMultiScale(
 gray,
 scaleFactor = 1.15,
 minNeighbors = 5,
 minSize = (5,5)
)
print(faces)
# 打印输出的测试结果
print("发现{0}个人脸!".format(len(faces)))
# 逐个标注人脸
for(x,y,w,h) in faces:
  cv2.rectangle(image,(x,y),(x+w,y+w),(0,255,0),2) #矩形标注
# 显示结果
cv2.imshow("dect",image)
# 保存检测结果
cv2.imwrite("re.jpg",image)
cv2.waitKey(0)

résultat de l'opération :
insérez la description de l'image ici

Dans le même temps, les informations de localisation spécifiques et le nombre de visages détectés seront affichés sur la console. Les résultats spécifiques sont les suivants :

[[129 59 61 61]
[ 35 76 62 62]
[565 65 61 61]
[443 62 71 71]
[290 13 77 77]]
发现 5 个人脸!

Je suppose que tu aimes

Origine blog.csdn.net/hai411741962/article/details/132355653
conseillé
Classement