今回は、NNabla のサンプルプログラム CycleGANで馬をシマウマに変換してみたいと思います。
こんにちは cedro です。
最近、NNabla の GAN のサンプルプログラムが充実して来ていて、GAN 好きの私にとっては嬉しい限りです。前々回は、 PGGAN についてご紹介しましたが、今回は CycleGAN です。
CycleGAN とは、2つのドメインを相互に変換することを学習するニューラルネットワークです。例えば、絵画と写真を相互に変換するとか、馬とシマウマを相互に変換するとか、夏景色と冬景色を相互に変換するとか、などを可能にします。
どうやって学習するかと言うと、DCGANとか PGGAN はランダムノイズから Generator が画像を生成し Discrminator と切磋琢磨で学習します。
一方、CycleGAN はドメインAの画像をドメインBの画像に Generator(A→B)で変換してDiscriminator(A→B)と切磋琢磨して学習すると共に、変換した画像をもう一度ドメインAの画像にGenerator(B→A) で変換して Discriminator(B→A)と切磋琢磨して学習します。
こうすることで、ドメインAの画像とドメインBの画像の相互変換を可能にしています。しかも、同じ形の画像をペアで用意する必要はなくなるのです(これは素晴らしいことです)。
と言うことで、今回は、NNabla のサンプルプログラム CycleGANで馬をシマウマに変換してみたいと思います。
サンプルプログラムの準備
NNabla の Github からサンプルプログラムをダウンロードします。nnabla-examples/GANs/cycle-gan/が、今回使用するプログラムです。
1 2 3 |
python train.py -c cudnn |
Anaconda に作った仮想環境 NNablaを選んでOpen Terminal を開き、nnabla-examples/GANs/cycle-gan/のフォルダーに移動し、上記コマンドを入力すればプログラムが動きます。
データセットは、バークレー大学にある horse2zebla.zip をプログラムが自動的にダウンロードして使っています。
GAN系は、処理に膨大な時間が掛かるので、 GPUは必須です。今回は、GTX1060で丸二日掛かって学習が完了しました。お疲れ様でした。
馬からシマウマに変換してみます
1 2 3 |
python test.py -c cudnn --model-load-path tmp.monitor\params_266799.h5 |
おおっ!見事に馬がシマウマになりました(左が元画像、右が変換後の画像)。ついでに背景が濃くなりましたね。
これも、見事にシマウマになりましたが、背景の海の色が大きく変化しました。
対象が小さくても、ちゃんと馬からシマウマに変換します。但し、これは背景の森が脱色してしまいました。どうも、変換に伴う背景の維持は、あまり得意ではないようです。
それでは、牧場の馬の親子をシマウマの親子に変換させてみたいと思います。
思ったよりも良い出来です。偶然ですが、左の元画像の色が薄いので、変換した時に色が濃くなり、丁度良い色加減になりました(笑)。
いやー、それにしても、このCycleGAN 面白いです。もっと違うドメイン間の変換をやってみたくなりました。
但し、制約条件が1つあって、2つのドメインの形が似ている必要があります。
Web を見ていると、色んな方が、この制約条件の中で、様々なドメイン間の相互変換に挑戦しているようです。
「絵画と写真」、「夏の景色と冬の景色」、「熊とパンダ」、「普通の木と満開の桜」、「犬と猫」、「普通の顔とプリ画」、「男性の顔と女性の顔」。。。
皆さん、色々知恵を絞って、チャレンジしておられます。
私も、じっくり考えて、オリジナルのドメイン間の相互変換に挑戦してみようかなと思っています。
では、また。