Hallo, ich bin süß, während ich Deep Learning studiere. Diesmal habe ich ein Programm ausprobiert, das automatisch ein Mosaik auf einem Bild generiert.
MacOS, VScode, python3.6(anaconda)
Beim Schreiben dieses Programms Gesichtserkennung (OpenCV) in 30 Zeilen und Ausgabedatei! Mosaikverarbeitung für Bilder mit Python, OpenCV (gesamte Oberfläche, Teil, Fläche usw.) Grundlegende Bildtransformation von opencv: Insgesamt 12 Beispiele! Ich habe auf diese Artikel verwiesen!
#Ordner, die im str-Typ wie Man ~ Women gespeichert sind, können erst angezeigt werden, nachdem sie diesem Pfad hinzugefügt wurden
DATADIR = "/Users/Nutzername/Documents/Unterlagen- MacBook Pro/HelloWorld.py/"
Zunächst denke ich, dass es einen Ordner gibt, in dem die Bilddatei so gespeichert wird, aber der Variablen den Pfad bis zum vorherigen zuweisen. In diesem Fall enthält der Ordner "HelloWorld.py" die Ordner "Man ~ Women".
#Lesen Sie die Haarcascade-XML-Datei(Lesen Sie die Vorderseite)
xml_path = "./haarcascade_frontalface_default.xml"
Es ist möglich, die Site mit Cascade zu erkennen.
・ Erkennung der Vorderseite: haarcascade_frontalface_default_xml ・ Augenerkennung: haarcascade_eye.xml ・ Lächelnerkennung: haarcascade_smile.xml
Es ist gut, darüber nachzudenken, was Sie jeweils erkennen und lesen möchten.
Categories = ["Man", "Men", "Woman", "Women"]
img_size = 250
mosaic_size = 10
training_data = []
#Programm zur Gesichtserkennung+Datensatzgenerierung
def create_training_data(): # Man->Argumente in der Reihenfolge der Frauen
#Stellen Sie den Gesichtsbereichsklassifikator ein
classifier = cv2.CascadeClassifier(xml_path)
cnt = 1
for class_num, category in enumerate(Categories): #Sie können sowohl Index als auch Element mit enumerate abrufen
path = os.path.join(DATADIR, category) #Kombinieren Sie jedes Element aus Kategorien und DATADIR->Zugang zu Mann ~ Frauen
for image_name in os.listdir(path): #Holen Sie sich eine Liste der Fotos von Mann und Frau-> image_Alle Namen sind vom Typ str
#Graustufenbild(Zur Identifizierung) <-Nehmen Sie die Bilder einzeln heraus
gray_img = cv2.imread(os.path.join(path, image_name), cv2.IMREAD_GRAYSCALE) #Imread kann nur gelesen werden, wenn es sich um eine Reihe von Pfaden handelt-> image_Ich erhalte eine Fehlermeldung mit nur Namen
#Die Rückgabewerte sind x-Koordinate, y-Koordinate, Breite und Höhe.
face_points = classifier.detectMultiScale(gray_img, minSize=(20, 20))
#Schneiden Sie das Farbbild aus dem Identifikationsergebnis
for x, y, width, height in face_points: #Holen Sie sich Koordinatenpunkte des Gesichtsbereichs
#Gesichtsbereich kürzen
dst_img = gray_img[y:y+height, x:x+width] #Das Bild ist vertikal x horizontal
face_img = cv2.resize(dst_img, (mosaic_size, mosaic_size), interpolation=cv2.INTER_NEAREST) #Bildgröße ändern-> resize(Bild zum Ändern der Größe, (Linie,Säule))
mosaic_img = cv2.resize(face_img, (width, height), interpolation=cv2.INTER_NEAREST) #Auf Originalgröße zurücksetzen-> (width, height)Zurück in
gray_img[y:y+height, x:x+width] = mosaic_img #Der Mosaikteil wird in das Originalbild eingefügt
cv2.imwrite('mosaic' + str(cnt) + '.jpg', gray_img) #Bild speichern
try:
training_data.append([gray_img, class_num]) #Bilddaten und Etiketteninformationen hinzugefügt-> class_Die Indexnummer wird auch in der Liste mit num gespeichert
except Exception as e: #Wenn ein Ausnahmetyp namens Ausnahme auftritt, machen Sie keinen Fehler und gehen Sie durch
pass
cnt += 1
create_training_data()
Bitte beachten Sie jedoch, dass der Datentyp in Form von "3D ndarray" vorliegt. Sie können den Bildtyp mit dem zweiten Argument bestimmen. Diesmal handelt es sich um ein "Graustufenbild".
`・ ScaleFactor: Größer wird fälschlicherweise erkannt, kleiner wird nicht erkannt. Je näher es an 1,01 liegt, desto feiner kann die Erkennung sein. ┗ Größere Reichweite kann erkannt werden ・ MinNeighbors: Je größer es ist, desto zuverlässiger ist es. ⇄ Die Wahrscheinlichkeit, ein Gesicht zu verpassen, steigt. ┗ Doppelte Erkennungsorte → Überlappende Objekte sind sehr zuverlässig -MinSize: Die Mindestgröße, die ein Objekt annehmen kann. Objekte, die kleiner als diese sind, werden ignoriert
・ Erstes Argument → Dateipfad (am Ende .jpg hinzufügen) ・ Zweites Argument → Variable des Bildes, das Sie speichern möchten (ndarray)
① Schneiden Sie den Bereich, den Sie mosaikieren möchten. (2) Reduzieren Sie die Bildgröße dieses Teils einmal. ③ Kehren Sie zur Originalgröße zurück ④ Fügen Sie den mosaikierten Teil in das Originalbild ein
random.shuffle(create_training_data) #Daten mischen
x_train = [] #Bilddaten
t_train = [] #Richtiges Antwortetikett
#Datensatzerstellung->Das Feature hat eine ungerade Nummer und das Etikett hat eine gerade Nummer.
for feature, label in create_training_data:
x_train.append(feature)
t_train.append(label)
#In numpy Array konvertieren
x_train = np.array(x_train)
t_train = np.array(t_train)
#Überprüfen des Datensatzes
for i in range(0, 4):
print("Trainingsdatenetikett", t_train[i])
plt.subplot(2, 2, i+1) # subplot(Wie viele Zeilen,Wie viele Zeilen,Bereich, den Sie zeichnen möchten)
plt.axis('off') #Achsen ausblenden
#Beschriften Sie einen Mann, wenn die Indexnummer 0 oder 1 ist, und eine Frau, wenn die Indexnummer 2 oder 3 ist.
if t_train[i] == 0 or t_train[i] == 1:
plt.title(label = "Man")
# plt.title("männlich", fontname="MS Gothic") # ->Japanische Notation ist möglich
else:
plt.title(label = 'Woman')
# plt.title("Weiblich", fontname="MS Gothic") # ->Japanische Notation ist möglich
plt.imshow(x_train[i], cmap='gray')
plt.show()
Der Code auf dieser Seite bezieht sich nicht auf die Mosaikgenerierung, aber ich habe ihn verwendet, um zu überprüfen, ob das Mosaik ordnungsgemäß erstellt wurde. Danach musste ich dieses Mal kein Dataset erstellen, aber ich konnte den Ablauf beim Erstellen eines Datasets erfassen.
・ Die Variable, die Sie im ersten Argument einchecken möchten ・ Geben Sie
in das zweite Argument ein
Doppelte Elemente in {} werden ignoriert
Es war einfacher zu implementieren, als ich es mir ursprünglich vorgestellt hatte. Ich habe mich gefragt, ob ich nach dem Erstellen des Datensatzes eine komplizierte Verarbeitung durchführen musste, aber es ist überhaupt nicht passiert und es endete sofort. Immerhin denke ich, dass die Gesichtserkennung "Cascade" praktisch war. Eine andere Sache ist, dass die "Mosaik-Methode wahnsinnig einfach war".
Zuerst dachte ich, es wäre schwierig und ich dachte, ich brauche mehr Vorbereitung, aber als ich anfing, es zu machen, machte es Spaß.
Der Code enthält viele Kommentare, aber wenn ich nicht notiere, was der Prozess tut, werde ich ihn vergessen und in Panik geraten, also habe ich ihn geschrieben.
Zum ersten Mal konnte ich es von Anfang bis Ende aus eigener Kraft umsetzen. Es ist noch keine große Sache, aber ich hoffe, dass ich von hier aus viele Programme schreiben kann.
Recommended Posts