Das neuronale Netz zeichnet Bilder. Ostagram: ein auf neuronalen Netzwerken basierender Dienst, der Fotos und Ornamente zu künstlerischen Meisterwerken kombiniert

Denn im August 2015 stellten deutsche Forscher der Universität Tübingen ihre über die Möglichkeit des Stiltransfers vor berühmte Künstler Auf anderen Fotos tauchten Dienste auf, die diese Gelegenheit zu Geld machten. Es wurde auf dem westlichen Markt und auf dem russischen Markt eingeführt - seine vollständige Kopie.

Zu den Lesezeichen

Trotz der Tatsache, dass Ostagram im Dezember gestartet wurde, begann es Mitte April schnell an Popularität in sozialen Netzwerken zu gewinnen. Gleichzeitig waren am 19. April weniger als tausend Personen im Projekt auf VKontakte.

Um den Dienst nutzen zu können, müssen Sie zwei Bilder vorbereiten: ein Foto, das bearbeitet werden muss, und ein Bild mit einem Beispiel für einen Stil, der über das Originalbild gelegt wird.

Der Dienst hat eine kostenlose Version: Er erstellt ein Bild in einer Mindestauflösung von bis zu 600 Pixeln entlang der längsten Seite des Bildes. Der Benutzer erhält das Ergebnis von nur einer der Iterationen der Anwendung des Filters auf das Foto.

Es gibt zwei kostenpflichtige Versionen: Premium erzeugt ein Bild mit bis zu 700 Pixeln entlang der längsten Seite und wendet 600 Iterationen der neuronalen Netzwerkverarbeitung auf das Bild an (je mehr Iterationen, desto interessanter und intensiver die Verarbeitung). Ein solches Bild kostet 50 Rubel.

In der HD-Version können Sie die Anzahl der Iterationen anpassen: 100 kosten 50 Rubel und 1000 - 250 Rubel. In diesem Fall hat das Bild auf der längsten Seite eine Auflösung von bis zu 1200 Pixeln und kann zum Drucken auf Leinwand verwendet werden: Ostagram bietet diesen Service mit Lieferung ab 1800 Rubel an.

Im Februar werden Vertreter von Ostagram keine Anfragen zur Bildbearbeitung von Benutzern "aus Ländern mit entwickeltem Kapitalismus" annehmen, sondern dann Zugang zur Fotobearbeitung für VKontakte-Benutzer aus der ganzen Welt. Dem auf GitHub veröffentlichten Ostagram-Code nach zu urteilen, wurde er von Sergey Morugin, einem 30-jährigen Einwohner von Nischni Nowgorod, entwickelt.

TJ kontaktiert Kaufmännischer Leiter Projekt, vorgestellt von Andrey. Seiner Meinung nach erschien Ostagram vor Instapainting, wurde aber von einem ähnlichen Projekt namens Vipart inspiriert.

Ostagram wurde von einer Gruppe von Studenten der NNSTU entwickelt. Alekseeva: Nach anfänglichen Tests an einer kleinen Gruppe von Freunden Ende 2015 entschieden sie sich, das Projekt öffentlich zu machen. Anfangs war die Bildbearbeitung völlig kostenlos, und es war geplant, mit dem Verkauf gedruckter Gemälde Geld zu verdienen. Als größtes Problem stellte sich laut Andrey der Druck heraus: Fotos von Menschen, die von einem neuronalen Netzwerk verarbeitet wurden, sehen für das menschliche Auge selten angenehm aus, und der Endkunde muss das Ergebnis lange anpassen, bevor er es auf die Leinwand bringt, was erfordert viele Maschinenressourcen.

Für die Bildverarbeitung wollten die Macher von Ostagram Cloud-Server von Amazon verwenden, aber nach dem Zustrom von Benutzern wurde klar, dass die Kosten dafür tausend Dollar pro Tag bei minimaler Kapitalrendite überschreiten würden. Andrey, der auch Investor des Projekts ist, mietete Serverräume in Nischni Nowgorod.

Das Publikum des Projekts beträgt täglich etwa tausend Menschen, aber an manchen Tagen erreichte es 40.000 Menschen aufgrund von Übergängen von ausländischen Medien, die das Projekt bereits vor einheimischen bemerkt hatten (Ostagram gelang es sogar, mit europäischen DJs zusammenzuarbeiten). Nachts, wenn wenig Verkehr ist, kann die Bildverarbeitung 5 Minuten und tagsüber bis zu einer Stunde dauern.

Wurden früher ausländische Nutzer bewusst nur eingeschränkt auf die Bildbearbeitung beschränkt (man dachte, die Monetarisierung von Russland aus starten zu wollen), setzt Ostagram jetzt schon stärker auf ein westliches Publikum.

Bisher sind die Aussichten auf Amortisation bedingt. Wenn jeder Benutzer 10 Rubel für die Verarbeitung bezahlt, würde sich das vielleicht auszahlen. […]

