今回は、CycleGAN の可能性を探るために、大胆にも少女時代のコスチュームの入れ替えに挑戦してみます。
こんにちは cedro です。
前回、NNabla CycleGANを使って、馬をシマウマに変換できたのが嬉しくて、その後自分でもオリジナルのデータセットでやってみたくなり、色々考えていました。
但し、CycleGANを使うには、2つのドメインの形がほぼ同じでないと上手く行きません。意外に、これが厳しい制約条件になります。
色々検討した結果、今回は、CycleGAN の可能性を探るために、大胆にも少女時代のコスチュームの入れ替えに挑戦してみます。
データソースを探す
データソースは、ある程度の数の画像を集める必要があり、最終的には動画にしたかったので、Youtube にある動画から選ぶことにしました。
色々物色した結果、少女時代が2種類のコスチュームで歌っている「Genie」を選びました。
これは、かなり有名な曲(なんとYoutube での再生回数は1,900万回以上)なので、ご存知の方も多いと思いますが、コスチュームの解説をすると。

曲のほとんどの部分で、メンバー全員が、この写真の上のコスチュームか下のコスチュームを着て歌っています。
従って、上のコスチュームをドメインA、下のコスチュームをドメインBと設定してCycleGANで学習させれば、上下のコスチュームの相互変換(入れ替え)ができるのではないかという発想です。
本当にそんな事ができるんかいな? とは思いながら、やってみます。
オリジナルのデータセットを作る

Youtube から動画をダウンロードしたら、静止画を640×320、毎秒10枚の間隔で切り出し、ドメインA用、ドメインB用、その他に分類します。
学習用データと評価用データを作成します。最終的に、NNabla CycleGAN のデータは256×256にする必要があります。

まず、学習用データは、320×320にトリミングし、300×300にリサイズして大きさを調整してから、NNCの「RoundamCrop」などを利用して256×256の画像をランダムに切り出しています。理由は、単に動画からリサイズするだけだと同じ様な画像が多くなり学習が上手く進まなくなるので、画像に変化をつけるためです。

一方、評価用データの方は、320×320にトリミングし、256×256にリサイズします。
さて、NNabla CycleGAN にデータセットをどう読ませるかですが、プログラムは、nnabla_dataフォルダー(たぶんUsers\自分のユーザーネームの直下ににあります)に horse2zebla.zip があると新たにダウンロードせずに、その horse2zebla.zip を解凍して中身を読み込む設定になっているので、この仕組みを利用します。

つまり、こんな構成でフォルダーhorse2zeblaを作り、zipで圧縮してhorse2zebla.zip を作り、nnabla_dataフォルダーにあるhorse2zebla.zip と入れ替えてやればOKです。
なお、今回用意したデータ数は、trainA:820個、trainB:448個、testA:778個、testB:429個です。
1 2 3 |
python train.py -c cudnn |
プログラムは、全く修正の必要はありません。前回と同じく、上記コマンドを入力すれば、プログラムが動きます。
GTX1060で約38時間かけて、学習が完了しました。お疲れ様でした。
果たして、コスチュームの入れ替えはできるのか
1 2 3 |
python test.py -c cudnn --model-load-path tmp.monitor\params_163999.h5 |
さて、学習したパラメータを読み込んで、AドメインとBドメインの相互入れ替えを行なってみます。
まず、AドメインをBドメインへ(左が元画像です)変換してみます。

おおっ!思ったよりもいい感じ。帽子がなんとなく不自然ですが、コスチュームの感じは上手く変換できています。
但し、AドメインとBドメインで背景が全く違うので、背景も変わってしまいました。まあ、これは良いけど。
今度は、BドメインをAドメインへ(左が元画像です)変換してみます。

ほおー。CycleGAN 結構やりますねー。見事に、コスチュームが入れ替わっているではないですか。
それでは、GIF動画にして、リアルタイムで比較してみましょう。

AドメインのコスチュームをBドメインに!(左が元画像、右が変換画像)

BドメインのコスチュームをAドメインに!(左が元画像、右が変換画像)
いやー、こんなことが簡単にできちゃうんですね。ディープラーニングのポテンシャルの高さをまざまざと感じます。
もうちょっと色々やってみたい気がしてます。
では、また。
コメントを残す