Path: blob/master/site/ja/tutorials/generative/cyclegan.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
CycleGAN
このノートブックでは、「周期的構成の敵対的ネットワークを使った対となっていない画像から画像への変換」で説明されているように、条件付き GAN を使用して対になっていない画像から画像への変換を実演します。周期的構成の敵対的ネットワークは、CycleGAN としても知られています。この論文では、対になっているトレーニングサンプルを使用せずに、1 つの画像領域の特性をキャプチャして、それらの特性を別の画像領域にどのように変換できるのかを見つけ出す方法が提案されています。
このノートブックは、Pix2Pix の知識があることを前提としています。Pix2Pix については、Pix2Pix チュートリアルをご覧ください。CycleGAN のコードは類似していますが、主な違いは、追加の損失関数があり、対になっていないトレーニングデータを使用する点にあります。
CycleGAN では、周期的に一貫した損失を使用して、対になっているデータを必要とせずにトレーニングすることができます。言い換えると、ソースとターゲット領域で 1 対 1 のマッピングを行わずに、1 つの領域から別の領域に変換することができます。
この方法により、写真補正、カラー画像化、画風変換といった興味深い多様なタスクが可能となります。これらのタスクに必要となるのは、ソースとターゲットデータセット(単純な画像ディレクトリ)のみです。
入力パイプラインをセットアップする
ジェネレータとディスクリミネータのインポートを実行する tensorflow_examples パッケージをインストールします。
入力パイプライン
このチュートリアルでは、馬の画像からシマウマの画像に変換できるようにモデルをトレーニングします。このデータセットとこれに類似したほかのデータセットは、こちらにあります。
論文に記載されているように、トレーニングデータセットに、ランダムジッタリングとミラーリングを適用します。これらは、過学習を避ける画像認識精度向上テクニックです。
これは、pix2pix で行われていたものに似ています。
ランダムジッタリングでは、画像サイズは
286 x 286
に変換されてから、256 x 256
にランダムにクロップされます。ランダムミラーリングでは、画像はランダムに水平方向(左から右)に反転されます。
Pix2Pix モデルをインポートしてサイズ変更する
インストールした tensorflow_examples を介して Pix2Pix で使用したジェネレータとディスクリミネータをインポートします。
このチュートリアルで使用されるモデルアーキテクチャは、pix2pix で使用されたものに非常によく似ていますが、以下のような違いがあります。
CycleGAN の論文では、変更が適用された
resnet
ベースのジェネレータが使用されています。このチュートリアルでは、単純化するために、変更を適用したunet
ジェネレータを使用しています。
ここでトレーニングされるのは、以下のような 2 つのジェネレータ(G と F)と 2 つのディスクリミネータ(X と Y)です。
ジェネレータ
G
は、画像X
を画像Y
に変換する方法を学習します。ParseError: KaTeX parse error: Expected 'EOF', got '&' at position 8: (G: X -&̲gt; Y)ジェネレータ
F
は、画像Y
を画像X
に変換する方法を学習します。ParseError: KaTeX parse error: Expected 'EOF', got '&' at position 8: (F: Y -&̲gt; X)ディスクリミネータ
D_X
は、画像X
と生成された画像X
(F(Y)
)を区別する方法を学習します。ディスクリミネータ
D_Y
は、画像Y
と生成された画像Y
(G(X)
)を区別する方法を学習します。
損失関数
CycleGAN では、トレーニングできる、対になったデータが存在しないため、トレーニング中の入力 x
とターゲット y
のペアに意味がある保証はありません。したがって、ネットワークによる的確なマッピングを強化するために、論文の執筆者は 周期的に一貫性のある損失を提案しています。
ディスクリミネータ損失とジェネレータ損失は pix2pix で使用されているものに似ています。
周期的一貫性とは、結果が元の入力に近いことを指します。たとえば、ある文を英語からフランス語に翻訳してから、フランス語から英語に戻す場合、結果として得られる文は元の文と同じになるということです。
周期的一貫性損失は、以下のように行われます。
画像 はジェネレータ を介して渡され、画像 を生成します。
生成された画像 はジェネレータ を介して渡され、周期後の画像 を生成します。
と 間の平均絶対誤差が計算されます。
上記に示す通り、画像 から画像 への変換は、ジェネレータ が行います。 アイデンティティ損失は、画像 をジェネレータ にフィードした場合、実際の または画像 に近い画像を生成すると記述できます。
馬に対してシマウマから馬モデルを実行するか、シマウマに対して馬からシマウマモデルを実行する場合、画像にはすでにターゲットクラスが含まれるため、画像はそれほど変更されません。
すべてのジェネレータとディスクリミネータのオプティマイザを初期化します。
チェックポイント
トレーニング
注意: このサンプルモデルは、このチュートリアルのトレーニング時間を合理的にするために、論文(200 回)よりも少ないエポック数(10)でトレーニングされています。生成された画像の品質は大幅に低下します。
トレーニングループは複雑に見えるかもしれませんが、以下の 4 つの基本ループで構成されています。
予測を取得する。
損失を計算する。
バックプロパゲーションを使用して勾配を計算する。
勾配をオプティマイザに適用する。
テストデータセットを使用して生成する
次のステップ
このチュートリアルでは、Pix2Pix チュートリアルで実装されたジェネレータとディスクリミネータを使って CycleGAN を実装する方法を紹介しました。次のステップとして、TensorFlow データセットの別のデータセットを使用して試してみてください。
また、エポック数を増加してトレーニングし、結果がどのように改善されるか確認することもできます。さらに、ここで使用した U-Net ジェネレータの代わりに論文で使用されている変更された ResNet ジェネレータを実装してみるのもよいでしょう。