Es ist sehr schwierig, in unserem Land Geld zu verdienen: Unsere Leute sind bereit, eine Woche zu warten, aber sie zahlen keinen Cent dafür. Die Europäer stehen dem eher positiv gegenüber - in Bezug auf die Bezahlung für Beschleunigung und Qualitätsverbesserung -, also geht die Orientierung auf diesen Markt.

Andrey, Vertreter von Ostagram

Laut Andrey arbeitet das Ostagram-Team daran neue Version eine Website mit starkem Fokus auf Sozialität: „Es wird wie ein bekannter Dienst aussehen, aber was tun.“ Vertreter von Facebook in Russland haben sich bereits für das Projekt interessiert, aber der Deal ist noch nicht zu Verhandlungen über den Verkauf gekommen.

Beispiele für Servicearbeiten

Im Feed auf der Ostagram-Website können Sie auch sehen, welche Bildkombinationen zu den endgültigen Aufnahmen geführt haben: Das ist oft noch interessanter als das Ergebnis selbst. Gleichzeitig können Filter – Bilder, die als Effekt zur Bearbeitung verwendet werden – zur weiteren Verwendung gespeichert werden.

Grüße, Habr! Sicherlich ist Ihnen aufgefallen, dass das Thema Styling für Fotos vielfältig ist künstlerische Stilrichtungen aktiv in diesen Ihren Internets diskutiert. Wenn Sie all diese populären Artikel lesen, denken Sie vielleicht, dass unter der Haube dieser Anwendungen Magie vor sich geht und das neuronale Netzwerk wirklich fantasiert und das Bild von Grund auf neu zeichnet. Zufällig stand unser Team vor einer ähnlichen Aufgabe: Im Rahmen eines firmeninternen Hackathons haben wir ein Video-Styling gemacht, weil. Es gab bereits eine App für Fotos. In diesem Beitrag werfen wir einen Blick darauf, wie das Netzwerk Bilder „neu zeichnet“, und sehen uns die Artikel an, die dies ermöglicht haben. Ich empfehle Ihnen, sich mit dem letzten Beitrag vertraut zu machen, bevor Sie dieses Material lesen, und allgemein mit den Grundlagen von Convolutional Neural Networks. Sie werden einige Formeln, etwas Code (ich werde Beispiele für Theano und Lasagne geben) sowie viele Bilder finden. Dieser Beitrag ist eingebaut chronologische Reihenfolge Aussehen von Artikeln und dementsprechend die Ideen selbst. Manchmal werde ich es mit unseren jüngsten Erfahrungen verwässern. Hier ist ein Junge aus der Hölle für Aufmerksamkeit.


Visualisierung und Verständnis von Convolutional Networks (28.11.2013)

Erwähnenswert ist zunächst der Artikel, in dem die Autoren zeigen konnten, dass ein neuronales Netz keine Blackbox ist, sondern ein durchaus interpretierbares Ding (übrigens kann man das heute nicht mehr nur von Convolutional Networks für Computer sagen Vision). Die Autoren entschieden sich zu lernen, wie man die Aktivierungen von Neuronen der verborgenen Schicht interpretiert, und verwendeten dafür das deconvolutional neuronale Netzwerk (deconvnet), das einige Jahre zuvor vorgeschlagen wurde (übrigens von denselben Zeiler und Fergus, die die Autoren dieser Veröffentlichung sind wie Also). Ein Dekonvolutionsnetzwerk ist eigentlich dasselbe Netzwerk, bei dem Faltungen und Poolings in umgekehrter Reihenfolge angewendet werden. Die ursprüngliche Arbeit an deconvnet verwendete das Netzwerk in einem unüberwachten Lernmodus, um Bilder zu erzeugen. Diesmal verwendeten die Autoren es einfach für einen Rückwärtsdurchlauf von den Merkmalen, die nach einem Vorwärtsdurchlauf durch das Netzwerk zum Originalbild erhalten wurden. Das Ergebnis ist ein Bild, das als Signal interpretiert werden kann, das diese Aktivierung auf Neuronen verursacht hat. Natürlich stellt sich die Frage: Wie macht man einen umgekehrten Durchgang durch Faltung und Nichtlinearität? Und noch mehr durch Max-Pooling, dies ist sicherlich keine invertierte Operation. Schauen wir uns alle drei Komponenten an.

Umgekehrtes ReLu

In Faltungsnetzen wird häufig die Aktivierungsfunktion verwendet ReLu(x) = max(0, x), wodurch alle Aktivierungen auf der Ebene nicht negativ werden. Dementsprechend ist es auch beim Durchlaufen der Nichtlinearität erforderlich, nicht negative Ergebnisse zu erhalten. Dafür schlagen die Autoren vor, dasselbe ReLu zu verwenden. Aus Sicht der Theano-Architektur ist es notwendig, die Gradientenfunktion der Operation zu überschreiben (das unendlich wertvolle Notizbuch befindet sich in den Lasagne-Rezepten, von dort erfahren Sie die Details der ModifiedBackprop-Klasse).

