Veröffentlicht am 10-09-2019

Wir stellen vor: Mur.AI

Echtzeit-Übertragung des neuronalen Stils für Video

von Jeffrey Rainy und Archy de Berker

Mur.AI ist ein Setup für stilisierte Echtzeitvideos. Zur Verarbeitung werden ein Referenzbild, z. B. ein Gemälde, und ein Videostream benötigt. Der Videostream wird dann so verarbeitet, dass er den Stil des Referenzbilds aufweist. Die Stilisierung erfolgt in Echtzeit und erzeugt einen stilisierten Videostream.

In einem früheren Beitrag haben wir eine Technik zur Stabilisierung der Stilübertragung beschrieben, damit sie für Videos gut funktioniert. Anschließend haben wir diese Techniken eingesetzt, um ein System zu erstellen, das wir auf verschiedenen Konferenzen, darunter C2, Art Basel und NIPS, getestet haben. Sie können einige der resultierenden Selfies auf Twitter ansehen.

In diesem Beitrag präsentieren wir einige allgemeine Erklärungen zur Funktionsweise des Systems. Wir werden eine Einführung in den Stiltransfer und die Faltung geben und einige der technischen Herausforderungen beschreiben, die wir bewältigt haben, um unseren Algorithmus in der realen Welt einzusetzen.

Was ist Stiltransfer?

Die Stilübertragung ist die Anwendung des künstlerischen Stils eines Bildes auf ein anderes Bild:

Hier ist das Quellbild von zwei Entwicklern (Phil Mathieu und Jean Raby) und der Stil stammt von Notre Dame de Grace von A’Shop, einem Wandgemälde in Montreal.

Die Technik wurde erstmals in der Arbeit A Neural Algorithm of Artistic Style von Leon A. Gatys, Alexander S. Ecker und Matthias Bethge vorgestellt. Seitdem haben wir überall eine Stilübertragung und eine Reihe von Verbesserungen am ursprünglichen Algorithmus festgestellt. Insbesondere bauen wir bei unserer Implementierung auf der Arbeit Perceptual Losses for Real-Time Style Transfer und Super Resolution von Justin Johnson, Alexandre Alahi und Fei-Fei Li auf, die eine schnellere Lösung für die Stilübertragung bietet, die leichter anwendbar ist Video.

Wie funktioniert es?

Jedes Frame des Videos, das stilisiert wird, durchläuft ein Convolutional Neural Network (CNN) und wird dann auf dem Bildschirm angezeigt. Eine schöne Einführung in Faltungsnetzwerke finden Sie in Chris Olahs Post, und eine visuelle Anleitung zur Faltung finden Sie in Vincent Dumoulins GitHub-Repo.

Kurz gesagt, ein CNN führt mehrere Faltungsoperationen an einem Bild durch, um ein anderes zu erhalten. Jede Faltung ist eine Operation an den Pixeln in einem quadratischen Bereich Ihres Bildes. In einer CNN wird derselbe Vorgang über das gesamte Bild wiederholt, um jedes Pixel zu berechnen. Das folgende Diagramm zeigt die Verarbeitung einer einzelnen Faltung:

Zur Bereitstellungszeit verwenden wir eine einzelne CNN, die wir als Stilisierungs-CNN bezeichnen, um unser stilisiertes Bild zu erstellen. Wenn wir über das Lernen eines Stils sprechen, geht es darum, die Parameter des Stilisierungsnetzwerks zu finden, damit der richtige Stil entsteht.

Um diese Parameter zu finden, verwenden wir ein zweites Netzwerk: eine Klassifizierung CNN. Wir verwenden dies als Feature-Extraktor, um Darstellungen des Stils und des Inhalts unserer Eingabebilder bereitzustellen.

Klassifikationsnetzwerk

Eine Klassifizierungs-CNN nimmt ein Bild auf und versucht zu identifizieren, was das Bild enthält. Wenn Sie beispielsweise einige Fotos von Katzen und Hunden hatten, können Sie eine CNN-Klassifizierung trainieren, um herauszufinden, welche welche sind. In dem von uns verwendeten Klassifikator CNN besteht die Aufgabe darin, kleine Bilder in eine von 1000 Kategorien zu klassifizieren, eine äußerst beliebte Aufgabe mit dem Namen ImageNet.

Das Klassifizierernetz führt mehrere Windungen an einem Bild durch, um Merkmale zu erzeugen, die für die Klassifizierung nützlich sind. Wenn ein Bild das Netzwerk durchläuft, wird es immer kleiner (Pixel), aber es wächst auch in Bezug auf die Komponenten pro Pixel. Ab dem RGB-Eingang (3 Komponenten) bei voller Auflösung wird das Bild iterativ auf ein einzelnes Pixel verkleinert, jedoch mit vielen Komponenten: Die Wahrscheinlichkeit, dass das Bild jede der vielen Kategorien darstellt.

