Slide 1

Slide 1 text

CycleGAN and InstaGAN 第8回画像処理 & 機械学習】論文LT会 2019年11月21日(木) @hrs1985

Slide 2

Slide 2 text

自己紹介 twitter : @hrs1985 https://qiita.com/hrs1985 https://kiyo.qrunch.io/ 機械学習エンジニアをしています。 最近転職して7月から東京で働いてます。 前々職では実験生物学やってました。 ● 深層生成モデル、画像の変換 ● 強化学習 ● 生物学・化学への機械学習の応用 に興味があります。

Slide 3

Slide 3 text

紹介する論文 CycleGAN Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks (ICCV 2017) https://arxiv.org/abs/1703.10593 InstaGAN InstaGAN: Instance-aware Image-to-Image Translation (ICLR 2019) https://arxiv.org/abs/1812.10889

Slide 4

Slide 4 text

画像のスタイル変換 Paired 各ドメインの画像が対になっている Unpaired 各ドメインの画像が対になっていない あるドメインの画像を別のドメインへの対応する画像に変換する操作

Slide 5

Slide 5 text

CycleGAN による画像変換 左: CycleGAN の論文中の例、右: 自分で実験してみた例

Slide 6

Slide 6 text

CycleGAN 2つのGeneratorはそれぞれX→Y、Y→Xの変換を行い、 Discriminatorはそれが元々そのドメインの画像だったか Generatorによって変換された画像かを見破る。

Slide 7

Slide 7 text

CycleGAN の Loss Domain loss (GAN Loss) Content Loss (Cycle Consistency Loss)

Slide 8

Slide 8 text

CycleGAN

Slide 9

Slide 9 text

CycleGAN の問題点 ・オブジェクト形状が大きく変わるような変換はできない。 ・変換するべきオブジェクトが画像のどの部分であるかを明示して変換することはできない。

Slide 10

Slide 10 text

InstaGAN ・CycleGAN で失敗しやすい、オブジェクト形状が変化するような変換にも対応できる。 ・該当するインスタンスのうち、一部だけを変換することもできる。

Slide 11

Slide 11 text

InstaGAN

Slide 12

Slide 12 text

Generator 1. 画像用 Encoder とマスク用 Encoder で特徴を抽出 2. マスク特徴の総和を取っておく 3. 画像用の Decoder に画像特徴とマスク特徴の総和を 入力して変換された画像を得る 4. マスク用の Decoder に画像特徴とマスク特徴の総和と マスク特徴を入力して変換されたマスクを得る

Slide 13

Slide 13 text

Discriminator 1. 画像用 Encoder とマスク用 Encoder で特徴を抽出 2. マスク特徴の総和を取る 3. Classifier に画像特徴とマスク特徴の総和を入力して判 別する

Slide 14

Slide 14 text

InstaGAN の Loss Domain Loss (GAN Loss) Content Loss Domain Loss: target domain っぽいかどうかを判別するための Loss Content Loss: 元画像の内容や文脈を保持するための Loss

Slide 15

Slide 15 text

Content Loss の中身 ドメイン X の画像を一旦 Y に変換してからもう一度 X に変換したら元画像戻って欲しいという願い (CycleGAN の Cycle Consistency Loss と同じ) GXY/GYX はそれぞれドメイン X/Y の画像についてのみ変更してほしいという願い (元々 Y/X だった画像は変更しないでほしい ) マスク領域以外の場所は変更しないでほしいという願い

Slide 16

Slide 16 text

Sequential Translation 一度に全てのマスクを変換するのではなく、 各 iteration では少数のマスクだけを変換する手法を使っています。

Slide 17

Slide 17 text

Sequential Translation One: 全てのマスクを 1 iteration で変換 Seq: Sequential に少数ずつ変換 train時/inference時 Train 時にも Inference 時にも Sequential Translation を行った方がよいらしい (一番右)。

Slide 18

Slide 18 text

結果 ズボン⇔スカートの変換 CycleGANよりも綺麗です。 また、右側中段のように一人分だけ変換することもできています。

Slide 19

Slide 19 text

結果 ヒツジ⇔キリンの変換 ちゃんとヒツジとキリンの形になっています。 また、InstaGAN では背景部分の変化が小さいです (左側上段など)

Slide 20

Slide 20 text

結果 ウマ⇔車の変換 この変換の出来は微妙に見えますが論文中では上手くいってる扱いぽいです。 確かにCycleGANよりはマシに見えます。

Slide 21

Slide 21 text

おまけ 自分で実装してみるために参考に著者実装を見たのですが実装が酷すぎて読むのがつらいです。 各メソッドの全ての変数に selfがついているのでメソッドの中身だけ追っても処理内容が見えづらい あとPyTorchの使い方覚えてほしい

Slide 22

Slide 22 text

参考 CycleGAN (https://qiita.com/hrs1985/items/050acb15ce33675f07ec) CycleGANを用いたスタイル変換 (https://qiita.com/hrs1985/items/926f9c4e635aac659675) CycleGANを用いたスタイル変換 (2) リベンジ編 (https://qiita.com/hrs1985/items/820d9b0b919fe0425e46) CycleGANのPytorch実装 (https://github.com/kiyohiro8/CycleGAN-pytorch) CycleGANの実装はあまりカッコよくないので色々修正したい。 InstaGANの実装も今やっているので上手くできたら githubに上げます。