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.
Le visage a été détecté pour une image de personne et entouré d'un cadre carré.
Plusieurs personnes vont bien. Hou la la!
Il détecte même des visages étranges! (La personne derrière peut également être détectée)
Vous pouvez également passer de la détection de visage à la détection de nez.
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é ...
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).
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.
Le jugement du visage est effectué à l'aide d'un détecteur de type Haar. Le processus de jugement ressemble à ceci. 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.
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é.
De plus, même si je faisais pivoter mon visage, cela ne pouvait pas être détecté.
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)
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.
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.
- Essayez la détection d'objet (detectMultiScale) avec différents paramètres (édition scaleFactor)
- [Essayez detectMultiScale avec différents paramètres (minNeighbors)] (http://workpiles.com/2015/04/opencv-detectmultiscale-minneighbors/)
- OpenCV detectMultiScale() minNeighbors parameter
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