• トップ
  • ブログ一覧
  • 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ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    メディアチーム
    メディアチーム
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background