[PYTHON] Automatische Mosaikerzeugung

Hallo, ich bin süß, während ich Deep Learning studiere. Diesmal habe ich ein Programm ausprobiert, das automatisch ein Mosaik auf einem Bild generiert.

Ausführungsumgebung

MacOS, VScode, python3.6(anaconda)

Ausführungsprogramm

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()

cv2.imread (): Bilddatei kann gelesen werden

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".

DetectMultiScale: Sie können die Ebene des Objekts ändern, die im Bild erkannt werden kann.

`・ 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

imwrite: Kann Bilddateien speichern

・ Erstes Argument → Dateipfad (am Ende .jpg hinzufügen) ・ Zweites Argument → Variable des Bildes, das Sie speichern möchten (ndarray)

Methode zur Erzeugung von Mosaiken

① 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.

Notizen werden diesmal nicht verwendet

isinstance: Gibt True oder False zurück, ob die Variable von diesem Typ ist

・ Die Variable, die Sie im ersten Argument einchecken möchten ・ Geben Sie in das zweite Argument ein

Methode einstellen

Doppelte Elemente in {} werden ignoriert

os.remove ('Dateipfad'): Entfernen Sie nicht benötigte Dateien

Impressionen

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.

Zusammenfassung

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

Automatische Mosaikerzeugung
Automatische Generierung von Collagenvorlagen
Automatische Quizgenerierung mit COTOHA
Automatische Generierung des PyCharm-Testcodes
Automatische Erzeugung von Sadamasashi Kawayanagi
Sequenzgenerierung
Probieren Sie ganz einfach die automatische Bilderzeugung mit DCGAN-Tensorfluss aus
Powerpo automatische Generierung mit Python-Pptx (persönliches Memo)
[Python3] Automatische Texterzeugung mit janome und markovify