[PYTHON] Ein Anfänger versuchte, eine Strichzeichnung mit einem Kettenmesser zu färben. Ich konnte es schaffen.

Deplaning ist tai2an, das hauptsächlich für die Arbeit bei P-FN zuständig ist, das als Ware bezeichnet wird und das Löten einen höheren Mehrwert hat. Bei der Amazon Picking Challenge, die landesweit auf NHK ausgestrahlt wurde, machte ich eine klebrige Hand und eine Folie voller Robocon-Feeling. Ich wollte jedoch tief lernen, also habe ich vor ein oder zwei Monaten angefangen, Chainer zu studieren. Ich wollte die Strichzeichnung ausmalen, weil es eine große Sache war, also habe ich verschiedene Dinge ausprobiert.

Das Färben von Strichzeichnungen ist ein überwachter Lernprozess. Sie benötigen daher einen (vorzugsweise großen) Datensatz mit Strichzeichnungen und farbigen Bildern. Dieses Mal wird OpenCV verwendet, um Strichzeichnungen ordnungsgemäß aus Farbbildern zu extrahieren.

Extraktionsbeispiel 6c55da4e7961024012e78b38db048f53ce8e3a31.jpg→ 6c55da4e7961024012e78b38db048f53ce8e3a31.jpg

Der Datensatz wird durch Sammeln von Farbbildern und Erstellen einer Strichzeichnung vervollständigt. (Ich benutze diesmal ungefähr 600.000)

In Bezug auf die Form des Netzwerks habe ich ein Netzwerk namens U-net verwendet, das verwendet wird, indem die Ausgabe der Schicht beim Falten am Anfang zusammengeführt und am Ende dekonvolviert wird. Es scheint geeignet zu sein, wenn man sich auf eine Strichzeichnung bezieht und diese einfärbt. (U-net wird auch in px2px verwendet) Vorerst habe ich versucht zu lernen, das Quadrat des Fehlers aus der richtigen Antwort zu minimieren. Ich verstehe, dass die Netzwerkdefinition selbst im Allgemeinen in Ordnung ist, wenn die Ausgabe einer Schicht und die Eingabe der nächsten Schicht übereinstimmen, aber es ist ein wenig schwierig zu verstehen, da es nicht viele Möglichkeiten gab, ein von mir selbst definiertes Dataset zu erstellen. Ich fragte mich.

Hier ist das Ergebnis des Studiums über Nacht und der Fütterung der Testdaten ↓

スクリーンショット 2016-12-25 15.36.09.png

Nun, ich kann das Gefühl des neuronalen Netzes spüren: "Ich kann die Hautfarbe irgendwie verstehen, aber ich weiß nichts anderes, ich kann die Farbe der Haare oder der Kleidung des abgebildeten Charakters nicht erraten." .. ..

Hier kommt das gegnerische Netz ins Spiel. Bekannt als Ad Auntie. Tante ist ein Typ, der den Unterschied zwischen einem realen Bild und einem farbigen Bild eines neuronalen Netzes lernt und eine Delle macht. Wenn Sie also nur hautfarbene sepiaähnliche Bilder ausgeben, lernen Sie auf einen Schlag und essen am Ende schlechte Dinge.

Wenn die Anzeigenfrau jedoch zu stark ist, wird die farbige Seite mit dem gebogenen Nabel unscharf. Seien Sie also vorsichtig.

2e3a61e3da383137ae334afe52c1efacd7249a86.jpg2e3a61e3da383137ae334afe52c1efacd7249a86.jpg2e3a61e3da383137ae334afe52c1efacd7249a86.jpg

