[PYTHON] [Explication pour les débutants] Mécanisme de détection de visage OpenCV et pratique (détecter MultiScale)

Vue d'ensemble et environnement

J'ai étudié et essayé la méthode de détection de visage d'OpenCV. Je vais expliquer pour les débutants. Les articles suivants sont liés à openCV.

L'environnement de vérification est le suivant. 00.ArchitectureopenCV.JPG

Que pouvez-vous faire avec la détection de visage openCV

Le visage a été détecté pour une image de personne et entouré d'un cadre carré. 10.Sample00.jpg

Plusieurs personnes vont bien. Hou la la! 10.Sample01.jpg

Il détecte même des visages étranges! (La personne derrière peut également être détectée) 10.Sample02.jpg

Vous pouvez également passer de la détection de visage à la détection de nez. 10.Sample03_Nose.jpg

Mécanisme de détection de visage OpenCV

Je n'ai pas regardé les papiers ou les algorithmes spécifiques pour vérifier et confirmer, donc les explications suivantes peuvent être incorrectes (j'apprécierais si vous pouviez le préciser). C'est ce que l'auteur a compris en une demi-journée environ. Peut-être que regarder la vidéo "Détection de visage et suivi de Viola Jones expliqués" vous permettra de mieux comprendre, mais réalisez la longue heure et demie. Cassé ...

Vue d'ensemble de la méthode de détection de visage

Jugement Une partie de l'image entière (image lue) est découpée et jugée selon divers critères. S'il est jugé comme "pas un visage" même une fois, le jugement suivant n'est pas effectué et le dispositif de jugement peut être appliqué à une partie de l'image suivante. En ne faisant pas tous les jugements, la vitesse du traitement de détection de visage est réalisée (la précision de chaque jugement est faible, mais la précision est maintenue dans son ensemble en empilant plusieurs). 20.DetectOverview.JPG

Pour faciliter la compréhension du processus de découpe sur le côté gauche, j'ai changé les paramètres de l'API openCV et j'ai osé le faire faussement détecter. Les visages sont détectés dans un grand nombre d'images, c'est-à-dire qu'au moins ce nombre d'images est utilisé pour le jugement. Vous pouvez voir que toute l'image de jugement est découpée et appliquée individuellement au dispositif de jugement. 30.Sample01.many.jpg

Méthode de jugement

Présentation du détecteur de type Harr

Le jugement du visage est effectué à l'aide d'un détecteur de type Haar. Le processus de jugement ressemble à ceci. 40.HarrLike.JPG La méthode de jugement ci-dessus est efficace parce que la partie centrale du nez est brillante parce qu'elle est exposée à la lumière, et la zone autour du nez est ombragée et assombrie. Le jugement seul est simple et rapide, mais d'un autre côté, la précision du jugement est faible. Par conséquent, faire de nombreux jugements améliorera la précision dans son ensemble. Il existe trois principaux types de détecteurs de type Haar utilisés pour les jugements ci-dessus. HarrLike

Faiblesse de la méthode de jugement

En tant que point faible, si vous n'avez pas de face avant, la précision de détection diminuera considérablement. Par exemple, le profil ci-dessous n'a pas pu être détecté. 30.Sample02Angles.jpg

De plus, même si je faisais pivoter mon visage, cela ne pouvait pas être détecté. 30.Sample02.angles.JPG

Code Python

Je l'ai vérifié en utilisant le code suivant. Cela laisse également une marque d'essais et d'erreurs. Il y a de nombreuses parties que je viens de copier à partir du lien posté à la fin. Le code qui peut être spécifié lors de l'exécution du modèle entraîné est écrit dans l'article "Spécifier les paramètres avec détection de visage d'openCV pour améliorer rapidement la précision de détection". Je vais. En outre, le code pour lire plusieurs images dans le dossier et découper et enregistrer la partie du visage détecté est l'article "OpenCV détecte le visage à partir de plusieurs fichiers image et coupe et enregistre" Voir / items / 457737530264572f5a5b).

import cv2

#Répertoire du trieur(Obtenu à partir de)
# https://github.com/opencv/opencv/blob/master/data/haarcascades/
# https://github.com/opencv/opencv_contrib/blob/master/modules/face/data/cascades/

cascade_path = "./models/haarcascade_frontalface_default.xml"

#Autres fichiers modèles(référence)
#cascade_path = "./models/haarcascade_frontalface_alt.xml"
#cascade_path = "./models/haarcascade_frontalface_alt2.xml"
#cascade_path = "./models/haarcascade_frontalface_alt_tree.xml"
#cascade_path = "./models/haarcascade_profileface.xml"
#cascade_path = "./models/haarcascade_mcs_nose.xml"

