[PYTHON] Comment créer un ensemble de données d'image de visage utilisé dans l'apprentissage automatique (3: Génération d'images de visage à partir d'images candidates, partie 1)

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.

Environnement de développement utilisé cette fois

Flux pour générer une image de visage à partir d'une image candidate

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.

  1. En saisissant une image candidate dans l'API de détection de visage, obtenez les informations de coordonnées qui semblent être la zone du visage.
  2. Découpez la zone de coordonnées en fonction des informations de coordonnées obtenues en 1 à partir de l'image candidate.
  3. Générez la zone découpée en tant que nouvelle image et utilisez-la comme image de visage

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)

Une impression approximative de l'utilisation des deux méthodes ci-dessus

dlib

OpenCV

C'est facile, mais cette fois j'ai expliqué comment générer une image de visage à partir d'une image candidate.

Recommended Posts

Comment créer un ensemble de données d'image de visage utilisé dans l'apprentissage automatique (3: Génération d'images de visage à partir d'images candidates, partie 1)
Comment créer un ensemble de données d'image de visage utilisé dans l'apprentissage automatique (2: Analyse d'image de la vidéo pour obtenir des images candidates)
Comment créer un ensemble de données d'image de visage utilisé dans l'apprentissage automatique (1: Acquérir des images de candidats à l'aide du service API Web)
[Partie 1] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
[Partie 3] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
[Partie 2] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
Les gens mémorisent les connaissances acquises dans le cerveau, comment mémoriser les connaissances acquises dans l'apprentissage automatique
Papier: Traitement intracérébral de la musique
Comment créer un ensemble de données d'image de visage utilisé dans l'apprentissage automatique (3: Génération d'images de visage à partir d'images candidates, partie 1)
Modèle de reconnaissance d'image utilisant l'apprentissage profond en 2016
Alignement d'image: du SIFT au deep learning
"Deep Learning from scratch" avec Haskell (inachevé)
Code simple qui donne un score de 0,81339 dans Kaggle's Titanic: Machine Learning from Disaster
Comment collecter des données d'apprentissage automatique
Comment envoyer une image visualisée des données créées en Python à Typetalk
Comment créer un plug-in QGIS (génération de package)
[Pour l'enregistrement] Système d'image Keras Partie 1: Comment créer votre propre ensemble de données?
Comment préparer l'environnement pour Google Colab avec le cours avancé d'apprentissage automatique de Coursera
Comment diviser les données de formation en machine learning en variables objectives et autres dans Pandas
Comment récupérer des données d'image de Flickr avec Python
Comment faire un jeu de tir avec toio (partie 1)
Les débutants en apprentissage automatique essaient de créer un arbre de décision
Comment prendre une image capturée à partir d'une vidéo (OpenCV)
Introduction à l'apprentissage automatique à partir de Simple Perceptron
Comment créer un environnement virtuel Anaconda à utiliser avec Azure Machine Learning et comment créer un lien avec Jupyter
Essayez d'exécuter wav2pix pour générer une image de visage à partir de la voix (il existe également une génération de visage animée)
Comment dessiner de manière interactive un pipeline d'apprentissage automatique avec scikit-learn et l'enregistrer au format HTML
Comment obtenir uniquement les données nécessaires du groupe de données structurées à l'aide d'une méthode polyvalente
Comment représenter la distribution de la composition bactérienne à partir des données d'analyse Qiime2 dans un diagramme de moustaches
[Partie 1] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
[Partie 3] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
Comment découper un bloc de plusieurs tableaux à partir d'un multiple en Python
Comment créer un laboratoire de piratage - Kali Linux (2020.1) VirtualBox 64 bits Partie 2-
Comment augmenter le nombre d'images de jeux de données d'apprentissage automatique
[Partie 2] Utilisez le Deep Learning pour prévoir la météo à partir d'images météorologiques
Ensemble de données pour l'apprentissage automatique
Utilisé en EDA pour l'apprentissage automatique
Expérience d'apprentissage automatique (première partie) en quelques lignes. Expliquez PyCaret en détail. De la préparation des ensembles de données à la comparaison de précision de plusieurs modèles.
[Tutoriel] Créez un extracteur d'expressions unique en 30 minutes à l'aide de l'apprentissage automatique
Comment transformer une chaîne en tableau ou un tableau en chaîne en Python
Que diriez-vous d'Anaconda pour créer un environnement d'apprentissage automatique avec Python?
Comment obtenir une chaîne à partir d'un argument de ligne de commande en python
<Pandas> Comment gérer les données de séries chronologiques dans le tableau croisé dynamique
Comment créer une bibliothèque .dylib à partir d'une bibliothèque .a avec OSX (El Capitan)
Comment faire un test unitaire Part.1 Modèle de conception pour l'introduction
Comment créer une grande quantité de données de test dans MySQL? ??
Les gens mémorisent les connaissances acquises dans le cerveau, comment mémoriser les connaissances acquises dans l'apprentissage automatique
Comment créer une API de machine learning sans serveur avec AWS Lambda
Comment faire une traduction japonais-anglais
Créer un identifiant Santa à partir d'une image du Père Noël
Comment collecter des images en Python
Comment créer un bot slack
Comment créer un robot - Avancé
Comment créer une fonction récursive
Apprentissage automatique dans Delemas (acquisition de données)
[Blender] Comment créer un plug-in Blender
Prétraitement dans l'apprentissage automatique 2 Acquisition de données
Comment créer un robot - Basic
Prétraitement dans l'apprentissage automatique 4 Conversion de données
Coursera Machine Learning Challenge en Python: ex6 (Comment ajuster les paramètres SVM)
Dans Vim: créer une sortie HTML à partir de markdown en utilisant pandoc
Comment faire un modèle pour la détection d'objets avec YOLO en 3 heures
Viser à devenir un ingénieur en apprentissage automatique en utilisant des MOOC depuis des postes de vente
Comment obtenir la valeur du magasin de paramètres dans lambda (en utilisant python)
Comment rendre le nom du conteneur accessible dans Docker en tant que sous-domaine
J'ai essayé de faire la reconnaissance de caractères manuscrits de Kana Partie 2/3 Création et apprentissage de données
Pour trouver le nom de la vue avec l'espace de noms à partir de l'URL (path_info) dans Django
[Environnement de développement] Comment créer un ensemble de données proche de la base de données de production