Class ZeilerBackprop(ModifiedBackprop): def grad(self, input, out_grads): (inp,) = input (grd,) = out_grads #return (grd * (grd > 0).astype(inp.dtype),) # Explizit korrigieren return (self.nonlinearity(grd),) # Benutze die gegebene Nichtlinearität

Umgekehrte Faltung

Hier ist es etwas komplizierter, aber alles ist logisch: Es reicht aus, die transponierte Version des gleichen Faltungskerns anzuwenden, aber auf die Ausgänge des umgekehrten ReLu anstelle der vorherigen Schicht, die im Vorwärtsdurchgang verwendet wird. Aber ich fürchte, dass es in Worten nicht so offensichtlich ist, schauen wir uns die Visualisierung dieses Verfahrens an (Sie werden noch mehr Visualisierungen von Faltungen finden).


Faltung bei Schrittweite = 1

Faltung bei Schrittweite = 1 umgekehrte Version

Faltung bei Schritt = 2

Faltung bei Schritt = 2 umgekehrte Version

Reverse-Pooling

Diese Operation ist (im Gegensatz zu den vorherigen) im Allgemeinen nicht umkehrbar. Aber wir möchten das Maximum trotzdem irgendwie beim Rücklauf durchfahren. Dazu schlagen die Autoren vor, eine Karte zu verwenden, wo das Maximum während des direkten Passes war (max location switchs). Beim Reverse Pass wird das Eingangssignal so in Unpooling transformiert, dass die Struktur des Originalsignals annähernd erhalten bleibt, das ist hier wirklich leichter zu sehen als zu beschreiben.



Ergebnis

Der Visualisierungsalgorithmus ist extrem einfach:

  1. Machen Sie einen geraden Pass.
  2. Wählen Sie die Ebene aus, die uns interessiert.
  3. Korrigieren Sie die Aktivierung eines oder mehrerer Neuronen und setzen Sie den Rest zurück.
  4. Machen Sie eine Schlussfolgerung.

Jedes graue Quadrat im Bild unten entspricht einer Visualisierung eines Filters (der für die Faltung angewendet wird) oder Gewichtungen eines einzelnen Neurons und jedes Farbbild ist der Teil des ursprünglichen Bildes, der das entsprechende Neuron aktiviert. Der Übersichtlichkeit halber sind Neuronen innerhalb einer Schicht gruppiert thematische Gruppen. Überhaupt stellte sich plötzlich heraus, dass das neuronale Netz genau das lernt, was Hubel und Weisel in ihrer Arbeit über die Struktur des visuellen Systems geschrieben haben, für die sie ausgezeichnet wurden Nobelpreis 1981. Dank dieses Artikels haben wir eine visuelle Darstellung dessen, was ein Convolutional Neural Network auf jeder Ebene lernt. Es ist dieses Wissen, das es später ermöglicht, den Inhalt des erzeugten Bildes zu manipulieren, aber das ist noch weit entfernt, die nächsten Jahre sind darauf ausgerichtet, die Methoden der "Trepanation" neuronaler Netze zu verbessern. Darüber hinaus schlugen die Autoren des Artikels einen Weg vor, um zu analysieren, wie man am besten die Architektur eines Convolutional Neural Networks erreichen kann Beste Ergebnisse(Allerdings haben sie ImageNet 2013 nicht gewonnen, sind aber an die Spitze gekommen; UPD: Es stellt sich heraus, dass sie gewonnen haben, Clarifai ist, was sie sind).


Feature-Visualisierung


Hier ist ein Beispiel für die Visualisierung von Aktivierungen mit deconvnet, heute sieht dieses Ergebnis schon so lala aus, aber damals war es ein Durchbruch.


Salienzkarten mit deconvnet

Deep Inside Convolutional Networks: Visualisierung von Bildklassifizierungsmodellen und Salienzkarten (19. April 2014)

Dieser Artikel widmet sich der Untersuchung von Wissensvisualisierungsmethoden, die in einem Convolutional Neural Network enthalten sind. Die Autoren schlagen zwei Visualisierungsmethoden vor, die auf Gradientenabstieg basieren.

Klassenmodell-Visualisierung

Stellen Sie sich also vor, wir hätten ein trainiertes neuronales Netzwerk, um ein Klassifizierungsproblem in eine bestimmte Anzahl von Klassen zu lösen. Bezeichne als den Aktivierungswert des Ausgabeneurons, das der Klasse entspricht C. Dann liefert uns das folgende Optimierungsproblem genau das Bild, das die ausgewählte Klasse maximiert:



Diese Aufgabe ist mit Theano einfach zu lösen. Normalerweise bitten wir das Framework, die Ableitung der Modellparameter zu nehmen, aber diesmal gehen wir davon aus, dass die Parameter fest sind und die Ableitung aus dem Eingabebild genommen wird. Die folgende Funktion wählt den Maximalwert der Ausgabeschicht aus und gibt eine Funktion zurück, die die Ableitung in Bezug auf das Eingabebild berechnet.


