Wie Sie vielleicht mit denen vertraut sind, die Deep Learning studieren, gibt es ein Papier mit dem Titel [Ein neuronaler Algorithmus des künstlerischen Stils], das den Stil von Bildern konvertiert. Die Erklärung auf Japanisch ist unten. Was ist Stilkonvertierung? Wir empfehlen Ihnen, zuerst hier einen Blick darauf zu werfen. Bevorzugter Forschungsalgorithmus zum Konvertieren von Stilen
Wenn Sie mit dieser Methode eine Stilkonvertierung durchführen, ähnelt die Farbe des konvertierten Bildes der des Stilbilds. In letzter Zeit wird jedoch die Stilkonvertierung durchgeführt, wobei die Farbe [Beibehalten der Farbe bei der Übertragung neuronaler künstlerischer Stile] beibehalten wird (http: / /arxiv.org/pdf/1606.05897v1.pdf) wurde eingereicht. Dies ist das gleiche Papier des Autors wie Ein neuronaler Algorithmus des künstlerischen Stils.
Bereiten Sie zwei Bilder vor, ein Inhaltsbild (z. B. ein Katzenbild) und ein Stilbild (z. B. ein von Goch gezeichnetes Gemälde). Von diesen beiden Bildern ist der Inhalt ein Inhaltsbild, und der Stil ähnelt einem Stilbild (in diesem Fall ein Katzenbild wie Gochs Zeichnung) wird als Stilkonvertierung bezeichnet.
Das Papier schlägt zwei Arten von Methoden vor.
Konvertiert das Stilbild so, dass der Mittelwert und die Kovarianz der RGB-Werte mit denen des Inhaltsbilds übereinstimmen. Definieren Sie zunächst das Symbol.
Symbol | Bedeutung | Abmessungen |
---|---|---|
Inhaltsbild | 3 x (Inhaltsbildのピクセル数)Jede Zeile ist R., G,B-Wert-Vektor | |
Stilbild | 3 x (Stilbildのピクセル数) | |
RGB-Durchschnittswert des Inhaltsbildes | 3-vector | |
RGB-Durchschnittswert des Stilbildes | 3-vector | |
RGB-Co-Distribution von Inhaltsbildern | 3 x 3 | |
RGB-Co-Distribution von Stilbildern | 3 x 3 |
Stilbildkonvertierung
\bf{x}_{S^{\prime}} \leftarrow \bf{A}\bf{x}_{S}+\bf{b}
Nachdenken über. Um das Farbhistogramm der Stilkonvertierung nach der Konvertierung näher an das Farbhistogramm des Inhaltsbilds heranzuführen
\bf{\mu}_{S^{\prime}} = \bf{\mu}_{C}
\bf{\Sigma}_{S^{\prime}} = \bf{\Sigma}_{C}
Gegeben $ \ bf {A} $ und $ \ bf {b} $, die erfüllen
\bf{b} = \bf{\mu}_{C}-\bf{A}\bf{\mu}_{S}
\bf{A}\bf{\Sigma_{S}}\bf{A^{T}} = \bf{\Sigma_{C}}
Treffen. Das Papier listet zwei $ \ bf {A} $ auf, die diese Formel erfüllen.
\bf{A}_{\rm chol} = \bf{L}_{C}\bf{L}_{S}^{-1}
$ \ Bf {L} $ erfüllt jedoch $ \ bf {\ Sigma} = \ bf {L} \ bf {L} ^ {T} $ durch die Choleskey-Zerlegung von $ \ bf {\ Sigma} $.
Angenommen, Sie zerlegen $ \ bf {\ Sigma} $ in eindeutige Werte, um $ \ bf {\ Sigma} = \ bf {U} \ bf {\ Lambda} \ bf {U} ^ {T} $ zu erhalten. Zu diesem Zeitpunkt ist $ \ bf {\ Sigma} ^ {1/2} = \ bf {U} \ bf {\ Lambda} ^ {1/2} \ bf {U} ^ {T} $, $ \ bf {\ Sigma } ^ {-1 / 2} = \ bf {U} \ bf {\ Lambda} ^ {-1 / 2} \ bf {U} ^ {T} $. Und
\bf{A}_{\rm IA} = \bf{\Sigma_{C}^{1/2}}\bf{\Sigma_{S}^{-1/2}}
Wird zur Konvertierung verwendet.
Verwenden Sie die erhaltenen $ \ bf {A} $ und $ \ bf {b} $, um das Stilbild zu konvertieren, und verwenden Sie dann das Inhaltsbild und das konvertierte Stilbild, um eine normale Stilkonvertierung durchzuführen. Das Papier besagt, dass die Eigenwertzerlegung bessere Ergebnisse lieferte als die Choleskey-Zerlegung.
Ich habe versucht, das Stilbild mit einem Algorithmus zu konvertieren, der eine Eigenwertzerlegung verwendet. Sie können sehen, dass das Farbschema dem Inhaltsbild ähnlich ist.
Inhaltsbild | Stilbild | Bild mit Farbhistogramm schließen |
---|---|---|
Konvertiert den Farbraum des Inhaltsbilds und des Stilbilds in YIQ und erhält nur das Inhaltsbild und das Stilbild mit Helligkeit. Zu diesem Zeitpunkt wird die folgende Umwandlung durchgeführt, um den Durchschnitt und die Streuung der Helligkeit gleichmäßig zu machen. $ L_ {C} $ ist die Helligkeit des Inhaltsbildes, $ L_ {S} $ ist die Helligkeit des Stilbildes, $ \ mu_ {C}, \ mu_ {S} $ ist der Durchschnittswert der Helligkeit des Inhaltsbilds bzw. des Stilbildes. $ \ Sigma_ {C}, \ sigma_ {S} $ sind Standardabweichungen.
L_{S^{\prime}} = \frac{\sigma_{C}}{\sigma_{S}}(L_{S}-\mu_{S})+\mu_{C}
Nachdem Sie mit diesen Bildern eine Stilkonvertierung durchgeführt haben, können Sie das konvertierte Bild erhalten, indem Sie es mit dem IQ-Kanal des Inhaltsbilds kombinieren. Informationen zum Konvertieren zwischen RGB und YIQ finden Sie in Wikipedia.
Color histogram matching
Die Python-Implementierung der Farbhistogrammanpassung mithilfe der Eigenwertzerlegung sieht folgendermaßen aus:
Sie können eine Eigenwertzerlegung mit numpy.linalg.eig
durchführen.
import numpy as np
import six
#x ist das Stilbild
#y ist ein Stilbild
# x,y ist ein numpy Array und Form ist(batch_size, 3, height, width)
def match_color_histogram(x, y):
z = np.zeros_like(x)
shape = x[0].shape
for i in six.moves.range(len(x)):
a = x[i].reshape((3, -1))
a_mean = np.mean(a, axis=1, keepdims=True)
a_var = np.cov(a)
d, v = np.linalg.eig(a_var)
a_sigma_inv = v.dot(np.diag(d ** (-0.5))).dot(v.T)
b = y[i].reshape((3, -1))
b_mean = np.mean(b, axis=1, keepdims=True)
b_var = np.cov(b)
d, v = np.linalg.eig(b_var)
b_sigma = v.dot(np.diag(d ** 0.5)).dot(v.T)
transform = b_sigma.dot(a_sigma_inv)
z[i,:] = (transform.dot(a - a_mean) + b_mean).reshape(shape)
return z
Die gegenseitige Umwandlung zwischen BGR und YIQ ist wie folgt. BGR wird anstelle von RGB verwendet, da das für die Bildkonvertierung verwendete VGG-Modell BGR als Eingabe verwendet.
#x ist ein numpy Array, das ein Bild darstellt und dessen Form ist(batch_size, 3, height, width)
def bgr_to_yiq(x):
transform = np.asarray([[0.114, 0.587, 0.299], [-0.322, -0.274, 0.596], [0.312, -0.523, 0.211]], dtype=np.float32)
n, c, h, w = x.shape
x = x.transpose((1, 0, 2, 3)).reshape((c, -1))
x = transform.dot(x)
return x.reshape((c, n, h, w)).transpose((1, 0, 2, 3))
def yiq_to_bgr(x):
transform = np.asarray([[1, -1.106, 1.703], [1, -0.272, -0.647], [1, 0.956, 0.621]], dtype=np.float32)
n, c, h, w = x.shape
x = x.transpose((1, 0, 2, 3)).reshape((c, -1))
x = transform.dot(x)
return x.reshape((c, n, h, w)).transpose((1, 0, 2, 3))
Ich habe diese Methode tatsächlich ausprobiert. Der Quellcode ist unten. https://github.com/dsanno/chainer-neural-style
Sie können dies wie folgt tun:
$ python src/run.py -g 0 -c content.jpg -s style.jpg -w 384 -o out_dir_01 --iter 2000 --lr 10 --match_color_histogram --initial_image content
$ python src/run.py -g 0 -c content.jpg -s style.jpg -w 384 -o out_dir_02 --iter 2000 --lr 10 --luminance_only --initial_image content
Das Ausführungsergebnis wird angezeigt. Die Farbhistogrammübereinstimmung scheint dem Inhaltsbild ähnlich zu sein, aber die Wand ist hautfarben und die richtige Farbe wird nicht an der richtigen Stelle gemalt. Aufgrund des Papiers war das Farbschema schöner, sodass möglicherweise etwas nicht stimmt. Nur für Luminanz wird ein Bild ausgegeben, das dem Stilbild ähnlich ist.
Inhaltsbild | Stilbild | Color histogram matching | Luminance-only transfer |
---|---|---|---|
Das gleiche wie oben | |||
Das gleiche wie oben | |||
Das gleiche wie oben |
Bei der Optimierung der Stilkonvertierung scheint es gut, das ursprüngliche Bild mit dem Inhaltsbild identisch zu machen. Wenn das ursprüngliche Bild zufällig ausgewählt wird, weichen Licht und Dunkelheit wie unten gezeigt vom Inhaltsbild ab. (Das Stilbild ist Gochs Sternennacht, die Methode ist nur Luminanz)
Konvertierung des Bildstils unter Beibehaltung der Farbe implementiert.
Diese Methode ist eine Kombination aus vorhandener Stilkonvertierung und Farbkonvertierung von Inhaltsbildern und Stilbildern und kann als einfache Methode bezeichnet werden. Auf diese Weise können Sie verschiedene Effekte erzielen, indem Sie die Methode ein wenig ändern. Daher hielt ich es für wichtig, nicht nur die neue Methode zu imitieren, sondern auch darüber nachzudenken, ob Sie sie selbst entwickeln könnten.