#Fichiers utilisés et répertoires d'entrée / sortie
image_file = "test.jpg "
image_path = "./inputs/" + image_file
output_path = "./outputs/" + image_file

#Pour la confirmation de l'annuaire(Pour quand les choses tournent mal)
#import os
#print(os.path.exists(image_path))

#Lecture de fichiers
image = cv2.imread(image_path)

#Conversion de l'échelle de gris
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

#Acquérir la quantité de caractéristiques du classificateur en cascade
cascade = cv2.CascadeClassifier(cascade_path)

#Exécution de la reconnaissance d'objets (reconnaissance faciale)
#image – CV_Matrice de type 8U. Les objets sont détectés dans les images stockées ici
#objets - Un vecteur dont les éléments sont des rectangles. Chaque rectangle contient l'objet détecté
#scaleFactor - Représente la quantité de réduction à chaque échelle d'image
#minNeighbors - Les rectangles candidats doivent contenir au moins ce nombre de voisins
#flags - Ce paramètre n'est pas utilisé dans la nouvelle cascade. Pour les cascades plus anciennes, il a la même signification que pour la fonction cvHaarDetectObjects.
#minSize - La taille minimale qu'un objet peut prendre. Les objets plus petits seront ignorés
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=2, minSize=(30, 30))

#print(facerect)
color = (255, 255, 255) #blanc

#Une fois détecté
if len(facerect) > 0:
    
    #Créez un rectangle qui entoure le visage détecté
    for rect in facerect:
        cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)

    #Enregistrer les résultats de la reconnaissance
    cv2.imwrite(output_path, image)

Récupérer le fichier du modèle entraîné utilisé

Détection de visage et Détection de nez depuis Git Hub J'utilise le fichier de modèle entraîné de modules / face / data / cascades / haarcascade_mcs_nose.xml).

Je n'ai pas vérifié quel modèle entraîné utiliser avec stackoverflow L'article "Types et effets des classificateurs en cascade pouvant être utilisés avec OpenCV" est utile.

Méthode de détection des visages "cascade.detectMultiScale"

La méthode "cascade.detectMultiScale" est utilisée pour la détection de visage. Comme vous pouvez le voir sur le Site officiel, des méthodes similaires sont "cascade.detectMultiScale2" et " Il y a cascade.detectMultiScale3 ", mais le traitement de base ne semble pas changer, seuls les paramètres sont différents. Je l'ai entendu à stackoverflow. ** Les paramètres "scaleFactor" et "minNeighbors" sont très importants pour améliorer la précision de détection. ** Les essais et erreurs de l'auteur sont consignés dans l'article "Conseils pour détecter efficacement un grand nombre d'images avec openCV". Je l'ai compris en référence aux informations suivantes.

Lien de référence

Cette fois, je publierai le site que j'ai utilisé pour étudier sous forme de lien.

site commentaire
Détection de visage avec Haar Cascades Traduction japonaise du tutoriel officiel
Principe de détection de visage que même les singes peuvent comprendre Il existe une explication facile à comprendre sur le principe de la détection de visage
Découpez et reconnaissez le visage Détection de visage de type slide avec des explications faciles à comprendre
OBJECT DETECTION : FACE DETECTION USING HAAR CASCADE CLASSFIERS Explicationdétailléedeladétectiond'objetsaveccode(Anglais)
Heroku +API de détection de visage simple avec OpenCV Il existe un moyen d'incliner votre visage pour améliorer la précision
Python+Détection de visage avec OpenCV-Essayez l'évaluateur fourni avec OpenCV Il existe des résultats de vérification avec différents modèles et paramètres
python+Essayez la reconnaissance faciale avec OpenCV Copiez et collez la source du programme

Recommended Posts

[Explication pour les débutants] Mécanisme de détection de visage OpenCV et pratique (détecter MultiScale)
Implémentation et description à l'aide de XGBoost pour les débutants
[Apprentissage en profondeur] Détection de visage Nogisaka ~ Pour les débutants ~
Hello World et détection de visage avec OpenCV 4.3 + Python
[Explication pour les débutants] Syntaxe et concept de base de TensorFlow
[Ubuntu] [Python] Comparaison de la détection de visage entre dlib et OpenCV
OpenCV pour les débutants en Python
[Python] Accès et recadrage des pixels d'image à l'aide d'OpenCV (pour les débutants)
Détection de visage avec Python + OpenCV
Détection de visage d'anime avec OpenCV
[Explication pour les débutants] Tutoriel TensorFlow MNIST (pour les débutants)
Détection de visage à partir de plusieurs fichiers image avec openCV, découpez et enregistrez