def compile_saliency_function(net): """ Kompiliert eine Funktion zur Berechnung der Ausprägungskarten und vorhergesagten Klassen für einen gegebenen Minibatch von Eingabebildern. """ inp = net["input"].input_var outp = lasagne.layers.get_output(net ["fc8"], deterministic=True) max_outp = T.max(outp, axis=1) saliency = theano.grad(max_outp.sum(), wrt=inp) max_class = T.argmax(outp, axis=1) return theano.function(, )

Sie haben wahrscheinlich seltsame Bilder von Hunden im Internet gesehen - DeepDream. Im Originalartikel verwenden die Autoren nächsten Prozess So generieren Sie Bilder, die die ausgewählte Klasse maximieren:

  1. Anfangsbild mit Nullen initialisieren.
  2. Berechnen Sie den Wert der Ableitung aus diesem Bild.
  3. Ändern Sie das Bild, indem Sie das resultierende Bild aus der Ableitung hinzufügen.
  4. Kehren Sie zu Schritt 2 zurück oder beenden Sie die Schleife.

Die resultierenden Bilder sind:




Was aber, wenn Sie das erste Bild mit einem echten Foto initialisieren und denselben Vorgang starten? Aber bei jeder Iteration werden wir eine zufällige Klasse auswählen, den Rest auf Null setzen und den Wert der Ableitung berechnen, dann bekommen wir so einen tiefen Traum.


Achtung 60mb


Warum gibt es so viele Hundegesichter und -augen? Ganz einfach: Es gibt fast 200 Hunde im Bildernetz aus 1000 Klassen, die haben Augen. Und auch viele Kurse, in denen es nur Menschen gibt.

Extraktion der Klassenausprägung

Wenn dieser Prozess mit einem echten Foto initialisiert, nach der ersten Iteration gestoppt und der Wert der Ableitung gezogen wird, erhalten wir ein solches Bild, indem wir es zum Original hinzufügen, erhöhen wir den Aktivierungswert der ausgewählten Klasse.


Salienzkarten mit Ableitung


Auch hier ist das Ergebnis "so lala". Es ist wichtig, dies zu beachten neuer Weg Visualisierung von Aktivierungen (nichts hindert uns daran, die Aktivierungswerte nicht auf der letzten Ebene, sondern im Allgemeinen auf jeder Ebene des Netzwerks festzulegen und die Ableitung in Bezug auf das Eingabebild zu nehmen). Der nächste Artikel kombiniert die beiden vorherigen Ansätze und gibt uns ein Werkzeug zum Einrichten der Stilübertragung, das später beschrieben wird.

Streben nach Einfachheit: Das All Convolutional Net (13. Apr. 2015)

In diesem Artikel geht es generell nicht um Visualisierung, sondern darum, dass das Ersetzen von Pooling durch eine Faltung mit großem Schritt nicht zu Qualitätseinbußen führt. Aber als Nebenprodukt ihrer Forschung schlugen die Autoren eine neue Methode zur Visualisierung von Merkmalen vor, die sie anwendeten, um genauer zu analysieren, was das Modell lernt. Ihre Idee ist wie folgt: Wenn wir einfach die Ableitung nehmen, gehen die Merkmale, die auf dem Eingabebild kleiner als Null waren, während der Dekonvolution nicht zurück (unter Verwendung von ReLu für das Eingabebild). Und das führt dazu, dass negative Werte auf dem propagierten Rückbild erscheinen. Wenn Sie andererseits deconvnet verwenden, wird ein weiteres ReLu aus der Ableitung von ReLu genommen - dadurch können Sie negative Werte nicht zurückspringen, aber wie Sie gesehen haben, ist das Ergebnis "so lala". Was aber, wenn wir diese beiden Methoden kombinieren?




class GuidedBackprop(ModifiedBackprop): def grad(self, input, out_grads): (inp,) = input (grd,) = out_grads dtype = inp.dtype return (grd * (inp > 0).astype(dtype) * (grd > 0).astype(dtype),)

Dann erhalten Sie ein völlig sauberes und interpretierbares Bild.


Salienzkarten mit Guided Backpropagation

Geh tiefer

Nun lasst uns überlegen, was bringt uns das? Ich möchte Sie daran erinnern, dass jede Faltungsschicht eine Funktion ist, die einen dreidimensionalen Tensor als Eingabe erhält und auch einen dreidimensionalen Tensor als Ausgabe erzeugt, möglicherweise mit einer anderen Dimension D X w X H; D epth ist die Anzahl der Neuronen in der Schicht, jeder von ihnen generiert eine Feature-Map mit der Größe w Acht x H acht.


Versuchen wir das folgende Experiment im VGG-19-Netzwerk:



conv1_2

Ja, man sieht fast nichts, weil. Die rezeptive Fläche ist sehr klein, dies ist die zweite Faltung 3x3, die Gesamtfläche beträgt 5x5. Aber wenn wir hineinzoomen, sehen wir, dass das Feature nur ein Gradientendetektor ist.




