Slide 1

Slide 1 text

CycleGANで顔写真を アニメ調に変換する取り組み 機械学習 & Pythonもくもく会 + LT@秋葉原Weeyble meow (id: meow_noisy) 2019/11/13(水)

Slide 2

Slide 2 text

発表概要  CycleGANの理論の説明と使い方を説明する  CycleGANをバックエンドにして、顔写真をアニメ調に 変換する”selfie2anime”の取り組み内容を説明する

Slide 3

Slide 3 text

おしながき  GAN, CycleGANとは  公式CycleGANの使い方  CycleGANを用いたselfie2anime  取り組み1: とりあえずやってみた編  取り組み2: データを増やした編  取り組み3: むりやり特定画像に特化させた編  今後の取り組み

Slide 4

Slide 4 text

GAN, CycleGANとは

Slide 5

Slide 5 text

https://www.slideshare.net/ cvpaperchallenge/gan-133159239

Slide 6

Slide 6 text

https://www.slideshare.net/ cvpaperchallenge/gan-133159239 この目的関数を どう実装するの?

Slide 7

Slide 7 text

どう目的関数を実装するのか  式の見た目ほど難しくない。DとGを交互に学習するだけ 実画像に対する推論 fake画像に対する推論 識別器Dの学習 生成器Gのサンプルを 識別器Dに推論させる 生成器Gを学習 https://github.com/miyamotok0105/pytorch_handbook/blob/master/chapter6/train_lsgan.py 識 別 器 D の 最 適 化 生 成 器 G の 最 適 化

Slide 8

Slide 8 text

[導入]pix2pix  入力をノイズではなく、画像にすることで画像変換を実現 https://www.slideshare.net/ cvpaperchallenge/gan-133159239 GeneratorにはU-Netを使用

Slide 9

Slide 9 text

pix2pixの制約  pix2pixを使った画像変換を行うためには、ピクセル同士の 対応が必要  下図はGoogle Mapsの航空画像とGoogle Maps地図

Slide 10

Slide 10 text

pix2pixの応用可能性  一方の変換は楽に行えるが、その逆は難しいという時に 強力。復元過程をモデルが学習できる可能性がある タスク例 処理 入力画像 出力(生成)画像 デノイジング ノイズを付与 ノイズをまぶした 画像 元の画像 (線画)彩色 カラー → グレー (or2値) グレー(or2値)の 画像 元の(カラー)画像 超解像 画像の解像度を落 とす 解像度を落とした 画像 元の画像 画像A 画像B 処理 簡単 復元 困難 画像Aから画像Bをつくるだけで、 画像B→画像Aへの復元過程を獲得できるかも・・・!

Slide 11

Slide 11 text

CycleGANとは  pix2pixの「ピクセル同士の対応が必要」という制約を外 した、画像変換手法  同じものは同じディレクトリ内にまとめておけばよい 元論文 https://arxiv.org/pdf/1703.10593.pdf 馬の動画を フレームごとに 変換したgifアニメ

Slide 12

Slide 12 text

その他にも、面白い事例が報告されている https://junyanz.github.io/CycleGAN/

Slide 13

Slide 13 text

[補足] 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

Slide 14

Slide 14 text

公式CycleGANの使い方

Slide 15

Slide 15 text

必要なもの  Linux マシン  GPU(グラフィックボード)必須  Video RAMは最低限4GBはほしい  Deep Learning 開発環境、ライブラリのインストール  CUDA  CuDNN  変換元、変換先の画像  変換元の画像を1つのディレクトリにまとめておく  変換先の画像を1つのディレクトリにまとめておく  お金  Deep Learningは電気代との相談 おそらくGoogle Colaboratoryでもできると思うが未確認

Slide 16

Slide 16 text

セットアップ  必要なら、pythonの仮想環境を作る  githubから公式のCycle GANリポジトリをクローン  https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix  pythonパッケージをインストール  $ pip install –r requirements.txt  自分のCUDAバージョンによっては、最新のPyTorchが入らないこ ともある。だめだったら、torch==1.0.1にしてみる

Slide 17

Slide 17 text

コードの微修正  ${repo_root}/data/image_folder.py  画像ディレクトリへのシンボリックリンクが使えるようにする  25行目のassert文をコメントアウトする  27行目のos.walk()のオプション引数に”followlinks=True”を追加

Slide 18

Slide 18 text

画像の配置  ${repo_root}/dataset/<データセット名>/  変換元の画像ディレクトリをtrainAという名前にする  シンボリックリンクでもよい  サブディレクトリがあってもよい  現行のコードはディレクトリ名に敏感なのでtrainAという名前は固定  同じく変換先の画像ディレクトリもtrainBという名前にする  AとBが逆につけてしまっても大丈夫  A→Bだけでなく、B→Aの変換のネットワークも学習してくれる  画像がないなら、とりあえずgoogle mapsの画像を落としてこよ う  $ bash ${repo_root}/datasets/download_cyclegan_dataset.sh maps

Slide 19

Slide 19 text

学習の実行  $ python ${repo_root}/train.py ¥ --dataroot ./datasets/ ¥ --name <任意のmodelの名前> ¥ --model cycle_gan  中間結果はhttp://localhost:8097で見れる  lossは上下するので、学習の収束の判断基準にならない  一定iter(デフォルトは5,000)の後、モデルのスナップショッ トが、 ${repo_root}/checkpoints/<任意のmodelの名前>下に 吐かれる  スナップショットを得た後、学習を中断し、再開したい場合は “—continue_train”をオプションにつける

