ホームページ > 記事 > テクノロジー周辺機器 > 敵対的生成ネットワーク、AI が写真をコミック風に変換
###こんにちは、みんな。
最近みんな AI ペイントで遊んでいます。GitHub でオープンソース プロジェクトを見つけたので共有します。 今日共有したプロジェクトは、GAN 敵対的生成ネットワークを使用して実装されています。GAN の原理と実践については、これまでに多くの記事を共有しました。さらに詳しく知りたい友人は、次の記事を読むことができますそれは歴史的な記事です。 ソース コードとデータ セットは記事の最後で入手できるので、プロジェクトのトレーニング方法と実行方法を共有しましょう。 1. 環境を準備しますtensorflow-gpu 1.15.0 をインストールし、GPU グラフィックス カードとして 2080Ti を使用し、cuda バージョン 10.0 を使用します。 git プロジェクトの AnimeGANv2 ソース コードをダウンロードします。 環境を設定したら、データセットと vgg19 を準備する必要があります。 dataset.zip 圧縮ファイルをダウンロードします。このファイルには、GAN トレーニング用の 6,000 枚の実際の画像と 2,000 枚のコミック画像が含まれています。 vgg19 は損失の計算に使用されます。これについては、後で詳しく説明します。 2. ネットワーク モデル敵対的生成ネットワークでは、ジェネレーターとディスクリミネーターの 2 つのモデルを定義する必要があります。 ジェネレーター ネットワークは次のように定義されます:with tf.variable_scope('A'): inputs = Conv2DNormLReLU(inputs, 32, 7) inputs = Conv2DNormLReLU(inputs, 64, strides=2) inputs = Conv2DNormLReLU(inputs, 64) with tf.variable_scope('B'): inputs = Conv2DNormLReLU(inputs, 128, strides=2) inputs = Conv2DNormLReLU(inputs, 128) with tf.variable_scope('C'): inputs = Conv2DNormLReLU(inputs, 128) inputs = self.InvertedRes_block(inputs, 2, 256, 1, 'r1') inputs = self.InvertedRes_block(inputs, 2, 256, 1, 'r2') inputs = self.InvertedRes_block(inputs, 2, 256, 1, 'r3') inputs = self.InvertedRes_block(inputs, 2, 256, 1, 'r4') inputs = Conv2DNormLReLU(inputs, 128) with tf.variable_scope('D'): inputs = Unsample(inputs, 128) inputs = Conv2DNormLReLU(inputs, 128) with tf.variable_scope('E'): inputs = Unsample(inputs,64) inputs = Conv2DNormLReLU(inputs, 64) inputs = Conv2DNormLReLU(inputs, 32, 7) with tf.variable_scope('out_layer'): out = Conv2D(inputs, filters =3, kernel_size=1, strides=1) self.fake = tf.tanh(out)ジェネレーターのメイン モジュールは逆残差ブロックです 残差構造( a) および逆残差ブロック (b) 識別器ネットワークの構造は次のとおりです:
def D_net(x_init,ch, n_dis,sn, scope, reuse): channel = ch // 2 with tf.variable_scope(scope, reuse=reuse): x = conv(x_init, channel, kernel=3, stride=1, pad=1, use_bias=False, sn=sn, scope='conv_0') x = lrelu(x, 0.2) for i in range(1, n_dis): x = conv(x, channel * 2, kernel=3, stride=2, pad=1, use_bias=False, sn=sn, scope='conv_s2_' + str(i)) x = lrelu(x, 0.2) x = conv(x, channel * 4, kernel=3, stride=1, pad=1, use_bias=False, sn=sn, scope='conv_s1_' + str(i)) x = layer_norm(x, scope='1_norm_' + str(i)) x = lrelu(x, 0.2) channel = channel * 2 x = conv(x, channel * 2, kernel=3, stride=1, pad=1, use_bias=False, sn=sn, scope='last_conv') x = layer_norm(x, scope='2_ins_norm') x = lrelu(x, 0.2) x = conv(x, channels=1, kernel=3, stride=1, pad=1, use_bias=False, sn=sn, scope='D_logit') return x3. 損失損失を計算する前に、VGG19 ネットワークを使用して次のことを行います。画像のベクトル化を変換します。このプロセスは、NLP の埋め込み操作に少し似ています。 Eembedding は単語をベクトルに変換すること、VGG19 は画像をベクトルに変換することです。 VGG19 の定義損失部分を計算するロジックは次のとおりです。
def con_sty_loss(vgg, real, anime, fake): # 真实敵対的生成ネットワーク、AI が写真をコミック風に変換向量化 vgg.build(real) real_feature_map = vgg.conv4_4_no_activation # 生成敵対的生成ネットワーク、AI が写真をコミック風に変換向量化 vgg.build(fake) fake_feature_map = vgg.conv4_4_no_activation # 漫画风格向量化 vgg.build(anime[:fake_feature_map.shape[0]]) anime_feature_map = vgg.conv4_4_no_activation # 真实敵対的生成ネットワーク、AI が写真をコミック風に変換与生成敵対的生成ネットワーク、AI が写真をコミック風に変換的损失 c_loss = L1_loss(real_feature_map, fake_feature_map) # 漫画风格与生成敵対的生成ネットワーク、AI が写真をコミック風に変換的损失 s_loss = style_loss(anime_feature_map, fake_feature_map) return c_loss, s_lossここで、vgg19 は実画像の計算に使用されます。それぞれ、絵の喪失(パラメーターフェイク)、生成された絵の喪失(パラメーターフェイク)、漫画スタイル(パラメーターアニメ)の世代です。
c_loss, s_loss = con_sty_loss(self.vgg, self.real, self.anime_gray, self.generated) t_loss = self.con_weight * c_loss + self.sty_weight * s_loss + color_loss(self.real,self.generated) * self.color_weight + tv_loss最後に、これら 2 つの損失に異なる重みを与えることで、ジェネレーターによって生成された画像が実際の画像の外観を保持するだけでなく、コミック スタイルに移行するようになります4. トレーニングプロジェクト ディレクトリで次のコマンドを実行してトレーニングを開始します
python train.py --dataset Hayao --epoch 101 --init_epoch 10操作が成功すると、データが表示されます。
#同時に、損失が減少していることもわかります。
ソース コードとデータ セットはパッケージ化されています。必要な場合は、コメント エリアにメッセージを残してください。
この記事が役に立ったと思われる場合は、クリックして読んでいただければ励みになります。今後も優れた Python AI プロジェクトを共有していきます。
以上が敵対的生成ネットワーク、AI が写真をコミック風に変換の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。