ConSinGAN: Ich habe versucht, GAN zu verwenden, das aus einem Bild generiert werden kann

Einführung

Die Technologie namens GAN (Genarative Adversarial Network), die durch tiefes Lernen neue Bilder aus vorhandenen Bildern erzeugt, war die Technologie, von der ich beim tiefen Lernen am meisten beeindruckt war. Da das Lernen jedoch normalerweise eine große Menge an Trainingsdaten und -zeit erfordert, ist sie recht individuell. Ich konnte es nicht versuchen. Zu dieser Zeit habe ich das folgende Papier gesehen, in dem ein GAN entwickelt wurde, das aus nur einem Trainingsbild generiert werden kann, und es untersucht.

Improved Techniques for Training Single-Image GANs

Dies ist ein im März dieses Jahres eingereichtes Papier, das letztes Jahr eingereicht wurde.

SinGAN: Learning a Generative Model from a Single Natural Image

Es scheint eine Verbesserung von SinGAN (Single-Image-GAN) zu sein, die in vorgeschlagen wurde.

GAN GAN (Hostile Generation Network) selbst ist bekannt und wird auf vielen Websites erklärt, daher werde ich die Details weglassen. Bitte beziehen Sie sich auf hier. GAN ist eines der "Generationsmodelle", die die Verteilung von Trainingsdaten lernen und ähnliche Daten generieren. Erstellen Sie einen Generator, der gefälschte Daten generiert, und einen Diskriminator, der sie von den realen unterscheidet, und trainieren Sie sie abwechselnd. Dadurch werden schließlich Daten generiert, die nicht von der Realität zu unterscheiden sind. Dies wird oft mit gefälschten Rechnungen verglichen. Der Fälscher (Generator) lernt, die Polizei (Diskriminator) zu täuschen, und die Polizei lernt, die gefälschte Rechnung zu erkennen. Hier sind die Trainingsdaten $ \ boldsymbol {x} $, das Rauschen ist $ z $, die Wahrscheinlichkeitsverteilung ist $ p (\ boldsymbol {x}) $, $ p (z) $, der Generator ist $ G $ und der Diskriminator ist $ D. Wenn die Wahrscheinlichkeit, dass $, Discriminator $ \ boldsymbol {x} $ korrekt identifiziert, $ D (\ boldsymbol {x}) $ ist und die aus $ z $ des Generators generierten Daten $ G (z) $ sind, lautet die Zielfunktion wie folgt. Es sieht aus wie.

{\rm min}_{G}{\rm max}_{D}V(D,G)=\mathbb{E}_{\boldsymbol{x}\sim p_{data}(\boldsymbol{x})}[{\rm log}D(\boldsymbol{x})]+\mathbb{E}_{z\sim p_{z}(z)}[{\rm log}(1-D(G(z)))]

