DeOldify: Ein Programm zum Färben von Schwarzweißbildern

Kurz gesagt, die Aufgabe dieses Projekts ist es, alte Fotos einzufärben und wiederherzustellen. Ich werde etwas tiefer in die Details gehen, aber zuerst sehen wir uns die Fotos an! Übrigens stammen die meisten Quellbilder aus dem Subreddit r / TheWayWeWere. Ich danke allen für diese qualitativ hochwertigen Großaufnahmen.

Dies sind nur einige Beispiele, und sie sind ziemlich typisch!

Maria Anderson als die kleine Fee und ihre Seite Lyubov Ryabtsova im Ballett Dornröschen am Kaiserlichen Theater, St. Petersburg, Russland, 1890



Eine Frau entspannt sich in ihrem Wohnzimmer (1920, Schweden)



Medizinstudenten posieren in der Nähe einer Leiche, um 1890



Surfer in Hawaii, 1890



Spinnendes Pferd, 1898



Das Innere der Bar Miller and Shoemaker, 1899



Paris in den 1880er Jahren



Luftaufnahme von Edinburgh in den 1920er Jahren



Texas Frau im Jahr 1938



Die Leute an der Waterloo Station sehen zum ersten Mal fern, London, 1936



Geographieunterricht 1850



Chinesische Opiumraucher im Jahre 1880



Bitte beachten Sie, dass selbst wirklich alte und / oder qualitativ schlechte Fotos immer noch ziemlich cool aussehen:

Deadwood, South Dakota, 1877



Brüder und Schwestern im Jahre 1877 (Deadwood)



Portsmouth Square in San Francisco, 1851



Samurai, um 1860er Jahre



Natürlich ist das Modell nicht perfekt. Diese rote Hand macht mich verrückt, aber sonst funktioniert es fantastisch:

Seneca Iroquois Girl, 1908



Sie kann auch Schwarzweißzeichnungen kolorieren:



Technische Details


Dies ist ein Deep-Learning-Modell. Insbesondere habe ich folgende Ansätze kombiniert:

  • Selbstaufmerksamkeit GAN . Das einzige ist, dass das vorab trainierte Unet als Generator verwendet wird und ich es nur für die spektrale Normalisierung und in der Tat für den Selbstaufmerksamkeitsmechanismus geändert habe. Dies ist eine ziemlich einfache Modifikation. Ich sage Ihnen, dass der Unterschied zur vorherigen Version von Wasserstein GAN, mit der ich versucht habe, funktioniert, auffällig ist. Ich mochte die Wasserstein-GAN-Theorie, aber in der Praxis funktioniert sie nicht. Aber ich habe mich einfach in das Self-Attention GAN-Netzwerk verliebt.
  • Eine Lernstruktur wie das fortschreitende Wachstum eines GAN (aber nicht genau das gleiche). Der Unterschied besteht darin, dass die Anzahl der Ebenen konstant bleibt: Ich habe gerade die Größe der Eingabedaten geändert und die Lerngeschwindigkeit so angepasst, dass die Übergänge zwischen den Größen erfolgreich waren. Es scheint, dass es das gleiche Endergebnis liefert, aber schneller lernt, stabiler ist und die Generalisierung besser durchführt.
  • TTUR-Regel (Zwei-Zeitskalen-Aktualisierungsregel). Hier ist es ziemlich klar: nur eine Eins-zu-Eins-Iteration des Generators / Diskriminators (Kritik) und eine höhere Lerngeschwindigkeit des Diskriminators.
  • Die Generatorverlustfunktion besteht aus zwei Teilen: Einer davon ist die Hauptfunktion des Wahrnehmungsverlusts (oder Merkmalsverlusts) basierend auf VGG16 - sie drückt einfach das Generatormodell, um das Eingabebild zu replizieren. Der zweite Teil ist die Schätzung der Verluste durch den Diskriminator (Kritik). Für Neugierige: Nur die Perceptual Loss-Funktion reicht für ein gutes Ergebnis nicht aus. Es neigt dazu, einfach ein paar Braun / Grün / Blau zu fördern - Sie wissen, indem Sie den Test austricksen, was sind neuronale Netze wirklich gut! Der entscheidende Punkt ist, dass die GANs im Wesentlichen die Verlustfunktion für Sie lernen, was tatsächlich ein großer Schritt in Richtung des Ideals ist, das wir beim maschinellen Lernen anstreben. Und natürlich werden sich die Ergebnisse erheblich verbessern, wenn die Maschine selbst lernt, was Sie zuvor manuell codiert haben. Dies ist hier natürlich der Fall.

