[PYTHON] Génération automatique de mosaïques

Salut, je suis mignon tout en étudiant l'apprentissage profond. Cette fois, j'ai essayé un programme qui génère automatiquement une mosaïque sur une image.

Environnement d'exécution

MacOS, VScode, python3.6(anaconda)

Programme d'exécution

En écrivant ce programme, Reconnaissance faciale (OpenCV) en 30 lignes et fichier de sortie! Traitement de la mosaïque sur les images avec Python, OpenCV (surface entière, partie, face, etc.) Transformation d'image de base d'opencv: 12 exemples au total! J'ai fait référence à ces articles!

#Les dossiers stockés dans le type str comme Man ~ Women ne peuvent être affichés qu'après avoir été ajoutés à ce chemin
DATADIR = "/Users/Nom d'utilisateur/Documents/Des documents- MacBook Pro/HelloWorld.py/"

Tout d'abord, je pense qu'il existe un dossier dans lequel le fichier image est enregistré comme celui-ci, mais attribuez le chemin d'accès au précédent à la variable. Dans ce cas, le dossier «HelloWorld.py» contient les dossiers «Homme ~ Femmes».

#Lire le fichier XML de haarcascade(Lire la face avant)
xml_path = "./haarcascade_frontalface_default.xml"

Il est possible de détecter le site avec Cascade. ・ Détection de face avant: haarcascade_frontalface_default_xml ・ Détection des yeux: haarcascade_eye.xml ・ Détection de sourire: haarcascade_smile.xml

Il est bon de réfléchir à ce que vous voulez détecter et lire chacun.

Categories = ["Man", "Men", "Woman", "Women"]
img_size = 250
mosaic_size = 10
training_data = []

#Programme de détection de visage+Génération d'ensembles de données
def create_training_data():  # Man->Arguments dans l'ordre des femmes
    #Définir le classificateur de zone de visage
    classifier = cv2.CascadeClassifier(xml_path)
    cnt = 1   

    for class_num, category in enumerate(Categories):   #Vous pouvez récupérer à la fois l'index et l'élément avec enumerate
        path = os.path.join(DATADIR, category)  #Combinez chaque élément des catégories et DATADIR->Accès à l'homme ~ aux femmes
         
        for image_name in os.listdir(path): #Obtenez une liste de photos d'hommes et de femmes-> image_tous les noms sont de type str
            
            #Image en échelle de gris(Pour identification) <-Retirez les images une par une
            gray_img = cv2.imread(os.path.join(path, image_name), cv2.IMREAD_GRAYSCALE)    #Imread ne peut pas être lu sauf s'il s'agit d'une série de chemins-> image_J'obtiens une erreur avec juste le nom
            #Les valeurs renvoyées sont la coordonnée x, la coordonnée y, la largeur et la hauteur.
            face_points = classifier.detectMultiScale(gray_img, minSize=(20, 20))
        
            #Découpez l'image couleur du résultat de l'identification
            for x, y, width, height in face_points: #Obtenir les points de coordonnées de la zone du visage
                #Couper la zone du visage
                dst_img = gray_img[y:y+height, x:x+width] #L'image est verticale x horizontale
                face_img = cv2.resize(dst_img, (mosaic_size, mosaic_size), interpolation=cv2.INTER_NEAREST)    #Redimensionnement de l'image-> resize(Image à redimensionner, (ligne,Colonne))
                mosaic_img = cv2.resize(face_img, (width, height), interpolation=cv2.INTER_NEAREST) #Restaurer à la taille d'origine-> (width, height)De retour
                gray_img[y:y+height, x:x+width] = mosaic_img    #La partie mosaïque est insérée dans l'image d'origine
                cv2.imwrite('mosaic' + str(cnt) + '.jpg', gray_img)    #Enregistrer l'image
            try:    
                training_data.append([gray_img, class_num]) #Ajout de données d'image et d'informations d'étiquette-> class_Le numéro d'index est également stocké dans la liste avec num
            except Exception as e:  #Si un type d'exception appelé Exception arrive, ne faites pas d'erreur et passez par
                pass  
            cnt += 1 

create_training_data()

cv2.imread (): le fichier image peut être lu

Cependant, veuillez noter que le type de données sera sous la forme de 3D ndarray. Vous pouvez déterminer le type d'image avec le deuxième argument. Cette fois, c'est une "image en échelle de gris".

detectMultiScale: Vous pouvez modifier le niveau de l'objet qui peut être détecté dans l'image.

`・ ScaleFactor: plus la valeur est élevée, plus elle est faussement détectée, et plus la taille est petite, plus elle est non détectée. Plus il est proche de 1,01, plus la détection peut être fine. ┗ Une plus grande portée peut être détectée ・ MinNeighbors: Plus il est grand, plus il est fiable. ⇄ La possibilité de rater un visage augmente. ┗ Emplacements de détection en double → Les objets qui se chevauchent sont très fiables -MinSize: La plus petite taille qu'un objet peut prendre, les objets plus petits sont ignorés.

imwrite: peut enregistrer des fichiers image

・ Premier argument → chemin du fichier (ajoutez .jpg à la fin) ・ Deuxième argument → Variable de l'image que vous souhaitez enregistrer (ndarray)

Méthode de génération de mosaïque

① Coupez la zone que vous souhaitez mosaïquer. (2) Réduisez une fois la taille de l'image de cette partie. ③ Revenir à la taille d'origine ④ Insérez la partie mosaïquée dans l'image d'origine

random.shuffle(create_training_data)   #Mélanger les données


x_train = []    #données d'image
t_train = []    #Étiquette de réponse correcte

#Création de l'ensemble de données->La fonction est le nombre impair et l'étiquette est le nombre pair
for feature, label in create_training_data:
    x_train.append(feature)
    t_train.append(label)

#Convertir en tableau numpy
x_train = np.array(x_train)
t_train = np.array(t_train)

#Vérification du jeu de données
for i in range(0, 4):
    print("Libellé des données d'entraînement", t_train[i])
    plt.subplot(2, 2, i+1)  # subplot(Combien de lignes,Combien de lignes,Zone que vous souhaitez dessiner)
    plt.axis('off') #Masquer les axes
    #Étiquetez un homme si le numéro d'index est 0 ou 1, et une femme si le numéro d'index est 2 ou 3.
    if t_train[i] == 0 or t_train[i] == 1:
        plt.title(label =  "Man")
        # plt.title("Masculin", fontname="MS Gothic") # ->La notation japonaise est possible
    else:
        plt.title(label = 'Woman')
        # plt.title("Femme", fontname="MS Gothic") # ->La notation japonaise est possible
    plt.imshow(x_train[i], cmap='gray')

plt.show()

Le code de ce côté n'a rien à voir avec la génération de mosaïques, mais je l'ai utilisé pour vérifier si la mosaïque est faite correctement. Après cela, je n'ai pas eu à créer un ensemble de données cette fois, mais j'ai pu saisir le flux de création d'un ensemble de données.

Notes non utilisées cette fois

isinstance: renvoie True ou False si la variable est de ce type

`・ La variable que vous souhaitez vérifier dans le premier argument ・ Tapez ʻdans le deuxième argument

set méthode

Les éléments dupliqués entre {} sont ignorés

os.remove ('file path'): Supprimez les fichiers inutiles

Impressions

Cela a fini par être plus facile à mettre en œuvre que ce que j'avais imaginé à l'origine. Je me demandais si je devais faire un traitement compliqué après la création de l'ensemble de données, mais cela ne s'est pas du tout produit et cela s'est terminé immédiatement. Après tout, je pense que la détection de visage «Cascade» était pratique. Une autre chose est que la «méthode de la mosaïque était incroyablement facile».

Au début, je pensais que ce serait difficile et j'avais besoin de plus de préparation, mais quand j'ai commencé à le faire, c'était amusant.

Le code contient beaucoup de commentaires, mais si je ne note pas ce que fait le processus, je l'oublierai et je paniquerai, alors je l'ai écrit.

Résumé

Pour la première fois, j'ai pu le mettre en œuvre du début à la fin avec ma propre puissance. Ce n'est pas encore un gros problème, mais j'espère pouvoir écrire beaucoup de programmes d'ici.

Recommended Posts

Génération automatique de mosaïques
Génération automatique de modèles de collage
Génération automatique de quiz avec COTOHA
Génération automatique du code de test PyCharm
Génération automatique de Sadamasashi Kawayanagi
Génération de séquence
Essayez facilement la génération automatique d'images avec DCGAN-tensor flow
Génération automatique Powerpo avec python-pptx (mémo personnel)
[Python3] Génération automatique de texte avec janome et markovify