Der Generator verwechselt die reale Sache mit einer Fälschung ($ D (\ boldsymbol {x}) \ bis 0 ) und die Fälschung mit einer realen Sache ( D (G (z)) \ bis 1 $), also $ V (D) , G) $ lernt, kleiner zu sein, und Discriminator lernt das Gegenteil, so dass $ V (D, G) $ größer ist. GAN hat viele Derivate und viele erstaunliche Technologien wie Bildkonvertierung (Strichzeichnung ⇔ Foto, Sommerfoto ⇔ Winterfoto) und Bilderzeugung von nicht existierenden Menschen wurden geschaffen. (Für Details klicken Sie hier](https://qiita.com/shionhonda/items/330c9fdf78e62db3402b#%E7%94%BB%E5%83%8F%E5%A4%89%E6%8F%9B))

SinGAN Herkömmliche GAN erfordern eine große Menge an Trainingsdaten zum Lernen, aber SinGAN (Single-Image-GAN) ist eine GAN, die aus einem einzelnen Bild gelernt werden kann, wie der Name schon sagt. Zu den SinGAN-Aufgaben gehören die bedingungslose Bilderzeugung und die Bildharmonisierung. (Siehe unten)

Lernmethode

In SinGAN mehrere, wie in der Abbildung gezeigt (zitiert aus Paper Short Summary) Mit dem Generator empfängt jeder Generator das Ausgabebild des vorherigen Generators als Eingabe. Außerdem lernt jeder Generator einzeln und das Gewicht des vorherigen Generators ist zum Zeitpunkt des Lernens festgelegt. (Lerne zuerst G0, repariere G0 und lerne G1, repariere G0 und G1 und lerne G2 ...) Der wichtige Punkt hierbei ist, dass Sie mit Discriminator das Bild als Patch und nicht als Ganzes anzeigen können, um ein Bild zu erstellen, das an einem Punkt wie das Original aussieht, aber als Ganzes anders aussieht. (Split Colosseo in der Abbildung)

ConSinGAN Da festgestellt wurde, dass die oben beschriebene Methode die Interaktion zwischen Generatoren einschränkt, ist die neu vorgeschlagene Methode ConSinGAN (Concurrently-Single-Image-GAN), die gleichzeitig (Concurrently) lernt, ohne den Generator zu reparieren. ist.

Lernmethode

Wenn Sie alle Generatoren gleichzeitig lernen, werden Sie überanpassen, sodass die folgenden zwei Punkte in das Papier aufgenommen werden.

  1. Lernen Sie die letzten drei Generatoren gleichzeitig.
  2. Verringern Sie die Lernrate jedes Mal um 1/10, wenn Sie zum vorherigen Generator wechseln. Dies sieht aus wie die Abbildung (zitiert aus Paper Short Summary) .. Die Optimierungsmethode ist Adam.

Wenn Sie hier die Lernrate reduzieren, werden verschiedene generierte Bilder erstellt, sodass die Reproduzierbarkeit des Trainingsbilds verloren geht und eine Kompromissbeziehung besteht.

Wenn Sie diesmal die Anzahl der Generatoren mit dieser ConSinGAN-Lernmethode reduzieren, beträgt die Lernzeit im Vergleich zu SinGAN etwa 1/6, und es wird eine höhere Leistung erzielt.

Modellarchitektur

image.png

Sowohl Genarator als auch Discriminator haben eine Struktur, in der mehrere Faltschichten gestapelt sind, wie in der Abbildung gezeigt (zitiert aus Paper). Hier wird die Feature-Map, die der Eingang für den nächsten Generator sein wird, hochgesampelt, dann wird Rauschen für die Diversität hinzugefügt, und der Ausgang wird durch eine Restverbindung verbunden, so dass er nicht wesentlich abweicht.

Zielfunktion

Die Zielfunktion im Stadium $ n $ ist wie folgt.

{\rm min}_{G_{n}}{\rm max}_{D_{n}}L_{\rm adv}(G_n,D_n)+\alpha L_{\rm rec}(G_n)

Hier verwendet $ L_ {\ rm adv} (G_n, D_n) $ die Wasserstein-Distanz als Zielfunktion WGAN-GP (Paper //arxiv.org/abs/1704.00028)) ist ein Begriff, der die Genauigkeit der Identifizierung ausdrückt, und $ L_ {\ rm rec} (G_n) $ drückt die Stabilität des Lernens durch den Abstand zwischen dem erzeugten Bild und dem Trainingsbild aus. Es ist ein Begriff.

L_{\rm adv}(G_n,D_n)=\mathbb{E}_{z\sim p_{z}(z)}[D(G(z))]-\mathbb{E}_{{\boldsymbol x}\sim p_{data}}[D({\boldsymbol x})]+\lambda \mathbb{E}_{{\hat{\boldsymbol x}}\sim p_{{\hat{\boldsymbol x}}}}[(||\nabla_{{\hat{\boldsymbol x}}} D({\hat{\boldsymbol x}})||_2-1)^2]\\

L_{\rm rec}(G_n)=||G_n(x_0)-x_n||_2^2

$ \ Alpha $ ist die Standardkonstante 10, $ {\ hat {\ boldsymbol x}} $ ist der Punkt auf der geraden Linie, der die Trainingsdaten und die generierten Daten verbindet, $ \ lambda $ ist die Konstante, $ x_n $ ist das Trainingsbild, $ x_0 $ ist das Eingabebild für $ G_n $. Die Eingabe von $ L_ {\ rm adv} (G_n, D_n) $ unterscheidet sich jedoch je nach Aufgabe. Beispielsweise wird bei der bedingungslosen Bilderzeugung Rauschen angegeben, bei der Bildharmonisierung wird das Trainingsbild jedoch vergrößert (Teil ausschneiden oder Farbe ändern usw.). Es scheint, dass es besser war, ein Bild mit (Rauschen hinzufügen) zu geben.

Aufgabe

Diesmal habe ich versucht, bedingungslose Bilderzeugung und Bildharmonisierung zu verwenden. Andere interessante Aufgaben werden erwähnt. Wenn Sie interessiert sind, lesen Sie bitte das Papier.

Unconditional Image Generation Zufällig zum Trainingsbild, wie in der Abbildung gezeigt (zitiert aus Short Summary) Sie können Rauschen $ z $ hinzufügen, um ein realistisches, nicht vorhandenes Bild zu erstellen und gleichzeitig die globale Struktur beizubehalten. (Sie können sehen, dass es angepasst wird, auch wenn Sie die Bildgröße ändern.)

a

Image Harmonization Trainingsbild (Malerei) wie in der Abbildung gezeigt (zitiert aus Paper Short Summary) Usw.) und harmonisieren Sie die hinzugefügten Objekte mit dem Stil des trainierten Bildes.

Feintuning

Mit der Bildharmonisierung können Sie bessere Ergebnisse erzielen, indem Sie das trainierte Modell mit einem naiven Bild weiter trainieren (naiv in der obigen Abbildung). (Feinabstimmung in der obigen Abbildung)

Implementierung

Ich habe die Öffentlichkeit GitHub geklont und auf Google Colaboratory ausgeführt, das die GPU kostenlos verwenden kann.

Setup


#Repository-Klon
!git clone https://github.com/tohinz/ConSinGAN.git
#Verwendete Bibliotheksinstallation
pip install -r requirements.txt

Unterwegs bekam ich eine Fehlermeldung, dass die Version des Colaboratory-Tools anders war, aber es gab kein Problem mit der Operation.

Unconditional Generation Platzieren Sie die Trainingsbilder in Images / Generation /. Ich werde die Rialtobrücke (rialto.jpg 1867 x 1400 Pixel) verwenden, die zuvor in Venedig aufgenommen wurde.

Unconditional_Generation


!python main_train.py --gpu 0 --train_mode generation --input_name Images/Generation/rialto.jpg

--gpu verwendet die GPU (standardmäßig 0), --train_mode gibt die Aufgabe an (Generierung, Harmonisierung usw.) und --input_name gibt den Pfad des Trainingsbildes an. Obwohl diesmal nicht geändert, können die Lernrate (--lr_scale) und die Anzahl der Generatoren (--train_stage) nach Wunsch geändert werden. Standardmäßig beträgt die Anzahl der Generatoren 5, und jeder lernt mit 2000 Iterationen. Das Training dauerte 69 Minuten, wahrscheinlich wegen seiner Größe. Das Ergebnis ist TrainedModels / rialto / yyyy_mm_dd_hh_mm_ss_generation_train_depth_3_lr_scale_0.1_act_lrelu_0.05. Hier sind einige generierte Beispiele.

gen_sample_4.jpggen_sample_8.jpggen_sample_23.jpg

Es ist etwas laut, aber eine matschige Brücke wurde geschaffen.

Image Harmonization

Gemälde × Cat

Lassen Sie uns das Bild der Katze mit dem Gemälde (Heu machen) abgleichen. Das Trainingsbild (300 x 300 Pixel hoshikusa.jpg) befindet sich links und das naive Bild (142 x 130 Pixel hoshikusa_naive.jpg) rechts. Platzieren Sie diese in Bild / Harmonisierung /. Ursprünglich scheint es ein Maskenbild zu platzieren, das den Teil des hinzuzufügenden Objekts ausschneidet, aber ich konnte es nicht erstellen, also erstelle ich es ohne Maske.

Ausbildung


!python main_train.py --gpu 0 --train_mode harmonization --train_stages 3 --min_size 120 --lrelu_alpha 0.3 --niter 1000 --batch_norm --input_name Images/Harmonization/hoshikusa.jpg 

Die Trainingszeit betrug 15 Minuten. Wenden Sie dann das naive Bild auf das Trainingsmodell an.

Auswertung


!python evaluate_model.py --gpu 0 --model_dir TrainedModels/hoshikusa/yyyy_mm_dd_hh_mm_ss_harmonization_train_depth_3_lr_scale_0.1_BN_act_lrelu_0.3 --naive_img Images/Harmonization/hoshikusa_naive.jpg

Das Ergebnis kann TrainedModels / hoshikusa / yyyy_mm_dd_hh_mm_ss_harmonization_train_depth_3_lr_scale_0.1_BN_act_lrelu_0.3 / Evaluation / sein.

Die Auflösung ist schlecht, aber die Farbe der Katze auf dem Foto hat sich geändert. Ich werde die Feinabstimmung versuchen.

Feintuning


!python main_train.py --gpu 0 --train_mode harmonization --input_name Images/Harmonization/hoshikusa.jpg --naive_img Images/Harmonization/hoshikusa_naive.jpg --fine_tune --model_dir TrainedModels/hoshikusa/yyyy_mm_dd_hh_mm_ss_harmonization_train_depth_3_lr_scale_0.1_BN_act_lrelu_0.3

Wenn die Standardanzahl der Iterationen 2000 Mal (11 Minuten) betrug, wurde sie wie links gezeigt in die Hintergrundfarbe integriert und überpasst. Das Papier besagt, dass 500 Mal ausreichend ist. (richtig)

Schwarzweißhintergrund × Ramen

Lassen Sie uns das Foto in einen Cartoon-Stil umwandeln. Das linke ist das Trainingsbild (pen_building.jpg 600 x 337 Pixel) und das rechte ist das naive Bild (pen_building_naive.jpg 283 x 213 Pixel).

Wenn ich es auf die gleiche Weise ausführte, war das Ergebnis wie folgt (Trainingszeit 9 Minuten). Die linke ist die normale Auswertung und die rechte ist die Feinabstimmung (100 Iterationen).

Ich habe Ramen wie einen Cartoon gemacht. Diese Aufgabe scheint ohne Feinabstimmung ausreichend zu sein.

Zusammenfassung

Dieses Mal las ich einen Artikel über ConSinGAN, eine verbesserte Version von SinGAN, die mit einem einzigen Trainingsbild unter Verwendung eines GAN-Modells generiert werden kann, an dem ich persönlich interessiert war. Es gibt viele Modelle der Bilderzeugungstechnologie, die beeindruckend sind, und die Ergebnisse sind leicht zu verstehen, sodass es Spaß macht. Es war jedoch schade, dass ich aus urheberrechtlichen Gründen nicht veröffentlichen konnte, was ich mit meinen Lieblings-Anime- und Cartoon-Bildern gemacht habe.

Recommended Posts

ConSinGAN: Ich habe versucht, GAN zu verwenden, das aus einem Bild generiert werden kann
Ich habe versucht, mit PI Fu aus einem Bild ein 3D-Modell einer Person zu erstellen
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Ich habe versucht, Headless Chrome von Selenium zu verwenden
Ich habe einen einfachen Timer erstellt, der vom Terminal aus gestartet werden kann
Ich habe versucht, die Python-Bibliothek "pykakasi" zu verwenden, die Kanji in Romaji konvertieren kann.
Ich habe ein Docker-Image erstellt, das FBX SDK Python von Node.js aus aufrufen kann
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, mit einem Foto einfach ein hochpräzises 3D-Bild zu erstellen [1]. (Die Tiefe kann jetzt in PNG bearbeitet werden.)
Ich habe versucht, eine Memo-App zu erstellen, die Pomodoro sein kann, aber eine Reflexionsaufzeichnung
Merkmalsmenge, die aus Zeitreihendaten extrahiert werden kann
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
ANTs Bildregistrierung, die in 5 Minuten verwendet werden kann
Ich habe versucht, PySpark von Jupyter 4.x auf EMR zu verwenden
Ich habe versucht, Daten aus einer Datei mit Node.js zu lesen.
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, Ipython zu verwenden
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, doctest zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
Ich habe ein Modul erstellt, das leicht fehlerhaft sein kann, aber ich kann das Argument nicht von entry_points übergeben
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Verschiedene Hinweise zur Verwendung von Python für Projekte
Skripte, die bei der Verwendung von Bottle in Python verwendet werden können
Ich habe die Vorbehandlung untersucht, die mit PyCaret durchgeführt werden kann
Ich habe versucht, mit pypyodbc schnell Daten von AS / 400 abzurufen
[Flask] Ich habe versucht, die "Docker-Compose-Konfiguration" zusammenzufassen, die schnell für Webanwendungen erstellt werden kann
Ich habe versucht, einen Dienst zu entwickeln, der Artikel nach Zweck auflisten kann
Ich habe versucht, es zu erweitern, damit die Datenbank mit der Analysesoftware von Wiire verwendet werden kann
Ich habe die Bildklassifizierung von AutoGluon ausprobiert
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe versucht, RandomForest zu verwenden
Ich habe versucht, BigQuery ML zu verwenden
Ich habe versucht, Amazon Glacier zu verwenden
Ich habe versucht, Git Inspector zu verwenden
Ich habe versucht, Magenta / TensorFlow zu verwenden
Ich habe versucht, AWS Chalice zu verwenden
Ich habe versucht, Slack Emojinator zu verwenden
[Python] Ich habe meine eigene Bibliothek erstellt, die dynamisch importiert werden kann
Ich habe eine KI erstellt, die ein Bild mit Saliency Map gut zuschneidet