cycleGANの精度をより上げる4つのポイント
IT技術
cycleGAN の精度を上げるにはどうすれば良いのか?
前回は、cycleGAN を用いて、男女の相互顔変換を行いました。
(cycleGAN の説明に関しては、前回の記事をご参照ください)
cycleGAN で画像の精度を上げるポイント
今回は、「cycleGAN で画像の精度を上げるには、どうすればいいか」についてまとめてみたいと思います。
前回の実験をするにあたり、効果があったのは以下の4点です。
- identity Loss を用いて、色空間を安定させる
- Discriminator の損失関数を「BCE」ではなく「MSE」に変更
- BatchSize を「1」で学習
- cycle_late の大きさの比較により、より良い画像を生成
それではさっそく、解説していきたいと思います!
前回の記事はこちら
2020.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 には以下のような効果があることがわかりました。
- ペア画像を使わない
- 画像の生成結果を良くする
- 学習の高速化
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 による画像補完」をやっていきたいと思います!
こちらの記事もオススメ!
2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪、名古屋の4拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit
おすすめ記事
immichを知ってほしい
2024.10.31