Slide 20

Slide 20 text

学習時のその他のオプション  マシンに複数個のGPUを指しているならデータ並列の分散 学習も可能  使用GPUとバッチサイズを増やすオプションをつければ 自動的に分散学習してくれる  --gpu_ids=0,1,...  --batch_size=2  デフォルトでは1。Video RAM4GBあたり1枚増やせる感じ。

Slide 21

Slide 21 text

評価の実行  ${repo_root}/dataset/<データセット名>/testA ディレク トリを作る  $ python ${repo_root}/test.py ¥ --dataroot ./datasets/ ¥ --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とほぼ一致しているはず

Slide 22

Slide 22 text

CycleGANを用いたselfie2anime

Slide 23

Slide 23 text

selfie2animeとは  顔写真をアニメ調に変換してくれるWebアプリの名前  https://selfie2anime.com/  無料。  ただし、本スライドでは、この変換技術自体を、 selfie2animeと呼ぶことにする

Slide 24

Slide 24 text

目標  Lennaさんのアニメ調の画像を生成すること  理想的には右下みたいな結果になってほしい ※図は自動生成ではない (人が描いた)事に注意 https://www.sideranch.co.jp/issue/mb8.html https://ja.wikipedia.org/wiki/真珠の耳飾りの少女 ? https://ja.wikipedia.org/wiki/レナ_(画像データ)

Slide 25

Slide 25 text

先行事例  CycleGANの事例はすでに報告がある(ただし失敗とのこと)  CycleGANはテクスチャの変換はできるが、物体のデフォルメは難しい  https://www.youtube.com/watch?v=UDT_2lHv8o8

Slide 26

Slide 26 text

取り組み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枚ある

Slide 27

Slide 27 text

結果①  1epochだけ  fake_Bが、確かにテクスチャは変わってる気がするが、大きな変 化はなし  rec_Aの復元度合いが悪いのでepochが足りないのかと 思い、もう2epoch回したが進展なし

Slide 28

Slide 28 text

自分に対しての結果 灼眼っぽいものが埋め込まれる ?

Slide 29

Slide 29 text

取り組み2: データを増やした編  データセットに偏り  selfie側が20万、anime側が1.5万  anime側のデータセットを増やしたい  1からアニメ画像を用意するのは大変  → 自動生成されたアニメ画像で代用しよう

Slide 30

Slide 30 text

TWDNEv2  “This Waifu Does Not Exist v2”  https://www.thiswaifudoesnotexist.net/  Style GANで存在しないアニメキャラクターを自動生成 したものの展示サイト  15秒おきに画像が更新される

Slide 31

Slide 31 text

TWDNEv2からの画像の取得  zipのリンクはuploader側に消されていた  htmlを見るに、ファイルが連番になっているので、インク リメンタルにファイルをダウンロードした  合計175,000枚をダウンロードした  ダウンロード間隔を2.5秒開けたので数日かかった

Slide 32

Slide 32 text

取り組み2におけるモデル学習  anime側にTWDNEv2を混ぜる  また、12.5epoch回した  部屋がデフォルト暖房状態になった  翌月の電気代も500円くらい上がった気がする

Slide 33

Slide 33 text

結果②  前と変わらず  顔をタイトにクロップしても変わらない 帽子にツヤみたいなのができた

Slide 34

Slide 34 text

CelebA datasetに対する結果  理想に近い結果が出ている。輪郭に沿ってパーツが変化。  テクスチャしか変換できないというわけではなさそう

Slide 35

Slide 35 text

自分に対しての結果 again  train画像の埋め込みっぽさはなくなった  面白みが薄れた

Slide 36

Slide 36 text

その他  画像によっては顔のパーツが消える  これが発生する条件がわかっていない

Slide 37

Slide 37 text

取り組み3: むりやり特定画像に特化させた編  lenna画像でうまく行かない原因と考えられること  lenna画像とCelebA datasetのテクスチャが違うのでは  → lenna画像だけをtrainAにしたディレクトリをつくり、 lenna画像に特化したGeneratorを学習しよう trainA

Slide 38

Slide 38 text

結果③  変化が起きる。特に一番近接したもの(右)はいい感じ

Slide 39

Slide 39 text

今後の取り組み  顔のパーツが消える問題に対処したい  顔のパーツ検出器を間に挟んで、検出できなかったらlossを大きく する、的なことを考えている  テクスチャ依存(?)問題  CelebAというドメインを学習してしまっているのだろうが、 どうすればいいかわかっていない  いずれ取り組みたい

Slide 40

Slide 40 text

ちなみに  anime2selfieもできるヨ☆ これのARアプリ開発して 秋葉原歩いてみたい(錯乱)

Slide 41

Slide 41 text

まとめ  CycleGANの理論、実践について説明した  CycleGANはお手軽でかつ面白い結果が出る可能性があるので オススメ  CycleGANでselfie2animeする取り組みを説明した  なんとかlennaの変換に成功  もう少し安定して結果を出せるようにしたい  興味ドリブン開発はいいぞ!

Slide 42

Slide 42 text

参考文献  敵対的生成ネットワーク(GAN)/ ⽚岡 裕雄  https://www.slideshare.net/cvpaperchallenge/gan-133159239  GANのまとめスライド  PyTorchニューラルネットワーク 実装ハンドブック  https://www.shuwasystem.co.jp/book/9784798055473.html

Slide 43

Slide 43 text

ご清聴ありがとうございました オタク機械学習(#otakuml)クラスタよ甦れ!