Fonction Haar + classificateur en cascade Adaboost
La technologie de détection d'objets basée sur le classificateur de caractéristiques Haar est une technologie de détection d'objets très efficace, qui est principalement utilisée pour la détection des visages et la détection des piétons. La fonction de type Haar est un opérateur de description de fonction couramment utilisé dans le domaine de la vision par ordinateur, également connue sous le nom de fonction Haar. La fonction Haar consiste à soustraire la somme de toutes les valeurs de pixels du rectangle blanc de la somme de toutes les valeurs de pixels du rectangle noir dans la figure ci-dessous.
La fonction Haar peut générer une série de sous-fonctionnalités en zoomant et en déplaçant la fenêtre de détection. Dans l'article "Détection rapide d'objets à l'aide d'une cascade renforcée de fonctionnalités simples", le détecteur utilisé par l'auteur a été réglé à une taille de 24 * 24, et plus de 180 000 caractéristiques ont été obtenues.
La valeur de la fonction Haar reflète les changements de niveau de gris de l'image. Des expériences ont prouvé qu'un très petit nombre de caractéristiques peuvent être combinées pour former un classificateur efficace. Par exemple, certaines caractéristiques du visage peuvent être simplement décrites par des caractéristiques rectangulaires, telles que: les yeux sont plus foncés que les joues, les côtés du nez sont plus foncés que l'arête du nez et la bouche est plus foncée que l'environnement. Pour atteindre cet objectif, nous appliquons chaque fonctionnalité à toutes les images de formation (échantillons positifs d'images de visage, échantillons négatifs d'images de non-visage). Nous voulons sélectionner les fonctionnalités avec le taux d'erreur le plus bas, ce qui signifie qu'elles sont les meilleures fonctionnalités pour détecter les images faciales et non faciales. L'auteur a finalement sélectionné 6061 fonctionnalités parmi 180 000 fonctionnalités.
Afin de trouver des cibles dans différentes positions dans l'image, la fenêtre de détection doit être déplacée successivement (les caractéristiques Haar dans la fenêtre se déplacent également en conséquence), afin qu'elle puisse traverser vers chaque position de l'image. Afin de détecter des cibles de tailles différentes, il existe généralement deux méthodes: réduire progressivement l'image ou agrandir progressivement la fenêtre de détection, afin de pouvoir parcourir les cibles de tailles différentes dans l'image.
Si vous utilisez ces fonctionnalités 6061 pour vérifier chaque fenêtre 24x24 pour voir s'il s'agit d'un visage, cela prendra du temps, il est donc préférable d'avoir une méthode simple pour prouver que cette fenêtre n'est pas une zone de visage, sinon, juste jetez-le. Traitez-le à nouveau. Afin d'atteindre cet objectif, l'auteur a proposé le concept de classificateurs en cascade.
Au lieu de tester les fonctionnalités 6061 de la fenêtre au début, divisez ces fonctionnalités en différents groupes. Utilisez un par un dans les différentes étapes de classification. Habituellement, les premières étapes utilisent moins de détection de fonctionnalités. L'étude a révélé que le taux correct de jugement du classificateur n'est pas un visage humain est très élevé, et le taux de jugement correct est un visage humain est moyen. Si une fenêtre échoue à la première étape du test, vous pouvez simplement abandonner le test suivant, et si elle réussit, elle entrera dans la deuxième étape du test. Si une fenêtre a réussi tous les tests, cette fenêtre est considérée comme une zone de visage.
L'auteur divise 6061 caractéristiques en 38 étapes, et le nombre de caractéristiques dans les cinq premières étapes est de 1, 10, 25, 25 et 50, respectivement. Le nombre d'entités contenues dans les couches restantes a considérablement augmenté. Le nombre total de fonctionnalités est de 6061.
import os
os.chdir("E:\\code\opencv\\10.人脸检测识别\\")
from imutils import *
image = imread('face.png')
show(image)
- Description des paramètres de la fonction DetectMultiScale
- image: image d'entrée
- scaleFactor = 1.1: C'est le rapport de chaque fois que l'image est réduite, la valeur par défaut est 1.1
- minNeighbors = 3: nombre de cases rectangulaires environnantes nécessaires pour une correspondance réussie. La zone à laquelle correspond chaque entité est une case rectangulaire. Ce n'est que lorsque plusieurs cases rectangulaires existent en même temps que la correspondance est considérée comme réussie, comme un visage humain. par défaut La valeur est 3.
- minSize: la plage minimale de faces correspondantes
- flags = 0: peut prendre les valeurs suivantes:
CASCADE_DO_CANNY_PRUNING = 1, utiliser la détection de bord astucieuse pour exclure certaines zones d'image avec peu ou beaucoup de bords
CASCADE_SCALE_IMAGE = 2, détection de rapport normal
CASCADE_FIND_BIGGEST_OBJECT = 4, détecter uniquement le plus gros objet
CASCADE_DO_ROUGH 8_SEARCH
# 级联分类器
detector = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
rects = detector.detectMultiScale(image, scaleFactor=1.1, minNeighbors=2, minSize=(10,10), flags=cv2.CASCADE_SCALE_IMAGE)
for (x,y,w,h) in rects:
# 画矩形框
cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0), 2)
show(image)
def facedetect(image):
image = imread(image)
# 级联分类器
detector = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
rects = detector.detectMultiScale(image, scaleFactor=1.1, minNeighbors=2, minSize=(10,10), flags=cv2.CASCADE_SCALE_IMAGE)
for (x,y,w,h) in rects:
# 画矩形框
cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0), 2)
show(image)
facedetect('Solvay.jpg')