狠狠撸

狠狠撸Share a Scribd company logo
CycleGANで顔写真を
アニメ調に変換する取り組み
機械学習 & Pythonもくもく会 + LT@秋葉原Weeyble
meow (id: meow_noisy)
2019/11/13(水)
発表概要
? CycleGANの理論の説明と使い方を説明する
? CycleGANをバックエンドにして、顔写真をアニメ調に
変換する”selfie2anime”の取り組み内容を説明する
おしながき
? GAN, CycleGANとは
? 公式颁测肠濒别骋础狈の使い方
? 颁测肠濒别骋础狈を用いた蝉别濒蹿颈别2补苍颈尘别
? 取り組み1: とりあえずやってみた編
? 取り組み2: データを増やした編
? 取り組み3: むりやり特定画像に特化させた編
? 今後の取り組み
GAN, CycleGANとは
/
cvpaperchallenge/gan-133159239
/
cvpaperchallenge/gan-133159239
この目的関数を
どう実装するの?
どう目的関数を実装するのか
? 式の見た目ほど難しくない。DとGを交互に学習するだけ
実画像に対する推論
fake画像に対する推論
識別器Dの学習
生成器Gのサンプルを
識別器Dに推論させる
生成器Gを学習
https://github.com/miyamotok0105/pytorch_handbook/blob/master/chapter6/train_lsgan.py
識
別
器
D
の
最
適
化
生
成
器
G
の
最
適
化
[導入]pix2pix
? 入力をノイズではなく、画像にすることで画像変換を実現
/
cvpaperchallenge/gan-133159239
GeneratorにはU-Netを使用
pix2pixの制約
? pix2pixを使った画像変換を行うためには、ピクセル同士の
対応が必要
? 下図はGoogle Mapsの航空画像とGoogle Maps地図
pix2pixの応用可能性
? 一方の変換は楽に行えるが、その逆は難しいという時に
強力。復元過程をモデルが学習できる可能性がある
タスク例 処理 入力画像 出力(生成)画像
デノイジング ノイズを付与 ノイズをまぶした
画像
元の画像
(線画)彩色 カラー → グレー
(or2値)
グレー(or2値)の
画像
元の(カラー)画像
超解像 画像の解像度を落
とす
解像度を落とした
画像
元の画像
画像A 画像B
処理
簡単?
復元
困難?
画像Aから画像Bをつくるだけで、
画像B→画像Aへの復元過程を獲得できるかも???!
CycleGANとは
? pix2pixの「ピクセル同士の対応が必要」という制約を外
した、画像変換手法
? 同じものは同じディレクトリ内にまとめておけばよい
元論文
https://arxiv.org/pdf/1703.10593.pdf
馬の動画を
フレームごとに
変換したgifアニメ
その他にも、面白い事例が報告されている
https://junyanz.github.io/CycleGAN/
[補足] CycleGANのloss
? Generatorの学習の際に、cycle-consistency lossを導入し、
変換した画像をもう一回逆変換させて、元の画像に戻す能
力を獲得するようにしていることが特徴
https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix/blob/master/models/cycle_gan_model.py
図は元論文のもの
https://arxiv.org/pdf/1703.10593.pdf
公式颁测肠濒别骋础狈の使い方
必要なもの
? Linux マシン
? GPU(グラフィックボード)必須
? Video RAMは最低限4GBはほしい
? Deep Learning 開発環境、ライブラリのインストール
? CUDA
? CuDNN
? 変換元、変換先の画像
? 変換元の画像を1つのディレクトリにまとめておく
? 変換先の画像を1つのディレクトリにまとめておく
? お金
? Deep Learningは電気代との相談
おそらくGoogle Colaboratoryでもできると思うが未確認
セットアップ
? 必要なら、pythonの仮想環境を作る
? githubから公式のCycle GANリポジトリをクローン
? https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
? pythonパッケージをインストール
? $ pip install –r requirements.txt
? 自分のCUDAバージョンによっては、最新のPyTorchが入らないこ
ともある。だめだったら、torch==1.0.1にしてみる
コードの微修正
? ${repo_root}/data/image_folder.py
? 画像ディレクトリへのシンボリックリンクが使えるようにする
? 25行目のassert文をコメントアウトする
? 27行目のos.walk()のオプション引数に”followlinks=True”を追加
画像の配置
? ${repo_root}/dataset/<データセット名>/
? 変換元の画像ディレクトリをtrainAという名前にする
? シンボリックリンクでもよい
? サブディレクトリがあってもよい
? 現行のコードはディレクトリ名に敏感なのでtrainAという名前は固定
? 同じく変換先の画像ディレクトリもtrainBという名前にする
? AとBが逆につけてしまっても大丈夫
? A→Bだけでなく、B→Aの変換のネットワークも学習してくれる
? 画像がないなら、とりあえずgoogle mapsの画像を落としてこよ
う
? $ bash ${repo_root}/datasets/download_cyclegan_dataset.sh maps
学習の実行
? $ python ${repo_root}/train.py ?
--dataroot ./datasets/<dataset_name> ?
--name <任意のmodelの名前> ?
--model cycle_gan
? 中間結果はhttp://localhost:8097で見れる
? lossは上下するので、学習の収束の判断基準にならない
? 一定iter(デフォルトは5,000)の後、モデルのスナップショッ
トが、 ${repo_root}/checkpoints/<任意のmodelの名前>下に
吐かれる
? スナップショットを得た後、学習を中断し、再開したい場合は
“—continue_train”をオプションにつける
学習時のその他のオプション
? マシンに複数個のGPUを指しているならデータ並列の分散
学習も可能
? 使用GPUとバッチサイズを増やすオプションをつければ
自動的に分散学習してくれる
? --gpu_ids=0,1,...
? --batch_size=2
? デフォルトでは1。Video RAM4GBあたり1枚増やせる感じ。
評価の実行
? ${repo_root}/dataset/<データセット名>/testA ディレク
トリを作る
? $ python ${repo_root}/test.py ?
--dataroot ./datasets/<dataset_name> ?
--name <任意のmodelの名前> ?
--model cycle_gan
? 結果はHTMLファイルで吐かれる
? ${repo_root}/results/<任意のmodelの名前>/test_latest/index.html
? real_A: 変換元の画像
? fake_B: real_Aを変換した画像
? rec_A: fake_Bをさらに、変換元になる変換をしたあとの画像
? 基本的にはreak_Aとほぼ一致しているはず
颁测肠濒别骋础狈を用いた蝉别濒蹿颈别2补苍颈尘别
selfie2animeとは
? 顔写真をアニメ調に変換してくれるWebアプリの名前
? https://selfie2anime.com/
? 無料。
? ただし、本スライドでは、この変換技術自体を、
selfie2animeと呼ぶことにする
目標
? Lennaさんのアニメ調の画像を生成すること
? 理想的には右下みたいな結果になってほしい
※図は自動生成ではない
(人が描いた)事に注意
https://www.sideranch.co.jp/issue/mb8.htmlhttps://ja.wikipedia.org/wiki/真珠の耳飾りの少女
?
https://ja.wikipedia.org/wiki/レナ_(画像データ)
先行事例
? CycleGANの事例はすでに報告がある(ただし失敗とのこと)
? CycleGANはテクスチャの変換はできるが、物体のデフォルメは難しい
? https://www.youtube.com/watch?v=UDT_2lHv8o8
取り組み1: とりあえずやってみた編
? 何はともあれ追試のような形でCycleGANで画像変換を
やってみよう
? selfie画像: CelebA dataset
? http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
? CUHKのmmlabが提供する顔画像データセット
? 合計約200,000枚ある
? Celebというだけあって、名の通った人(習近平主席など)が混ざっ
ているので取り扱いには注意
? アニメ画像: animeface-character-dataset
? http://www.nurs.or.jp/~nagadomi/animeface-character-dataset/
? 約200名のアニメキャラクターの画像
? 合計約15,000枚ある
結果①
? 1epochだけ
? fake_Bが、確かにテクスチャは変わってる気がするが、大きな変
化はなし
? rec_Aの復元度合いが悪いのでepochが足りないのかと
思い、もう2epoch回したが進展なし
自分に対しての結果
灼眼っぽいものが埋め込まれる
?
取り組み2: データを増やした編
? データセットに偏り
? selfie側が20万、anime側が1.5万
? anime側のデータセットを増やしたい
? 1からアニメ画像を用意するのは大変
? → 自動生成されたアニメ画像で代用しよう
TWDNEv2
? “This Waifu Does Not Exist v2”
? https://www.thiswaifudoesnotexist.net/
? Style GANで存在しないアニメキャラクターを自動生成
したものの展示サイト
? 15秒おきに画像が更新される
TWDNEv2からの画像の取得
? zipのリンクはuploader側に消されていた
? htmlを見るに、ファイルが連番になっているので、インク
リメンタルにファイルをダウンロードした
? 合計175,000枚をダウンロードした
? ダウンロード間隔を2.5秒開けたので数日かかった
取り組み2におけるモデル学習
? anime側にTWDNEv2を混ぜる
? また、12.5epoch回した
? 部屋がデフォルト暖房状態になった
? 翌月の電気代も500円くらい上がった気がする
結果②
? 前と変わらず
? 顔をタイトにクロップしても変わらない
帽子にツヤみたいなのができた
CelebA datasetに対する結果
? 理想に近い結果が出ている。輪郭に沿ってパーツが変化。
? テクスチャしか変换できないというわけではなさそう
自分に対しての結果 again
? train画像の埋め込みっぽさはなくなった
? 面白みが薄れた
その他
? 画像によっては顔のパーツが消える
? これが発生する条件がわかっていない
取り組み3: むりやり特定画像に特化させた編
? lenna画像でうまく行かない原因と考えられること
? lenna画像とCelebA datasetのテクスチャが違うのでは
? → lenna画像だけをtrainAにしたディレクトリをつくり、
lenna画像に特化したGeneratorを学習しよう
trainA
結果③
? 変化が起きる。特に一番近接したもの(右)はいい感じ
今後の取り組み
? 顔のパーツが消える問題に対処したい
? 顔のパーツ検出器を間に挟んで、検出できなかったらlossを大きく
する、的なことを考えている
? テクスチャ依存(?)問題
? CelebAというドメインを学習してしまっているのだろうが、
どうすればいいかわかっていない
? いずれ取り組みたい
ちなみに
? anime2selfieもできるヨ☆
これのARアプリ開発して
秋葉原歩いてみたい(錯乱)
まとめ
? CycleGANの理論、実践について説明した
? CycleGANはお手軽でかつ面白い結果が出る可能性があるので
オススメ
? CycleGANでselfie2animeする取り組みを説明した
? なんとかlennaの変換に成功
? もう少し安定して結果を出せるようにしたい
? 興味ドリブン開発はいいぞ!
参考文献
? 敵対的生成ネットワーク(GAN)/ ?岡 裕雄
? /cvpaperchallenge/gan-133159239
? GANのまとめスライド
? PyTorchニューラルネットワーク 実装ハンドブック
? https://www.shuwasystem.co.jp/book/9784798055473.html
ご清聴ありがとうございました
オタク機械学習(#otakuml)クラスタよ甦れ!

More Related Content

颁测肠濒别骋础狈で颜写真をアニメ调に変换する