• トップ
  • ブログ一覧
  • cycleGANで男顔⇄女顔への変換を可能してみた!
  • cycleGANで男顔⇄女顔への変換を可能してみた!

    メディアチームメディアチーム
    2020.08.07

    IT技術

    cycleGANとは?

    「cycleGAN」は pix2pix と違い、ペア画像を必要としない、より画期的な「画像 to 画像」の GAN です。

    ペア画像とは

    ペア画像とは、以下のような画像群のことです。

    このように、物体の形状を変えないで、模様や色のみ変化している画像群を「ペア画像」といいます。

    pix2pix2による画像変換の学習

    pix2pix2 では、ペア画像を用いてカラー変換などを学習していました。

    cycleGANによる画像変換の学習

    一方、「cycleGAN」ではペア画像を必要とせず、ペアではない画像から画像変換を学習できます

    ペアではない画像とは、下図のように、左の列の「風景写真と右の列の「絵画のようなイメージです。

    アンペアな画像からの変換

    本家「cycleGAN」の論文では、このようなアンペアな訓練画像から「馬⇄シマウマ」や「風景写真⇄絵画」などの変換を可能にしています。

    下の図で見てもわかるように、アンペアな画像で学習しているにも関わらず、元の画像の形状をほとんど保っています

    ペア画像が必要ないことの有用性

    「cycleGAN」は pix2pix と違い、学習にペア画像が必要ないことを理解していだけたかと思います。

    では、なぜ「ペア画像が必要ない」ことが有用なのでしょうか?

    pix2pixで必要になるもの

    例えば、「馬⇄シマウマ」の例で言うと、pix2pixを用いて学習する場合にはペア画像が必要です。

    本来は、このペア画像の生成が目的なのに、学習の際にそのペア画像を手に入れる必要が出てくるため、通常の GAN などでは学習自体ができません。

    cycleGANが必要とされる理由

    このように、実際の画像変換タスクでは、変換先のデータが存在しないケースが数多くあります。

    むしろ、ペア画像が学習データとして揃っている方が「稀」です。

    だからこそ、ペア画像を必要としない「cycleGAN」が画像変換タスクでは必要とされてきたのです。

    cycleGANの仕組み

    「cycleGAN」は、通常の GAN と同様の構造をしていますが、Generator が2つ、Discriminator が2つの合計4つから構成されます。

    ここでは、「cycleGAN」の仕組みについて、通常のGANと同じ部分と、「cycleGAN」特有の部分に分けて説明します。

    通常のGANによる変換

    まず以下が、「cycleGAN」の通常のGANと同じ部分の概略図です。

    まずは、通常の GAN と同様に変換した画像に対する Discriminator を騙すように Generator を学習し、Discriminator は騙されないように学習されます。

    ここまでは、ただ単に二つの GAN ができているだけです。

    cycle性を利用した変換

    「cycleGAN」ではここに「cycle 性」を持たせます。

    「cycle 性とは以下のように、馬→シマウマ→馬のように変換を行った時、元の画像に近づくというものです。

    本家「cycleGAN」では、この cycle-loss に MSE を用いています。

    これがあることで、アンペアな画像で学習しても、ペア画像を学習した時のように、変換後の形状をほとんど変えることなく目的とした画像を得ることができます。

    identity lossによるcycleGANの改善

    また、本家にはない「cycleGAN」の工夫として、「identity loss」による改善を提案します。

    例えば、「絵画画像」から「風景画像」への変換を行うとします。

    その際、本来は「絵画画像」を入れるところに「風景画像」を入れてしまうと、「cycle性」だけでは、下図の真ん中の列のように色空間がおかしくなることが知られています。

    「identity loss」を用いることで、GAN がそれぞれのドメイン間での変換を学習するよう働きかけ、右側の列のような結果を得ることができます。

    今回の実験で工夫した点

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

    これらは、比較実験を行った結果を、次回記事で詳しくご紹介します。

    男⇄女への変換実験結果

    実験の条件

    実験環境Google Colab
    学習した画像約3000枚の男女の画像(手作業で集めました)
    バッチサイズ1

    女→男への変換

    まずは、「女→男」への変換を行いました。

    左から入力、出力、再構成画像の順番です。

    変換結果を見て

    思わず「おお!!」と叫んでしまいました。

    顔つきも、確かに男性っぽく変換されていますね。

    特に驚きなのは、女性特有の長い髪の毛が、男性に変換されたことによって短くなり、その背景部分を補完しているという結果です。

    それに、変換によってヒゲが生えていることもGANが女性らしさ、男性らしさを学習している証拠ではないかと考えます。

    再構成画像も、少々ぼやけていたり字が消えたりしていますが、しっかり元の女性らしく変換されています。

    「cycleGAN」の実力恐るべしです!

    男→女への変換

    続いて、「男→女」への変換を行いました。

    変換結果を見て

    こちらは先ほどと逆で、短い髪の毛が生えていたり、ヒゲが消えていることがわかります。

    結果で「男→女」への変換で精度が高いものが多かったのは、きっと髪の毛を伸ばすだけで良かったからだと思います。

    「女→男」への変換では、消した髪の毛の分を背景で補完する必要があります。

    しかし、「男→女」への変換では、髪色で塗りつぶせばいいので簡単なのかもしれません。

    また、先程の場合もそうでしたが、再構成結果が元画像の形状を維持しているのはすごいですね。

    生成画像の画質も悪くないため、「本物の女性」と見間違えてしまいそうです。

    まとめ

    今回の「cycleGAN」の実験は、2週間ほど時間をかけて工夫に工夫を凝らした結果なので、これだけ成果が出るのは単純に嬉しいです。

    結果が出ると、機械学習を勉強するモチベーションになりますね。

    次回は、本記事では説明できなかった工夫の部分をまとめますので、そちらもご覧ください!!

    その次は、「cycleGAN」の発展系の「starGAN」を試してみようかなと思ってます。

    ありがとうございました!!

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

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    ソースコード(Github)

    今回使ったソースコードは、gitに保存していますのでご覧ください。

    【ソースコード:Github】
    https://github.com/rightcode/cycleGAN/

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

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

    採用情報へ

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

    おすすめ記事

    エンジニア大募集中!

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

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

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

    background