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

(株)ライトコードは、WEB・アプリ・ゲーム開発に強い「好きを仕事にするエンジニア集団」です。
機械学習でのシステム開発依頼・お見積もりはこちらまでお願いします。
また、機械学習系エンジニアを積極採用中です!詳しくはこちらをご覧ください。

※現在、多数のお問合せを頂いており、返信に、多少お時間を頂く場合がございます。

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

ライトコードよりお知らせ

にゃんこ師匠にゃんこ師匠
システム開発のご相談やご依頼はこちら
ミツオカミツオカ
ライトコードの採用募集はこちら
にゃんこ師匠にゃんこ師匠
社長と一杯飲みながらお話してみたい方はこちら
ミツオカミツオカ
フリーランスエンジニア様の募集はこちら
にゃんこ師匠にゃんこ師匠
その他、お問い合わせはこちら
ミツオカミツオカ
   
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね!

一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!

当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。

また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!

なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。

ライトコードでは一緒に働いていただける方を募集しております!

採用情報はこちら

関連記事