conv3_3


conv4_3


conv5_3


Pool5


Und jetzt stellen Sie sich vor, dass wir anstelle des Maximums über der Platte die Ableitung des Werts der Summe aller Elemente der Platte über das Eingabebild nehmen. Dann wird offensichtlich der rezeptive Bereich der Gruppe von Neuronen das gesamte Eingangsbild abdecken. Für die frühen Schichten werden wir helle Karten sehen, aus denen wir ableiten, dass dies Farbdetektoren sind, dann Farbverläufe, dann Grenzen und so weiter zu komplexeren Mustern. Je tiefer die Schicht, desto dunkler wird das Bild. Dies wird durch die Tatsache erklärt, dass tiefere Schichten ein komplexeres Muster aufweisen, das sie erkennen, und ein komplexes Muster seltener auftritt als ein einfaches, und daher die Aktivierungskarte abgedunkelt ist. Der erste Weg ist geeignet, um Schichten mit komplexen Mustern zu verstehen, und der zweite ist genau richtig für einfache.


conv1_1


conv2_2


conv4_3


Sie können eine vollständigere Datenbank mit Aktivierungen für mehrere Bilder und .

Ein neuronaler Algorithmus des künstlerischen Stils (2. September 2015)

Seit der ersten erfolgreichen Trepanation des neuronalen Netzes sind also einige Jahre vergangen. Wir (im Sinne der Menschheit) haben ein mächtiges Werkzeug in unseren Händen, das es uns ermöglicht, zu verstehen, was das neuronale Netzwerk lernt, sowie zu entfernen, was wir nicht wirklich lernen möchten. Die Autoren dieses Artikels entwickeln eine Methode, mit der Sie ein Bild dazu bringen können, eine ähnliche Aktivierungskarte wie ein bestimmtes Zielbild zu generieren, möglicherweise sogar mehr als eins - dies ist die Grundlage des Stylings. Wir füttern die Eingabe mit weißem Rauschen und bringen dieses Bild in einem ähnlichen iterativen Prozess wie im tiefen Traum zu einem Bild, in dem die Merkmalskarten dem Zielbild ähnlich sind.

Inhaltsverlust

Wie bereits erwähnt, erzeugt jede Schicht des neuronalen Netzwerks einen dreidimensionalen Tensor einer bestimmten Dimension.




Lassen Sie uns die Ausgabe bezeichnen ich te Schicht aus der Eingabe als . Wenn wir dann die gewichtete Summe der Residuen zwischen dem Eingabebild minimieren und ein Bild, das wir anstreben C, dann bekommen Sie genau das, was Sie brauchen. Vielleicht.



Zum Experimentieren mit diesem Artikel können Sie diesen magischen Laptop verwenden, auf dem die Berechnungen stattfinden (sowohl auf der GPU als auch auf der CPU). Die GPU wird verwendet, um die Merkmale des neuronalen Netzwerks und den Wert der Kostenfunktion zu berechnen. Theano erzeugt eine Funktion, die den Gradienten der Zielfunktion berechnen kann eval_grad nach Eingangsbild X. Dies wird dann in lbfgs eingespeist und der iterative Prozess beginnt.


# Mit einem Rauschbild initialisieren generate_image.set_value(floatX(np.random.uniform(-128, 128, (1, 3, IMAGE_W, IMAGE_W)))) x0 = generate_image.get_value().astype("float64") xs = xs.append(x0) # Optimieren, Ergebnis periodisch für i in range(8) speichern: print(i) scipy.optimize.fmin_l_bfgs_b(eval_loss, x0.flatten(), fprime=eval_grad, maxfun=40) x0 = generiertes_Bild.get_value().astype("float64") xs.append(x0)

Wenn wir die Optimierung einer solchen Funktion ausführen, erhalten wir schnell ein Bild, das dem Ziel ähnlich ist. Jetzt können wir Bilder aus weißem Rauschen neu erstellen, die wie ein Inhaltsbild aussehen.


Inhaltsverlust: conv4_2



Optimierungsprozess




Es ist leicht, zwei Merkmale des resultierenden Bildes zu erkennen:

  • verlorene Farben - das liegt daran, dass in konkretes Beispiel nur die Schicht conv4_2 wurde verwendet (oder mit anderen Worten, das Gewicht w war für sie ungleich Null und für die anderen Schichten Null); Wie Sie sich erinnern, enthalten die ersten Ebenen Informationen zu Farben und Verlaufsübergängen, und die späteren enthalten Informationen zu größeren Details, was wir beobachten - die Farben gehen verloren, aber der Inhalt nicht.
  • manche Häuser "auf geht's", d.h. Gerade Linien sind leicht gekrümmt - je tiefer die Schicht, desto weniger Informationen über die räumliche Position des darin enthaltenen Merkmals (das Ergebnis der Anwendung von Faltungen und Bündelungen).

Das Hinzufügen früher Ebenen korrigiert die Situation sofort mit Farben.


