1. HOME
  2. ブログ
  3. IT技術
  4. cycleGANの精度をより上げる4つのポイント

cycleGANの精度をより上げる4つのポイント

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

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

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

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

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

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

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

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

前回の記事はこちら

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 による画像補完」をやっていきたいと思います!

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

書いた人はこんな人

広告メディア事業部
広告メディア事業部
「好きを仕事にするエンジニア集団」の(株)ライトコードです!

ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。

システム開発依頼・お見積もり大歓迎!

また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。

以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit

関連記事

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア