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.
MacOS, VScode, python3.6(anaconda)
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()
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".
`・ 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.
(coordonnée x, coordonnée y, largeur, hauteur)
・ Premier argument → chemin du fichier (ajoutez .jpg à la fin) ・ Deuxième argument → Variable de l'image que vous souhaitez enregistrer (ndarray)
① 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.
`・ La variable que vous souhaitez vérifier dans le premier argument ・ Tapez ʻdans le deuxième argument
Les éléments dupliqués entre {} sont ignorés
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.
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