Mit dieser Art von Gefühl sind die Farben sicherlich verbunden, aber es wird ein Kunstsystem, als ob es eine Strichzeichnung wäre. (Nun, das könnte der Weg der Kunst sein

Wenn Sie das Lernen drehen, während Sie auf das Gleichgewicht mit der Differenzkomponente zum Originalbild achten. .. ..

スクリーンショット 2016-12-25 17.08.51.jpg

Es wird bunt! Huh

Es ist noch besser! Ich habe auch ein Netzwerk gelernt, das die Strichzeichnung von 512 x 512 Pixel reduziert, in der ersten Stufe 128 x 128 Pixel malt und in der zweiten Stufe 512 x 512 Pixel färbt (die Form des Netzwerks ist in der zweiten Stufe fast gleich, aber die Eingabe ist 4-Kanal und neu hinzugefügt. Retrain. Dies ist keine Ad-Tante)

Das Ergebnis ist hier ↓

スクリーンショット 2016-12-25 15.11.38.jpg

(Ich habe diese Strichzeichnung aus der Veröffentlichung von @ lio8644 ausgeliehen.)

Es ist in Ordnung.

スクリーンショット 2016-12-25 15.56.10.jpg

Es ist nicht schlecht.

Solange ich die extrahierte Strichzeichnung für den Test verwende, sieht sie ziemlich gut aus, aber was ist mit der tatsächlichen Strichzeichnung?

Ich habe mir eine Strichzeichnung von einem Tag des Bildsystems von pixiv ausgeliehen und sie getestet. (Grundsätzlich sind alle CNNs. Selbst wenn sich das Seitenverhältnis ein wenig ändert, kann es gehandhabt werden.

Denden

スクリーンショット 2016-12-25 15.03.39.jpg

groß.

スクリーンショット 2016-12-25 14.58.21.jpg

Es wurde ein buntes Monster, aber es gibt solche.

スクリーンショット 2016-12-25 17.29.48.jpg

Sich sicher zusammengefasst fühlen

Übrigens gibt es doch so etwas wie den Wunsch, dass Sie diese Farbe malen, oder? Deshalb habe ich den Eingang der ersten Stufe auf 4ch geändert, damit ich zusätzliche Hinweise geben kann.

Tsumari

スクリーンショット 2016-12-25 17.49.07.jpg

Sie können Anforderungen wie braunes Haar, hellblauen Pullover und dunkelblauen Rock festlegen.

Wenn Sie einen groben Eindruck erwecken, dass es so aussehen soll, ist es ziemlich gut.

スクリーンショット 2016-12-25 14.57.25.jpg スクリーンショット 2016-12-25 15.03.03.jpg

(Wenn die Strichzeichnung gut ist, finde ich es schön, wenn ich sie male, aber w

Es ist auch möglich, viele Hinweise sehr detailliert zu geben. (Es ist ein wenig schwer zu verstehen, aber ich treffe viele Hinweise

スクリーンショット 2016-12-25 14.53.10.jpg

Fröhliche Weihnachten! !!

Damit werde ich auch von einem Handwerker zu einem Zeichenhandwerker befördert!

Daher denke ich, dass das automatische Färben von Strichzeichnungen und das Färben mit Hinweisen erheblich erfolgt sind.

Ich glaube nicht, dass ich das richtige Gemälde der Maler übertreffen kann, aber ich denke, es ist bequem, grob zu malen. Es wäre praktisch, wenn es schneller wäre, die Cartoons zu färben, als die Töne einzufügen. (Dieses neuronale Netz ist stark für die Hautfarbe ... Wissen Sie, was Sie sagen möchten?)

Nebenbei bemerkt gibt es noch einige Schwächen.

Da Sie beispielsweise Adversary Net und Hinweise gleichzeitig lernen, kann der Welleneffekt beim Geben von Hinweisen instabil werden.

スクリーンショット 2016-12-25 16.35.04.jpg

↑ Ich wollte, dass nur der Badeanzug in einer anderen Farbe lackiert wird, aber auch die Farben der anderen Teile haben sich erheblich geändert. Wenn Sie es nur als einfaches Malwerkzeug verwenden, ist es möglicherweise stabiler, nur mit Hinweisen zu trainieren.

Da die Farbe nach einmaligem Reduzieren gemalt wird, selbst wenn die Strichzeichnung zu dick / dünn ist, gibt es Fälle, in denen die Linie gequetscht oder übersprungen wird und nicht funktioniert, oder auch wenn Sie feines Malen mit Hinweisen anweisen In einigen Fällen wird dies nicht wiedergegeben.

Es wäre cool, wenn ein NN alle Details verarbeiten könnte, aber es scheint notwendig, Anpassungen für jede Anwendung vorzunehmen, wenn sie als Werkzeug verwendet wird.

Strichzeichnung Kreditnehmer http://www.pixiv.net/member_illust.php?mode=medium&illust_id=31274285 http://www.pixiv.net/member_illust.php?mode=manga&illust_id=43369404 http://www.pixiv.net/member_illust.php?mode=medium&illust_id=56689287 http://www.pixiv.net/member_illust.php?mode=medium&illust_id=40487409 http://www.pixiv.net/member_illust.php?mode=medium&illust_id=10552795 https://twitter.com/lio8644

Übrigens ist die Struktur dieses Netzwerks sowohl für die erste als auch für die zweite Stufe gleich, und es sieht so aus

unet.py


    class UNET(chainer.Chain):
        def __init__(self):
            super(UNET, self).__init__(
                c0 = L.Convolution2D(4, 32, 3, 1, 1),
                c1 = L.Convolution2D(32, 64, 4, 2, 1),
                c2 = L.Convolution2D(64, 64, 3, 1, 1),
                c3 = L.Convolution2D(64, 128, 4, 2, 1),
                c4 = L.Convolution2D(128, 128, 3, 1, 1),
                c5 = L.Convolution2D(128, 256, 4, 2, 1),
                c6 = L.Convolution2D(256, 256, 3, 1, 1),
                c7 = L.Convolution2D(256, 512, 4, 2, 1),
                c8 = L.Convolution2D(512, 512, 3, 1, 1),

                dc8 = L.Deconvolution2D(1024, 512, 4, 2, 1),
                dc7 = L.Convolution2D(512, 256, 3, 1, 1),
                dc6 = L.Deconvolution2D(512, 256, 4, 2, 1),
                dc5 = L.Convolution2D(256, 128, 3, 1, 1),
                dc4 = L.Deconvolution2D(256, 128, 4, 2, 1),
                dc3 = L.Convolution2D(128, 64, 3, 1, 1),
                dc2 = L.Deconvolution2D(128, 64, 4, 2, 1),
                dc1 = L.Convolution2D(64, 32, 3, 1, 1),
                dc0 = L.Convolution2D(64, 3, 3, 1, 1),

                bnc0 = L.BatchNormalization(32),
                bnc1 = L.BatchNormalization(64),
                bnc2 = L.BatchNormalization(64),
                bnc3 = L.BatchNormalization(128),
                bnc4 = L.BatchNormalization(128),
                bnc5 = L.BatchNormalization(256),
                bnc6 = L.BatchNormalization(256),
                bnc7 = L.BatchNormalization(512),
                bnc8 = L.BatchNormalization(512),

                bnd8 = L.BatchNormalization(512),
                bnd7 = L.BatchNormalization(256),
                bnd6 = L.BatchNormalization(256),
                bnd5 = L.BatchNormalization(128),
                bnd4 = L.BatchNormalization(128),
                bnd3 = L.BatchNormalization(64),
                bnd2 = L.BatchNormalization(64),
                bnd1 = L.BatchNormalization(32)
        )

    def calc(self,x, test = False):
        e0 = F.relu(self.bnc0(self.c0(x), test=test))
        e1 = F.relu(self.bnc1(self.c1(e0), test=test))
        e2 = F.relu(self.bnc2(self.c2(e1), test=test))
        e3 = F.relu(self.bnc3(self.c3(e2), test=test))
        e4 = F.relu(self.bnc4(self.c4(e3), test=test))
        e5 = F.relu(self.bnc5(self.c5(e4), test=test))
        e6 = F.relu(self.bnc6(self.c6(e5), test=test))
        e7 = F.relu(self.bnc7(self.c7(e6), test=test))
        e8 = F.relu(self.bnc8(self.c8(e7), test=test))

        d8 = F.relu(self.bnd8(self.dc8(F.concat([e7, e8])), test=test))
        d7 = F.relu(self.bnd7(self.dc7(d8), test=test))
        d6 = F.relu(self.bnd6(self.dc6(F.concat([e6, d7])), test=test))
        d5 = F.relu(self.bnd5(self.dc5(d6), test=test))
        d4 = F.relu(self.bnd4(self.dc4(F.concat([e4, d5])), test=test))
        d3 = F.relu(self.bnd3(self.dc3(d4), test=test))
        d2 = F.relu(self.bnd2(self.dc2(F.concat([e2, d3])), test=test))
        d1 = F.relu(self.bnd1(self.dc1(d2), test=test))
        d0 = self.dc0(F.concat([e0, d1]))

        return d0

Ad Tante

adv.py


class DIS(chainer.Chain):
    def __init__(self):
        super(DIS, self).__init__(
                c1 = L.Convolution2D(3, 32, 4, 2, 1),
                c2 = L.Convolution2D(32, 32, 3, 1, 1),
                c3 = L.Convolution2D(32, 64, 4, 2, 1),
                c4 = L.Convolution2D(64, 64, 3, 1, 1),
                c5 = L.Convolution2D(64, 128, 4, 2, 1),
                c6 = L.Convolution2D(128, 128, 3, 1, 1),
                c7 = L.Convolution2D(128, 256, 4, 2, 1),
                l8l = L.Linear(None, 2, wscale=0.02*math.sqrt(8*8*256)),

                bnc1 = L.BatchNormalization(32),
                bnc2 = L.BatchNormalization(32),
                bnc3 = L.BatchNormalization(64),
                bnc4 = L.BatchNormalization(64),
                bnc5 = L.BatchNormalization(128),
                bnc6 = L.BatchNormalization(128),
                bnc7 = L.BatchNormalization(256),
        )

    def calc(self,x, test = False):
        h = F.relu(self.bnc1(self.c1(x), test=test))
        h = F.relu(self.bnc2(self.c2(h), test=test))
        h = F.relu(self.bnc3(self.c3(h), test=test))
        h = F.relu(self.bnc4(self.c4(h), test=test))
        h = F.relu(self.bnc5(self.c5(h), test=test))
        h = F.relu(self.bnc6(self.c6(h), test=test))
        h = F.relu(self.bnc7(self.c7(h), test=test))
        return  self.l8l(h)

Recommended Posts

Ein Anfänger versuchte, eine Strichzeichnung mit einem Kettenmesser zu färben. Ich konnte es schaffen.
Ich habe versucht, die Strichzeichnung mit Deep Learning aus dem Bild zu extrahieren
Da es Doppelgenger gab, habe ich versucht, es mit künstlicher Intelligenz zu unterscheiden (lacht) (Teil 2)
Da es Doppelgenger gab, habe ich versucht, es mit künstlicher Intelligenz zu unterscheiden (lacht) (Teil 1)
Ein Memorandum beim automatischen Erwerb mit Selen
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
Als ich versuchte, eine VPC mit AWS CDK zu erstellen, konnte ich es aber nicht schaffen
Als ich versuchte, mit Python eine virtuelle Umgebung zu erstellen, funktionierte dies nicht
Ich konnte AWS-Batch mit Python, Moto verspotten, also werde ich es verlassen
Als ich in IPython versuchte, den Wert zu sehen, war es ein Generator, also kam ich auf ihn, als ich frustriert war.
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Python: Kann in Lambda wiederholt werden
Als ich versuchte, eine Socket-Kommunikation mit Raspberry Pi durchzuführen, war das Protokoll anders
Mit der Docker-Version der Nginx-Einheit war es ein wenig schwierig, eine Flasche zu machen
AtCoder Beginner Contest 177 Problem C Ich habe versucht herauszufinden, warum es falsch war
Python-Anfänger haben einen Chat-BOT erstellt, also habe ich versucht, zusammenzufassen, wie man es macht
Bildverarbeitung mit Python (ich habe versucht, es in 0 und 1 Mosaikkunst zu binarisieren)
Ich habe versucht, mit AI kreative Kunst zu machen! Ich habe eine Neuheit programmiert! (Artikel: Creative Adversarial Network)
Ich habe versucht, mit Quantx eine Linie mit gleitendem Durchschnitt des Volumens zu implementieren
[IOS] GIF-Animation mit Pythonista3. Ich war süchtig danach.
Ich konnte die Web-App-Authentifizierung mit Flask-Login implementieren
Ich habe versucht, automatisch einen Bericht mit der Markov-Kette zu erstellen
Ich habe versucht, die Zugverspätungsinformationen mit LINE Notify zu benachrichtigen
Ich habe versucht, das Problem der Kombinationsoptimierung mit Qiskit zu lösen
Ich habe versucht, mit Hy ・ Define a class zu beginnen
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
Ich habe versucht, eine zufällige FizzBuzz-Spalte mit Blasensortierung zu sortieren.
Python-Anfänger versuchte, bei einem IT-Unternehmen zu praktizieren
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Als ich versuchte, PIL und matplotlib in einer virtuellen Umgebung zu installieren, war ich süchtig danach.
Als ich den AtCoder Beginner Contest ausprobierte, war es ein schreckliches Ergebnis, also schaue ich zurück
Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich möchte den vollständigen Text mit elasticsearch + python durchsuchen
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht zusammenzufassen, was mit Qiita mit Word Cloud ausgegeben wurde
Ein Hinweis, dem ich beim Erstellen einer Tabelle mit SQL Alchemy verfallen war
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
Ich habe versucht, Bulls and Cows mit einem Shell-Programm zu erstellen
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Es fiel mir schwer, meine Hausaufgaben zu machen, deshalb verwendete ich Python für das Management Accounting.
Ich möchte ○○ mit Pandas machen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, Jojo mit LSTM ein seltsames Zitat zu machen
Ich habe versucht, mit Go einen exklusiven Kontrollmechanismus zu erstellen
Selbst wenn ich jpg in png konvertiert habe, habe ich es geschafft, weil die Transparenz nicht manipuliert wurde
Ich möchte es mit Python Lambda Django machen, aber ich werde aufhören
Ich habe versucht, mit einem Remote-Server über Socket-Kommunikation mit Python zu kommunizieren.
Ich habe versucht, eine Blockchain zu implementieren, die tatsächlich mit ungefähr 170 Zeilen funktioniert
Als ich versuchte, Python auszuführen, wurde ich zum Microsoft Store übersprungen
Ich habe versucht, ein Programm zu erstellen, das Hexadezimalzahlen mit Python in Dezimalzahlen konvertiert