Inhaltsverlust: conv1_1, conv2_1, conv4_2


Hoffentlich haben Sie jetzt das Gefühl, dass Sie die Kontrolle darüber haben, was auf das Bild mit weißem Rauschen neu gezeichnet wird.

Stilverlust

Und jetzt kommen wir zum interessantesten: Wie können wir den Stil vermitteln? Was ist Stil? Offensichtlich ist der Stil nicht das, was wir in Content Loss optimiert haben, da er viele Informationen über die räumlichen Positionen der Features enthält.Also müssen Sie diese Informationen zuerst irgendwie aus den Ansichten entfernen, die auf jeder Ebene empfangen werden.


Der Autor schlägt die folgende Methode vor. Nehmen wir den Tensor am Ausgang einer Schicht, entwickeln ihn in räumlichen Koordinaten und berechnen die Kovarianzmatrix zwischen den Platten. Lassen Sie uns diese Transformation als bezeichnen G. Was haben wir wirklich getan? Man kann sagen, dass wir gezählt haben, wie oft die Merkmale innerhalb der Platte paarweise auftreten, oder mit anderen Worten, wir haben die Verteilung der Merkmale in den Platten mit einer multivariaten Normalverteilung angenähert.




Dann wird Style Loss wie folgt eingetragen, wo S ist ein Bild mit Stil:



Sollen wir es für Vincent versuchen? Im Prinzip bekommen wir etwas erwartet - Rauschen im Stil von Van Gogh, Informationen über die räumliche Anordnung von Merkmalen gehen vollständig verloren.


Vinzenz




Was wäre, wenn wir ein Foto anstelle eines Stilbilds einfügen würden? Man bekommt bereits vertraute Züge, vertraute Farben, aber die räumliche Position geht komplett verloren.


Foto mit Stilverlust


Sicher haben Sie sich gefragt, warum wir die Kovarianzmatrix berechnen und nicht etwas anderes? Schließlich gibt es viele Möglichkeiten, Features so zu aggregieren, dass räumliche Koordinaten verloren gehen. Dies ist wirklich eine offene Frage, und wenn Sie etwas sehr Einfaches nehmen, wird sich das Ergebnis nicht dramatisch ändern. Lassen Sie uns das überprüfen, wir berechnen nicht die Kovarianzmatrix, sondern einfach den Durchschnittswert jeder Platte.




einfacher Stilverlust

Kombinierter Verlust

Natürlich besteht der Wunsch, diese beiden Kostenfunktionen zu mischen. Dann werden wir ein solches Bild aus weißem Rauschen erzeugen, dass es Merkmale aus dem Inhaltsbild behält (die eine Bindung an räumliche Koordinaten haben), und es wird auch "Stil"-Merkmale geben, die nicht an räumliche Koordinaten gebunden sind, d.h. Wir werden hoffentlich die Inhaltsbilddetails intakt lassen, aber mit dem richtigen Stil neu gezeichnet.



Tatsächlich gibt es auch einen Regularizer, aber wir werden ihn der Einfachheit halber weglassen. Es bleibt die folgende Frage zu beantworten: Welche Schichten (Gewichte) sollen bei der Optimierung verwendet werden? Und ich fürchte, ich habe keine Antwort auf diese Frage, und die Autoren des Artikels auch nicht. Sie haben einen Vorschlag, das Folgende zu verwenden, aber das bedeutet keineswegs, dass eine andere Kombination schlechter funktioniert, der Suchraum ist zu groß. Die einzige Regel, die aus dem Verständnis des Modells folgt, ist, dass es keinen Sinn macht, benachbarte Schichten zu nehmen, weil Ihre Vorzeichen unterscheiden sich nicht stark voneinander, daher wird dem Stil eine Ebene aus jeder conv*_1-Gruppe hinzugefügt.


# Verluste der Verlustfunktion definieren = # Inhaltsverlust losss.append(0.001 * content_loss(photo_features, gen_features, "conv4_2")) # style loss losss.append(0.2e6 * style_loss(art_features, gen_features, "conv1_1")) loss.append (0.2e6 * style_loss(art_features, gen_features, "conv2_1")) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv3_1")) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv4_1") ) loss.append(0.2e6 * style_loss(art_features, gen_features, "conv5_1")) # Gesamtvariationsstrafe loss.append(0.1e-7 * total_variation_loss(generated_image)) total_loss = sum(losses)

Das endgültige Modell kann in der folgenden Form dargestellt werden.




Und hier ist das Ergebnis der Häuser mit Van Gogh.



Versuchen Sie, den Prozess zu kontrollieren

