Générez des images candidates montrant la face cible jusqu'à Dernière fois et Dernière fois J'ai mentionné comment l'obtenir, mais cette fois, je vais vous présenter comment en extraire la partie du visage et générer une image du visage.
Pour générer une image de visage, rognez uniquement la zone où le visage est réfléchi par les images candidates et générez la zone rognée en tant que nouvelle image = image de visage. Cependant, cela prend beaucoup de temps et d'efforts pour faire ce travail manuellement, donc pour le résoudre même un peu, nous utiliserons cette fois l'API de reconnaissance faciale (bibliothèque) suivante.
Si vous utilisez ces API, il est possible d'extraire automatiquement uniquement la zone du visage de l'image candidate, mais cette fois nous vous expliquerons la méthode en utilisant OpenCV et dlib. Le flux spécifique de génération d'images de visage est fondamentalement le même, comme suit.
Le processus ci-dessus doit être défini par la méthode face_detect dans le code ci-dessous.
# -*- coding: utf-8 -*-
import glob
#Chemin du répertoire contenant les images candidates
IMG_PATH = "/home/hoge/image/"
def face_detect(img_list):
#Définissez le processus de génération d'image de visage avec cette méthode
return
if __name__ == '__main__':
#Obtenez des images candidates à partir du répertoire spécifié et générez des images de visage à l'aide de l'API, etc.
images = glob.glob(IMG_PATH + '*.jpg')
face_detect(images)
dlib dlib est une bibliothèque qui combine des fonctions de traitement d'image et d'apprentissage automatique développées pour C ++, mais elle peut également être utilisée avec python. (Pour plus d'informations sur l'installation de dlib dans un environnement Mac, reportez-vous à cet article etc.)
dlib fournit une méthode get_frontal_face_detector
pour la détection de visage, alors utilisez-la.
De plus, si vous utilisez des méthodes liées à SVM, qui sont un type de discriminateur non linéaire avec une précision de discrimination élevée, une détection plus avancée est possible, mais cette fois, nous donnerons la priorité à la facilité d'utilisation.
Le code de génération d'image de visage qui utilise réellement la méthode get_frontal_face_detector
est le suivant.
import dlib
import cv2
def face_detect(img_list):
#Appel d'identification pour détecter la zone du visage
detector = dlib.get_frontal_face_detector()
#Obtenez des informations de coordonnées en appliquant l'image candidate au classificateur
for img_path in img_list:
#Image candidate pour le rognage (mode couleur)
img = cv2.imread(img_path, cv2.IMREAD_COLOR)
#Réassemblez la disposition de l'image et entrez-la dans le classificateur pour acquérir des informations de coordonnées qui semblent être la zone du visage
cv_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
faces = detector(cv_img, 1)
#Génération d'image du visage si la zone du visage est détectée
img_count = 1
for face in faces:
#Obtenir la taille de l'image du candidat
height, width = img.shape[:2]
#Obtenir les points de coordonnées de la zone du visage
top = face.top()
bottom = face.bottom()
left = face.left()
right = face.right()
#Ignorer les zones de visage irrégulières
if not top < 0 and left < 0 and bottom > height and right > width:
break
else:
#Coupe de la zone du visage
dst_img = img[top:bottom, left:right]
#Taille de l'image du visage Normalisée et enregistrée
face_img = cv2.resize(dst_img, (64,64))
new_img_name = str(img_count) + '.jpg'
cv2.imwrite(new_img_name, face_img)
img_count += 1
OpenCV et dlib gèrent différentes valeurs de pixels de RVB (rouge / vert / bleu), qui sont les informations de couleur de l'image.
Dans OpenCV, les valeurs de pixels RVB (Rouge / Vert / Bleu) sont stockées dans le tableau dans l'ordre de BGR, mais dans dlib, elles sont stockées dans l'ordre RVB, il est donc nécessaire de convertir la structure du tableau en utilisant la méthode cvtColor
. Il y a.
De plus, get_frontal_face_detector renvoie rarement les valeurs de coordonnées en dehors de la zone d'image en tant qu'informations de coordonnées de la zone du visage. En effet, il existe de nombreux cas où une partie du visage est manquante car le visage est réfléchi sur le bord de l'image, et il est difficile à utiliser même s'il est généré comme une image de visage car il s'agit de données d'entraînement, alors ignorez-le comme une zone de visage irrégulière Je suis.
OpenCV
OpenCV est une bibliothèque de traitement d'image qui peut être utilisée en C ++, Python, etc. et est familière dans cette série d'articles, mais ici la classe CascadeClassifier
préparée comme une classe de classificateur en cascade Utiliser.
En utilisant cette classe, il est possible de construire un classificateur correspondant à divers objets en fonction du contenu du fichier xml qui stocke les résultats d'apprentissage à lire lors de la construction du classificateur.
Cette fois, en faisant référence à haarcascade_frontalface_default.xml
(site fourni) fourni par OpenCV, comme détecteur de visage Je vais l'utiliser.
import cv2
#Chemin du fichier XML référencé par le classificateur HaarCascade
XML_PATH = "./haarcascade_frontalface_default.xml"
def face_detect(img_list):
#Définir le classificateur de zone de visage
classifier = cv2.CascadeClassifier(xml_path)
#Génération d'image du visage si la zone du visage est détectée
img_count = 1
for img_path in img_list:
#Image couleur pour le rognage
org_img = cv2.imread(img_path, cv2.IMREAD_COLOR)
#Image en échelle de gris pour l'entrée du classificateur
gray_img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
#Entrez l'image candidate (image en échelle de gris) dans le classificateur et obtenez les informations de coordonnées qui semblent être la zone du visage.
face_points = classifier.detectMultiScale(gray_img, \
scaleFactor=1.2, minNeighbors=2, minSize=(1,1))
#Génération d'image de visage en découpant l'image couleur à partir du résultat d'identification (informations de coordonnées rectangulaires)
for points in face_points:
#Obtenir les points de coordonnées de la zone du visage
x, y, width, height = points
#Coupe de la zone du visage
dst_img = org_img[y:y+height, x:x+width]
#Taille de l'image du visage Normalisée et enregistrée
face_img = cv2.resize(dst_img, (64,64))
new_img_name = str(img_count) + '.jpg'
cv2.imwrite(new_img_name, face_img)
img_count += 1
Dans la méthode utilisant OpenCV, deux types d'images candidates sont préparés: une image couleur pour le rognage et une image en échelle de gris pour l'entrée du classificateur. Cela est dû au fait que la méthode detectMultiScale
ne prend pas en charge la saisie d'images couleur.
La méthode detectMultiScale
accepte les arguments de paramètre suivants.
Essayez la détection d'objet (detectMultiScale) avec différents paramètres (minNeighbors) Essayez la détection d'objet (detectMultiScale) avec différents paramètres (édition scaleFactor)
dlib
OpenCV
detectMultiScale
.C'est facile, mais cette fois j'ai expliqué comment générer une image de visage à partir d'une image candidate.
Recommended Posts