Ein typisches Schema für ein Faltungsnetz zur Klassifizierung.

Obwohl das Netzwerk ursprünglich für die Klassifizierung trainiert wurde, wird es dafür nicht verwendet. Ein attraktives Merkmal von CNNs ist, dass sie auf natürliche Weise die Hierarchien rekapitulieren, die in natürlichen Bildern existieren. Früher im Netzwerk erfassen wir kleine Features wie Kanten. Später im Netzwerk erfassen wir größere Features wie ganze Objekte. Sie können dieses Phänomen in Ihrem Browser hier untersuchen.

Stellen Sie sich vor, Sie speisen dem Netzwerk ein Bild von sich im Schlafanzug zu. Nach den ersten Ebenen werden die Informationen, die das Netzwerk verarbeitet, auf lokale Merkmale abgebildet („dünne vertikale blaue Streifen“), während in den letzten Ebenen des Netzwerks Merkmale erfasst werden, die das Bild als Ganzes beschreiben („jemand Stehender“). Auf diese Weise erfassen frühe Ebenen den Stil eines Bildes, während die von späten Ebenen erlernten Funktionen den Inhalt erfassen.

Einige Beispiele für die Art von Features, die verschiedene Ebenen in einem CNN bevorzugen (wir bewegen uns tiefer im Netzwerk, wenn wir uns von links nach rechts bewegen). Von Olah et al.,

Dieses Projekt stützt sich für die Klassifizierung auf das vorab trainierte VGG16-Netzwerk der Universität Oxford. Dies liefert eine der beiden CNNs, die wir für die Stilübertragung benötigen.

Stylization Network

Unser Stilisierungsnetzwerk erledigt die eigentliche Produktion der stilisierten Bilder. Wir werden Parameter lernen, die es uns ermöglichen, das Klassifikator-Netzwerk als Trainingswerkzeug zu verwenden.

Zu diesem Zweck nehmen wir eine große Anzahl von Bildern für das Training auf und wiederholen die folgenden Schritte:

  1. Wir versorgen den Klassifikator CNN mit Stilbild, Quellbild und Stilisiertem Bild aus der aktuellen Stilisierung CNN
  2. Wir extrahieren Darstellungen von Stil und Inhalt aus dem Klassifikator-Netzwerk
  3. Wir passen die Stilisierungs-CNN so an, dass das stilisierte Bild einen Stil hat, der dem Stilbild ähnlicher ist, und Inhalte, die dem Quellbild ähneln

Im Pseudo-Python-Code:

Und bildlich:

Das Erfassen eines Stils besteht darin, die kleinen Merkmale des Stilbilds beizubehalten und die großen Merkmale des Quellbilds beizubehalten. Kurz gesagt, wir suchen nach der Stilisierung CNN, die die „blauen und braunen wirbelnden Farben“ des Stils beibehält, während „zwei Programmierer, eine Säule und eine Reihe von Schreibtischen“ der Quelle beibehalten werden.

Um dies zu erfassen, berechnen wir den Unterschied zwischen "Stil" und "Stilisiert" zu einem frühen Zeitpunkt im Netzwerk und "Quelle" und "Stilisiert" zu einem späteren Zeitpunkt im Netzwerk. Unsere Verlustfunktion - das, was wir durch Ändern der Parameter unseres Stilisierungsnetzwerks minimieren möchten - ist die Summe dieser beiden Begriffe. Tatsächlich haben wir, wie in unserem vorherigen Beitrag beschrieben, einen zusätzlichen Begriff für den Stabilitätsverlust eingefügt, der dazu beitrug, eine stabile Stilübertragung von Frame zu Frame zu erzielen. Den Code für unsere aktualisierte Implementierung finden Sie hier.

Insgesamt trainiert unsere Implementierung jetzt einen neuen Stil aus einem 512 x 512 Pixel großen Bild in ~ 6 Stunden mit 4 GPUs.

Bereitstellung unseres Systems

Unsere Demo wurde weltweit auf dem Bildschirm eingesetzt und sogar auf Gebäude in Montreal projiziert (als Teil des Up375-Projekts).

Bei der Bereitstellung der Demo für den Echtzeitbetrieb standen wir vor mehreren Herausforderungen. Die Hauptprobleme waren Durchsatz und Latenz: Wie können wir das Video aufnehmen, es durch unser Modell laufen lassen und es dann nahezu in Echtzeit erneut rendern?