Das Schöne an diesem Modell ist, dass es in einer Vielzahl von Bildmodifikationen ziemlich gut ist. Was Sie oben sehen, sind die Ergebnisse des Farbmodells, aber dies ist nur eine Komponente in der Pipeline, die ich mit demselben Modell entwickeln möchte.

Als nächstes werde ich versuchen, die alten Bilder zu perfektionieren, und der nächste Tagesordnungspunkt ist ein Modell zur Verbesserung der Sättigung und des Reichtums (Defade). Jetzt befindet sie sich in einem frühen Stadium der Ausbildung. Dies ist im Grunde das gleiche Modell, jedoch mit einigen Kontrast- / Helligkeitseinstellungen als Simulation von verblassten Fotos und Bildern, die mit alten / schlechten Geräten aufgenommen wurden. Ich habe bereits einige ermutigende Ergebnisse erhalten:



Projektdetails


Was ist das Wesentliche dieses Projekts? Ich möchte nur GAN anwenden, damit alte Fotos sehr, sehr gut aussehen. Und was noch wichtiger ist, es wird das Projekt nützlich machen . Und ja, ich bin definitiv daran interessiert, mit dem Video zu arbeiten, aber zuerst muss ich herausfinden, wie ich dieses Modell unter Kontrolle des Speicherverbrauchs bringen kann (dies ist ein echtes Biest). Es wäre schön, wenn die Modelle auf 1080Ti nicht zwei bis drei Tage lernen würden (leider typisch für GAN). Dies ist zwar mein Kind und ich werde den Code auf absehbare Zeit aktiv aktualisieren und verbessern, aber ich werde versuchen, das Programm so benutzerfreundlich wie möglich zu gestalten, obwohl es wahrscheinlich einige Schwierigkeiten damit geben wird.

Und ich schwöre, ich werde den Code eines Tages richtig dokumentieren. Zugegeben, ich gehöre zu den Menschen, die an "selbstdokumentierenden Code" (LOL) glauben.

Selbststartmodell


Das Projekt basiert auf der wunderbaren Bibliothek Fast.AI. Leider handelt es sich um eine alte Version, die noch auf eine neue aktualisiert werden muss (dies steht definitiv auf der Tagesordnung). Also, die Voraussetzungen, kurz gesagt:

  • Alte Bibliothek Fast.AI. Nachdem ich mich zwei Monate lang in dem Projekt vergraben hatte, habe ich ein wenig verpasst, was damit passiert ist, weil das, das jetzt als „alt“ markiert ist, nicht wirklich so aussieht wie das, das ich habe. In den letzten zwei Monaten hat sich alles geändert. Wenn also nichts mit anderen Versionen funktioniert, habe ich es hier gegabelt . Auch hier steht die Aktualisierung auf die neueste Version auf der Tagesordnung. Ich entschuldige mich im Voraus.
  • Alle Fast.AI-Abhängigkeiten : Dort gibt es praktische Anforderungen.txt- und Umgebungs.yml-Dateien.
  • Pytorch 0.4.1 (spectral_norm ist erforderlich, daher benötigen Sie die neueste stabile Version).
  • JupyterLab .
  • Tensorboard (d. H. Installation von Tensorflow) und TensorboardX . Ich denke, das ist nicht unbedingt notwendig, aber es ist viel einfacher. Für Ihre Bequemlichkeit habe ich bereits alle notwendigen Hooks / Callbacks in Tensorboard bereitgestellt! Es gibt Beispiele für ihre Verwendung. Es ist bemerkenswert, dass Bilder während der Verarbeitung standardmäßig alle 200 Iterationen im Tensorboard aufgezeichnet werden, sodass Sie eine konstante und bequeme Ansicht der Funktionsweise des Modells erhalten.
  • ImageNet : Ein ausgezeichneter Datensatz für das Training.
  • Leistungsstarke Grafikkarte . Ich hätte wirklich gerne mehr Speicher als 11 GB in meiner GeForce 1080Ti. Wenn Sie etwas Schwächeres haben, wird es schwierig sein. Unet und Critic sind absurd großartig, aber je größer sie sind, desto besser sind die Ergebnisse.

