NNabla CycleGAN で少女時代のコスチュームを入れ替えてみる

今回は、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個です。

 

プログラムは、全く修正の必要はありません。前回と同じく、上記コマンドを入力すれば、プログラムが動きます。

GTX1060で約38時間かけて、学習が完了しました。お疲れ様でした。

 

果たして、コスチュームの入れ替えはできるのか

 

さて、学習したパラメータを読み込んで、AドメインBドメイン相互入れ替えを行なってみます。

まず、AドメインBドメインへ(左が元画像です)変換してみます。

 

おおっ!思ったよりもいい感じ。帽子がなんとなく不自然ですが、コスチュームの感じは上手く変換できています。

但し、AドメインBドメインで背景が全く違うので、背景も変わってしまいました。まあ、これは良いけど。

今度は、BドメインAドメインへ(左が元画像です)変換してみます。

 

ほおー。CycleGAN 結構やりますねー。見事に、コスチュームが入れ替わっているではないですか。

それでは、GIF動画にして、リアルタイムで比較してみましょう。

 

 

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

 

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

 

いやー、こんなことが簡単にできちゃうんですね。ディープラーニングのポテンシャルの高さをまざまざと感じます。

もうちょっと色々やってみたい気がしてます。

では、また。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)