Erinnern wir uns an die vorherigen Teile, bereits zwei Jahre vor dem aktuellen Artikel haben andere Wissenschaftler untersucht, was das neuronale Netzwerk wirklich lernt. Ausgestattet mit all diesen Artikeln können Sie Feature-Visualisierungen verschiedener Stile erstellen, verschiedene Bilder, verschiedene Auflösungen und Größen, und versuchen Sie zu verstehen, welche Schichten mit welchem ​​Gewicht zu nehmen sind. Aber selbst eine Neugewichtung der Ebenen gibt keine vollständige Kontrolle über das, was passiert. Das Problem hier ist eher konzeptioneller Natur: wir optimieren die falsche Funktion! Wieso, fragst du? Die Antwort ist einfach: Diese Funktion minimiert die Residuen ... nun, Sie verstehen schon. Aber was wir wirklich wollen, ist, dass uns das Bild gefällt. Die konvexe Kombination von Inhalts- und Stilverlustfunktionen ist kein Maß dafür, was unser Verstand für schön hält. Es wurde beobachtet, dass, wenn das Styling zu lange fortgesetzt wird, die Kostenfunktion natürlich immer tiefer sinkt, aber die ästhetische Schönheit des Ergebnisses stark abnimmt.




Okay, es gibt noch ein weiteres Problem. Angenommen, wir haben einen Layer gefunden, der die benötigten Features extrahiert. Nehmen wir an, einige Texturen sind dreieckig. Aber diese Ebene enthält noch viele andere Merkmale, wie z. B. Kreise, die wir im resultierenden Bild wirklich nicht sehen möchten. Im Allgemeinen könnten wir, wenn wir eine Million Chinesen einstellen könnten, alle Merkmale eines Stilbildes visualisieren und durch erschöpfende Suche nur diejenigen markieren, die wir brauchen, und sie nur in die Kostenfunktion einbeziehen. Aber aus offensichtlichen Gründen ist es nicht so einfach. Aber was ist, wenn wir einfach alle Kreise entfernen, die nicht im Ergebnis des Stylesheets erscheinen sollen? Dann funktioniert die Aktivierung der entsprechenden Neuronen, die auf die Kreise reagieren, einfach nicht. Und natürlich erscheint dies dann nicht im resultierenden Bild. Genauso ist es mit Blumen. Präsentieren Sie ein helles Bild mit vielen Farben. Die Verteilung der Farben wird im gesamten Raum sehr verschmiert sein, die Verteilung des resultierenden Bildes wird dieselbe sein, aber während des Optimierungsprozesses werden die Spitzen, die auf dem Original waren, wahrscheinlich verloren gehen. Es stellte sich heraus, dass eine einfache Verringerung der Bittiefe Farbpalette löst dieses Problem. Die Verteilungsdichte der meisten Farben wird nahe null sein, und es wird in mehreren Bereichen große Spitzen geben. Durch die Manipulation des Originals in Photoshop manipulieren wir also die Merkmale, die aus dem Bild extrahiert werden. Es ist einfacher, seine Wünsche visuell auszudrücken, als zu versuchen, sie in der Sprache der Mathematik zu formulieren. Tschüss. Infolgedessen erzielten Designer und Manager, die mit Photoshop und Skripten zur Visualisierung von Funktionen ausgestattet waren, dreimal schneller ein Ergebnis als Mathematiker und Programmierer.


Ein Beispiel für die Manipulation der Farbe und Größe von Features


Und Sie können sofort ein einfaches Bild als Stil verwenden



Ergebnisse








Und hier ist ein Vidosik, aber nur mit der richtigen Textur

Texturnetzwerke: Feedforward-Synthese von Texturen und stilisierten Bildern (10.03.2016)

Es scheint, dass dies gestoppt werden könnte, wenn nicht eine Nuance. Der obige Styling-Algorithmus funktioniert sehr lange. Wenn wir eine Implementierung nehmen, bei der lbfgs auf der CPU ausgeführt wird, dauert der Vorgang etwa fünf Minuten. Wenn Sie es so umschreiben, dass die Optimierung an die GPU geht, dauert der Vorgang 10-15 Sekunden. Es ist nicht gut. Vielleicht haben die Autoren dieses und des nächsten Artikels darüber nachgedacht. Beide Veröffentlichungen erschienen unabhängig voneinander im Abstand von 17 Tagen, fast ein Jahr nach dem vorherigen Artikel. Die Autoren des aktuellen Artikels haben sich wie die Autoren des vorherigen mit der Texturgenerierung beschäftigt (wenn Sie nur den Stilverlust zurücksetzen, erhalten Sie ungefähr dies). Sie schlugen vor, nicht ein aus weißem Rauschen gewonnenes Bild zu optimieren, sondern ein neuronales Netzwerk, das ein stilisiertes Bild erzeugt.




Wenn der Styling-Prozess nun keine Optimierung beinhaltet, muss nur ein Vorwärtsdurchgang durchgeführt werden. Und die Optimierung ist nur einmal erforderlich, um das Generatornetzwerk zu trainieren. Dieser Artikel verwendet einen hierarchischen Generator, wobei jeder folgende z größer als die vorherige und wird bei der Texturgenerierung aus Rauschen und für das Styler-Training aus einer Bilddatenbank abgetastet. Es ist wichtig, etwas anderes als den Trainingsteil des Bildnetzes zu verwenden, weil Merkmale innerhalb des Loss-Netzwerks werden von dem gerade auf dem Trainingsteil trainierten Netzwerk berechnet.



