• トップ
  • ブログ一覧
  • cycleGANの精度をより上げる4つのポイント
  • cycleGANの精度をより上げる4つのポイント

    広告メディア事業部広告メディア事業部
    2020.08.24

    IT技術

    cycleGAN の精度を上げるにはどうすれば良いのか?

    前回は、cycleGAN を用いて、男女の相互顔変換を行いました。

    (cycleGAN の説明に関しては、前回の記事をご参照ください)

    cycleGAN で画像の精度を上げるポイント

    今回は、「cycleGAN で画像の精度を上げるには、どうすればいいか」についてまとめてみたいと思います。

    前回の実験をするにあたり、効果があったのは以下の4点です。

    1. identity Loss を用いて、色空間を安定させる
    2. Discriminator の損失関数を「BCE」ではなく「MSE」に変更
    3. BatchSize を「1」で学習
    4. cycle_late の大きさの比較により、より良い画像を生成

    それではさっそく、解説していきたいと思います!

    前回の記事はこちら

    featureImg2020.08.07cycleGANで男顔⇄女顔への変換を可能してみた!cycleGANとは?「cycleGAN」は pix2pix と違い、ペア画像を必要としない、より画期的な「画像 to...

    identity Loss の役割

    まずは、「GAN の損失関数」についておさらいしておきましょう。

    identity loss とは

    上記でも説明していますが、identity loss は「画像グループの共通点を維持する」仕組みです。

    つまり、男性→女性へ変換するモデルに「女性」を入力すると、出力は「女性」で行われるということです。

    identity loss なしで学習するとどうなる?

    実際にやってみた方がわかりやすいので、identity loss なしで学習してみましょう。

    以下が、identity loss なしで学習した、女性→男性の生成結果です。

    identity loss を使うと自然な色調になる

    上の画像を見ていただければわかる通り、identity loss なしでは、色空間がおかしくなることが確認できます。

    出力画像が適当で、無理やり画像を再構成しているようにも見えます。

    以上のことから、「色空間を自然にするには identity loss が必要」ということがわかりますね。

    Discriminator の損失関数を「BCE」から「MSE」に変化させたときの比較

    損失関数によって、学習の安定度に差が出る

    GAN では、Discriminator の出力が「1」もしくは「0」になるように学習していきます。

    損失関数は基本的に「BCE」ですが、これでは学習が上手くいかないおそれがあります。

    「BCE」を使うと、Generator と Discriminator の乖離が延々と大きくなってしまうからです。

    Discriminator の損失関数に MSE を使う

    そのため、今回の実験では、Discriminator の損失関数に「MSE」を用いることにしました。

    以下が、「MSE」「BCE」それぞれの乖離の絶対値をとったものです。

    確かに「MSE」を用いた方が乖離が低く、偽物か本物かわからない画像を生成できていますね。

    以上のことから、cycleGAN に限らず、Discriminator の損失関数は「MSE」の方が、学習が上手くいくことがわかりました。

    【GANの訓練がうまくいかないときにHingeロスを使うといいよという話】
    https://qiita.com/koshian2/items/9add09dabb44cab2b4c0

    BatchSize を「1」「4」「16」で学習したときの比較

    以下は、それぞれ BatchSize を変えた画像です。

    BatchSize:1

    BatchSize:4

    BatchSize:16

    BatchSizeは「1」で学習するべき

    ご覧の通り、BatchSize が上がるにつれ、画像が「淡く」「汚く」なっています。

    このことから、cycleGAN の学習には BatchSize「1」が最適であることがわかりました。

    恒等写像を見分ける方法はある?

    ところで、上記画像にちょこちょこ恒等写像があるのも気になりますね。

    出力画像が恒等写像かどうか、確かめる方法はないのでしょうか?

    この疑問は、次の項目で解消するのでご安心ください。

    cycle_late の大きさから見る比較

    cycle_late とは

    cycle_late は「λ」つまり「正則化係数」のことです。

    これが、「cycle loss」や「identity loss」のウェイトを決めているのです。

    「cycle_late」の大きさが生成画像にどう影響するか、0.1~10まで実験してみました。

    cycle_late が10の時

    入力→出力が恒等写像になりやすい

    他の値と比べて、入力と出力の関係が恒等写像であるのが最も多くなりました。

    cycle_late が強ければ、恒等写像で変換した方が損失は小さくなるので、これはある程度予測できましたね。

    恒等写像では Discriminator の損失が小さい

    また、恒等写像の時は、Discriminator の損失が極端に小さくなっていました。

    例えば、Discriminator の損失平均が「0.5」の場合、損失が「0.0050」の時は以下のようになりました。

    Discriminator の損失値を考慮して cycle_late 値を決めよう

    つまり、Discriminator の損失値が小さくなりすぎないよう、cycle_late 値を決定すればいいのです。

    また、Discriminator の値さえ見れば、画像生成結果の是非を議論できるというわけです。

    cycle_late が0.1の時

    cycle_late があまりにも小さすぎると、中間画像の画質が悪くなり、学習が進みません。

    以下は、10epoch 経った後の画像です。

    cycle loss の効果

    以上のことから、cycle loss には以下のような効果があることがわかりました。

    1. ペア画像を使わない
    2. 画像の生成結果を良くする
    3. 学習の高速化

    cycle_late が1の時

    今回行った男女の相互顔変換では、最も精度が良かったのがこの値です。

    cycle_late は大→小の順に設定しよう

    本家 cycleGAN の cycle_late は10ですが、データセットによって最も精度のいい cycle_late は異なってきます。

    そのため、Discriminator の値に注目し、極端に Discriminator が強くならないよう調整しなければなりません。

    その際、cycle_late を大きめで設定してから、順に小さくしていくのが良いでしょう。

    ソースコード

    cycleGAN の記事と同じですが、以下の Github に上げてあります。

    README に従って導入してください。

    【cycleGAN で男女相互顔変換ソースコード】
    https://github.com/rightcode/cycleGAN/

    さいごに

    今回は、cycleGAN の精度向上に役立つポイントをご紹介しました。

    cycleGAN は、今話題の「 faceapp 」などの顔変換アプリでも使われている技術なので、注目です!

    エンジニアのなかでも、機械学習エンジニアはまだまだ売り手市場ですから、お役に立てればうれしいです。

    次回は、「Deep Image prior による画像補完」をやっていきたいと思います!

    こちらの記事もオススメ!

    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事