Wenn Sie die Bildverarbeitung jetzt selbstständig starten möchten, ohne das Modell zu trainieren, können Sie hier vorgefertigte Gewichte herunterladen. Öffnen Sie dann ColorizationVisualization.ipynb in JupyterLab. Stellen Sie sicher, dass eine Linie mit einem Link zu den Gewichten vorhanden ist:

colorizer_path = Path('/path/to/colorizer_gen_192.h5') 

Anschließend müssen Sie das Colorizer-Modell nach der Initialisierung von netG laden:

 load_model(netG, colorizer_path) 

Legen Sie dann einfach alle Bilder in den Ordner / test_images /, von wo aus Sie das Programm starten. Sie können die Ergebnisse im Jupyter-Notizbuch mit den folgenden Zeilen visualisieren:

 vis.plot_transformed_image("test_images/derp.jpg", netG, md.val_ds, tfms=x_tfms, sz=500) 

Ich würde eine Größe von ungefähr 500px plus oder minus sparen, wenn Sie das Programm auf einer GPU mit viel Speicher ausführen (z. B. GeForce 1080Ti 11 GB). Wenn weniger Speicher vorhanden ist, müssen Sie die Größe der Bilder reduzieren oder versuchen, auf der CPU zu laufen. Ich habe tatsächlich versucht, Letzteres zu tun, aber aus irgendeinem Grund arbeitete das Modell sehr, absurd langsam, und ich fand keine Zeit, das Problem zu untersuchen. Kenner empfahlen, Pytorch aus den Quellen zu bauen, dann würde sich eine große Leistungssteigerung ergeben. Hmm ... In diesem Moment war es nicht vorher.

Weitere Informationen


Die Visualisierung der generierten Bilder, wie Sie sie lernen, kann auch in Jupyter erfolgen: Sie müssen sie nur auf true setzen, wenn Sie eine Instanz dieses Visualisierungs-Hooks erstellen:

GANVisualizationHook(TENSORBOARD_PATH, trainer, 'trainer', jupyter=True, visual_iters=100

Ich lasse lieber falsch und benutze einfach Tensorboard. Glauben Sie mir, Sie wollen auch genau das tun. Wenn Sie es zu lange arbeiten lassen, wird Jupyter mit solchen Bildern viel Speicherplatz verbrauchen.

Modellgewichte werden auch während der GANTrainer-Trainingsläufe automatisch gespeichert. Standardmäßig werden sie alle 1000 Iterationen gespeichert (dies ist eine teure Operation). Sie werden in dem Stammordner gespeichert, den Sie für das Training angegeben haben, und der Name entspricht dem im Trainingsplan angegebenen save_base_name. Die Gewichte werden für jede Trainingsgröße separat gespeichert.

Ich würde empfehlen, den Code von oben nach unten zu navigieren, beginnend mit dem Jupyter-Notizbuch. Ich nehme diese Notizen einfach als praktische Schnittstelle für Prototyping und Visualisierung. Alles andere wird in die .py-Dateien verschoben, sobald ich einen Platz für sie gefunden habe. Ich habe bereits Beispiele für Visualisierungen, die Sie bequem aktivieren und anzeigen können: Öffnen Sie einfach xVisualization im Notizbuch, die im Projekt enthaltenen Testbilder werden dort aufgelistet (sie befinden sich in test_images).

Wenn Sie GAN-Zeitpläne sehen, ist dies die hässlichste Sache im Projekt, nur meine Version der GAN-Implementierung für progressives Lernen, die für den Unet-Generator geeignet ist.

Hier finden Sie auch die vorab trainierten Gewichte für den Colorizer-Generator. Das DeFade-Projekt ist noch in Arbeit, ich werde versuchen, in ein paar Tagen gute Gewichte herauszuholen.

Normalerweise sehen Sie während des Trainings die ersten guten Ergebnisse auf halbem Weg, dh mit einer Größe von 192px (wenn Sie die bereitgestellten Trainingsbeispiele verwenden).

Ich bin mir sicher, dass ich es irgendwo vermasselt habe, also lass es mich wissen, wenn das so ist.

Bekannte Probleme


  • Sie müssen ein wenig mit der Größe des Bildes spielen , um das beste Ergebnis zu erzielen. Das Modell leidet eindeutig unter einem gewissen Seitenverhältnis und Seitenverhältnis bei der Erzeugung von Bildern. Früher war es viel schlimmer, aber die Situation verbesserte sich erheblich mit der Zunahme der Beleuchtung / des Kontrasts und der Einführung des progressiven Lernens. Ich möchte dieses Problem vollständig beseitigen und mich darauf konzentrieren, aber bis jetzt nicht verzweifeln, wenn das Bild übermäßig gesättigt oder mit seltsamen Störungen aussieht. Höchstwahrscheinlich wird nach einer kleinen Größenänderung alles normal. In der Regel müssen Sie bei übersättigten Bildern die Größe erhöhen.
  • Darüber hinaus kommt es bei der Auswahl der optimalen Parameter darauf an , die besten Bilder zu erhalten. Ja, die Ergebnisse werden manuell ausgewählt. Ich bin sehr zufrieden mit der Qualität und das Modell funktioniert ziemlich zuverlässig, aber nicht perfekt. Das Projekt läuft noch! Ich denke, das Tool kann als „KI-Künstler“ verwendet werden, ist aber noch nicht für die breite Öffentlichkeit bereit. Nur nicht die Zeit.
  • Um die Situation zu verkomplizieren: Derzeit frisst das Modell brutal Speicher , sodass sich auf meiner 1080Ti-Karte herausstellt, dass Bilder mit maximal 500-600 Pixel verarbeitet werden. Ich wette, es gibt hier viele Optimierungsoptionen, aber ich habe es noch nicht getan.
  • Ich habe dem Unet-Generator für alles, was nicht den erwarteten Größen entspricht, keine Auffüllung hinzugefügt (so kann ich ein Bild beliebiger Größe laden). Es war ein sehr schneller Hack, und es führt zu dummen rechten und unteren Rändern bei der Ausgabe von Testbildern beliebiger Größe. Ich bin mir sicher, dass es einen besseren Weg gibt, habe ihn aber noch nicht gefunden.
  • Model liebt blaue Kleidung. Nicht ganz sicher warum, die Lösung liegt in der Suche!

Willst du mehr?


Ich werde neue Ergebnisse auf Twitter veröffentlichen .

Ergänzung durch den Übersetzer.
Von letzterem auf Twitter:

Vertreter der Nationalität selbst bei ihrem Unterstand, 1880


( Original )

Der Bau der Londoner U-Bahn, 1860


( Original )

Die Slums von Baltimore, 1938



Fitnessstudio auf der Titanic, 1912


( Original )

Source: https://habr.com/ru/post/de428818/


All Articles