Wahrnehmungsverluste für Echtzeit-Stilübertragung und Superauflösung (27. März 2016)

Wie der Name schon sagt, waren die Autoren, die mit der Idee eines Generierungsnetzes nur 17 Tage zu spät kamen, damit beschäftigt, die Auflösung von Bildern zu erhöhen. Sie scheinen vom Erfolg des Residual Learning auf dem neuesten Imagenet inspiriert worden zu sein.




Dementsprechend Restblock und Conv-Block.



Somit haben wir jetzt neben der Styling-Steuerung auch einen schnellen Generator in der Hand (Dank dieser beiden Artikel wird die Generierungszeit für ein Bild in zig ms gemessen).

Ende

Wir haben die Informationen aus den überprüften Artikeln und den Code der Autoren als Ausgangspunkt für die Erstellung einer weiteren Styling-Anwendung für die erste Video-Styling-Anwendung verwendet:



Generieren Sie so etwas.


Auf den gewöhnlichsten Fotografien erscheinen zahlreiche und nicht vollständig unterscheidbare Einheiten. Meistens aus irgendeinem Grund Hunde. Solche Bilder begannen im Juni 2015 das Internet zu füllen, als DeepDream von Google gestartet wurde – einer der ersten offenen Dienste, die auf neuronalen Netzen basieren und für die Bildverarbeitung entwickelt wurden.

Das läuft ungefähr so ​​ab: Der Algorithmus analysiert Fotos, findet darin Fragmente, die ihn an vertraute Gegenstände erinnern – und verzerrt das Bild entsprechend dieser Daten.

Zuerst wurde das Projekt als Open Source angelegt, und dann erschienen Online-Dienste, die nach denselben Prinzipien erstellt wurden, im Internet. Einer der bequemsten und beliebtesten ist Deep Dream Generator: Hier dauert es nur etwa 15 Sekunden, um ein kleines Foto zu verarbeiten (zuvor mussten Benutzer mehr als eine Stunde warten).

Wie lernen neuronale Netze, solche Bilder zu erstellen? Und warum heißen sie übrigens so?

Neuronale Netze imitieren in ihrem Design die echten neuronalen Netze eines lebenden Organismus, tun dies jedoch mit Hilfe mathematischer Algorithmen. Nachdem Sie eine Grundstruktur erstellt haben, können Sie diese mit Methoden des maschinellen Lernens trainieren. Wenn wir über Mustererkennung sprechen, müssen Tausende von Bildern durch das neuronale Netzwerk geleitet werden. Wenn die Aufgabe des neuronalen Netzes anders ist, dann werden die Trainingsübungen anders sein.

Algorithmen zum Schachspielen analysieren beispielsweise Schachpartien. Auf dem gleichen Weg führte der AlphaGo-Algorithmus von Googles DeepMind in das chinesische Go-Spiel ein – das als Durchbruch gefeiert wurde, weil Go viel komplexer und nichtlinearer ist als Schach.

    Sie können mit einem vereinfachten neuronalen Netzwerkmodell herumspielen und seine Prinzipien besser verstehen.

    YouTube hat auch eine Reihe von verständlichen handgezeichneten Rollen darüber, wie neuronale Netze funktionieren.

Ein weiterer beliebter Dienst ist Dreamscope, der nicht nur von Hunden träumen, sondern auch verschiedene Malstile imitieren kann. Auch hier ist die Bildbearbeitung sehr einfach und schnell (ca. 30 Sekunden).

Anscheinend ist der algorithmische Teil des Dienstes eine Modifikation des Neural-Style-Programms, das wir bereits besprochen haben.

In jüngerer Zeit ist ein Programm erschienen, das Schwarz-Weiß-Bilder realistisch malt. In früheren Versionen machten ähnliche Programme ihre Arbeit viel schlechter, und es galt als große Errungenschaft, wenn mindestens 20 % der Menschen den Unterschied zwischen einem echten Bild und einem computergefärbten nicht erkennen konnten.

Außerdem dauert die Einfärbung hier nur etwa 1 Minute.

Die gleiche Entwicklungsfirma startete auch einen Dienst, der Bilder erkennt verschiedene Typen Objekte.

Diese Dienste mögen wie reine Unterhaltung erscheinen, aber in Wirklichkeit ist alles viel interessanter. Neue Technologien dringen in die Praxis menschlicher Künstler ein und verändern unser Verständnis von Kunst. Vielleicht müssen sich Menschen bald mit Maschinen im Bereich der Kreativität messen.

Mustererkennungsalgorithmen zu lehren, ist eine Aufgabe, mit der KI-Entwickler schon lange zu kämpfen haben. Daher können Programme, die alte Fotografien kolorieren und Hunde in den Himmel zeichnen, als Teil eines größeren und faszinierenderen Prozesses betrachtet werden.


Spitze