Das fertige System läuft auf einem Zotac EN1070-Minicomputer mit einer NVIDIA GeForce 1070-GPU und ist leicht zu transportieren

H264-Dekodierung auf der GPU

Die von uns verwendete Kamera (Logitech C920) gibt vorkomprimiertes H264-Video aus. Der naive Ansatz wäre, dieses Video mit FFmpeg auf der GPU zu dekodieren, die RGB-Pixel wieder auf die CPU zu bringen und sie erneut als Eingabe für die CNN hochzuladen.

Es stellte sich jedoch heraus, dass die CPU-GPU-Übertragung zu einer erheblichen Latenz führt, da beim Kopieren Synchronisationspunkte zwischen CPU und GPU erzwungen werden. Die Lösung bestand darin, das H264-Video direkt mit der integrierten NVDEC-Engine (einem hardwarebasierten beschleunigten Decoder, der im Zotac EN1070 enthalten ist) zu decodieren. Dadurch konnten decodierte Frames direkt als Eingaben an unseren CNN übergeben werden, sodass GPU und CPU vollständig asynchron ausgeführt werden konnten.

OpenGL-Rendering von der GPU

Nachdem wir unser Video dekodiert und unser Netzwerk auf der GPU ausgeführt hatten, sahen wir uns einem ähnlichen Engpass gegenüber, als wir die resultierende Matrix zum herkömmlichen Rendern an die CPU zurückgaben. Die Lösung bestand wiederum in der GPU-Berechnung. Mit der CUDA / OpenGL-Interop-API können wir die Ausgaben so rendern, dass sie direkt von der GPU angezeigt werden, und weitere E / A-Engpässe vermeiden.

Twitter-Integration

Der Demo-Stand enthält Funktionen zum Veröffentlichen von stilisierten Bildern auf Twitter. Der Feed kann unter @ElementAIArt eingesehen werden.

Stile verwendet

Wir haben Stilisierungsnetzwerke für eine Vielzahl unserer Lieblingswandbilder in Montreal trainiert.

Für jeden Stil haben wir einen Abschnitt zugeschnitten, der die richtigen Eigenschaften hatte, die das Netzwerk lernen sollte. Im Folgenden finden Sie die gesamte Arbeit und die Abschnitte, die wir für das Training verwendet haben. Sie können einige dieser Beispiele in Aktion im Video zu Beginn dieses Beitrags sehen.

Notre Dame de Grâce von A’Shop. 6310 rue Sherbrooke Ouest. Sprühfarbe auf Ziegel, 2011.Ohne Titel, von Bicicleta Sem Freio. 3527 Boulevard St-Laurent. Sprühfarbe auf Ziegelstein, 2015Ohne Titel, von El Curiot. 265 rue Sherbrooke Ouest. Acryl auf Backstein, 2015Quai des Arts von EN MASSE. 4890 Boulevard St-Laurent. Sprühfarbe auf Ziegel, 2011Galaktischer Riese, Chris Dyer. 3483 rue Coloniale. Sprühfarbe auf Ziegelstein, 2013Sans Titre von David ‘Meggs’ Hook. 3527 Boulevard St-Laurent. 2016Autumn Foliage Series # 1 von Matt W. Moore. 4660 Boulevard St-Laurent. 2014Mémoire du coeur von Julian Palma. 4505 rue Notre-Dame Ouest. Sprühfarbe auf Ziegelstein, 2016Ohne Titer, von SBuONe. 4243 Boulevard St-Laurent. 2016Ohne Titer von Zilon. 53 rue Marie-Anne. Sprühfarbe auf verschiedene Medien

Danksagung

Diese Arbeit wurde von Jeffrey Rainy, Eric Robert, Jean Raby und Philippe Mathieu mit Unterstützung des Teams von Element AI durchgeführt. Vielen Dank an Xavier Snelgrove für die Kommentare zum Beitrag.

Es stützte sich auf die Open-Source-Codebasis von Faster Neural Style Transfer von Yusuketomoto, einer Implementierung von Perceptual Losses für Real-Time Style Transfer und Super Resolution von Justin Johnson, Alexandre Alahi und Li Fei-Fei.

Siehe auch

Wie können Sie Ihre Einstellung in diesem Jahr ändern?Ein KunstwörterbuchAnonymität in Kunst und LiteraturSehen gegen LesenSehen gegen LesenAmy Sheralds offizielles Porträt von Michelle Obama stellt sich vor, was es heißt, eine lebhafte Persönlichkeit zu sein ...