CycleGAN:ドメイン関係を学習した画像変換

GAN, DCGAN, CGAN, Pix2Pixに引き続きGAN手法のお勉強。


GAN (Generative Adversarial Network):敵対的生成ネットワーク アルゴリズムまとめ
これまで勉強したGAN (Generative Adversarial Network):敵対的生成ネットワーク手法のアルゴリズム一覧。


Pix2Pixからだいぶ時間が空いてしまったけど、次はCycleGANについて。

CycleGAN

CycleGANICCV 2017で発表された論文 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networksで提案されたGANによる画像変換手法。

馬をシマウマに変換したこちらの衝撃的な動画が有名ですね↓




スポンサーリンク


Pix2Pixは画像変換の入力画像、出力画像に相当する2つの画像の対応関係を学習することで変換アルゴリズムを獲得できるが、その学習には1対1で対応したペア画像データが大量に必要だった。しかし、1対1で各ピクセルが対応したペア画像データを大量に入手できるケースは稀で、Pix2Pixのために新たに学習データを用意するコストが課題として残されていた。

CycleGANは、2枚の画像の対応する各ピクセルの関係を学習するのではなく、2つの画像データセット同士のdomain(分野、領域)の関係を学習して画像変換を実現する手法。
これによって、CycleGANは大量のペア画像を用意しなくても、2つの違う画像データセットからその関係を学習して画像変換アルゴリズムを獲得できる。

画像データセットのdomainとは?

domain“とはやや抽象的な概念だが、集合論的に考えると、機械学習用に公開されている各画像データセットはそれぞれ固有のdomainで収集された画像の集合と捉えることができる。(というかsetって集合って意味だよな)

例えば、一般物体認識用にラベル付けされたImageNetなどの画像データセットで考えると、「馬」とラベル付けされた画像は「馬domainの画像データセット」、「シマウマ」とラベル付けされた画像は「シマウマdomainの画像データセット」と見なすことができる。

CycleGANでは、domainの違う2つの画像データセット間に何らかの関係があると仮定し、domain間の対応関係を学習する。

CycleGANの基本構造

CycleGANは、domainの違う2つの画像データセット間の関係を学習するために、以下の図のように2組のGeneratorDiscriminatorを使った変換と逆変換の循環(cycle)構造になっている↓

G:domain X→domain Yの画像変換Generator
DX:domain Xの画像か識別するDiscriminator

X:domain Xの画像群
x data:domain Xの実画像
x fake:Fが生成した偽のdomain Xの画像F(y)
F:domain Y→domain Xの画像変換Generator
DY:domain Yの画像か識別するDiscriminator

Y:domain Yの画像群
y data:domain Yの実画像
y fake:Gが生成した偽のdomain Yの画像G(x)

GeneratorDiscriminatorが2組あるが、それぞれの組は通常のGANと同様に、GeneratorDiscriminatorを騙すように学習し、DiscriminatorGeneratorの嘘を見破るように学習する。



学習データとして2種類の画像データセット domain X, domain Yがある場合、
Generator Gはdomain Xの画像xをdomain Yの画像yへ変換し、Discriminator DYは画像yが本物のdomain Yの画像かどうかを識別する。
Generator Fはdomain Yの画像yをdomain Xの画像xへ変換し、Discriminator DXは画像xが本物のdomain Xの画像かどうかを識別する。

Pix2Pixのように1組のGeneratorDiscriminatorで一方向の変換(生成)だけを学習する場合、入力xを出力yへ変換する関係を習得することはできるが、yからxへの逆変換も成立する関係を習得することができない。
そこで、CycleGANではGeneratorDiscriminatorをもう1組加え、出力yから入力xへの逆変換の学習も行い、双方向の変換を保証するdomain間の関係を学習する。

定式化

通常のGANのセオリ―に則り、GeneratorDiscriminatorの組はそれぞれAdversarial Lossで学習する。
よって、domain Xの画像xをdomain Yの画像yへ変換するGenerator Gと、その変換結果を識別するDiscriminator DYの関係は以下の式となり↓



このGeneratorDisicriminatorの組の学習の目的はこの式のGを最小化、DYを最大化すること↓



同様にdomain Yの画像yをdomain Xの画像xへ変換するGenerator Fと、その変換結果を識別するDiscriminator DXの学習の目的は以下↓



スポンサーリンク

Cycle Consistency Loss

通常のGANの目的関数だけでは、変換(Generator G)と逆変換(Generator F)の学習がそれぞれ独立したままで、相互変換の学習が上手く収束しない。
変換と逆変換を繰り返す循環での一貫性を保つ関係を学習するために、CycleGANではCycle Consistency Lossという新たな損失関数が導入されている。
Cycle Consistency Lossは、変換と逆変換を経て「画像がどれだけ変換前に戻ったか?」の一貫性(Consistency)を測る指標として、GとFの関係を表す↓



ここまで出てきた式を1つにまとめると以下のようになる↓



ここでCycle Consistency Lossにかかっているλは、Adversarial LossCycle Consistency Lossの相対的な重要度を制御する重み変数。

ということで、CycleGANの学習で目指すのは最終的に以下のようになる↓


CycleGANのネットワーク

CycleGANのネットワークの実装は、Perceptual Losses for Real-Time Style Transfer and Super-Resolutionのビルディングブロックを踏襲して、stride 2の畳み込み層2つ、residualブロック、stride 1/2のfractionally strided convolution 2つで構成。128×128の画像に対しては 6 ブロック、256×256以上の画像の学習には 9ブロック使い、Instance Normalizationを使用する。
DiscriminatorにはPix2Pixと同じようにPatchGANを採用している。(ここでは70×70のPatchGANを使用)

CycleGANの実験結果

以下の図のようにCycleGANでは、馬とシマウマの画像データセットを学習して画像内の馬のポーズを保ったままシマウマに変換したり、絵画(モネ)と風景写真のデータセットを学習して絵画と風景写真の変換が可能となる。

論文では、Pix2Pixと同様に実験結果に対してAMT(Amazon Mechanical Turk)による知覚評価とFCN Scoreによる評価を行っている。

CycleGANでの失敗例

CycleGANでは、似た形状や同じポーズ、似た構図での色・テクスチャの変換をキレイに行うことができるが、犬の画像を猫の画像へ変換するような、形状の違うデータセット間の変換では失敗してしまう場合が多い↓

CycleGANの実装

公式にCycleGANのPyTorch実装が(Pix2Pixの実装と一緒に)公開されている↓
https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix

ICCV 2017での発表動画

ICCV 2017でのCycleGANの発表の様子がYouTubeで公開されている↓



今回CycleGANの論文を読むにあたって、最近話題のDeepL翻訳も使ってみた。自然な日本語になる代わりに、上手く訳せない部分がサラッと省略されてしまうこともあるので、論理構造はよく分からなくなってしまうな。CycleGANの論文は文章中に数式も入ってるし。

さて、次はどの手法を勉強しようか。



金森先生のこちらの資料をガイドにして勉強を進めようか↓

動画生成、再照明、3D復元と面白そうな分野が色々あるけど、もう少し画像生成系の論文を読んでみようかな。

次はPGGAN (Progressive Growing GAN)を勉強しよう↓



GAN (Generative Adversarial Network):敵対的生成ネットワーク アルゴリズムまとめ
これまで勉強したGAN (Generative Adversarial Network):敵対的生成ネットワーク手法のアルゴリズム一覧。


スポンサーリンク

関連記事

OpenCV 3.1のsfmモジュールのビルド再び
Google App Engineのデプロイ失敗
書籍『仕事ではじめる機械学習』を読みました
ディープラーニングに対応したPythonの機械学習ライブラリ『Pylearn2』
Google製オープンソース機械学習ライブラリ『TensorFlow』のWindows版が公開された
PeopleSansPeople:機械学習用の人物データをUnityで生成する
Kubric:機械学習用アノテーション付き動画生成パイプライン
ポイントクラウドコンソーシアム
ZBrushでアヴァン・ガメラを作ってみる モールドの彫り込み・身体の形出し
Shader.jp:リアルタイム3DCG技術をあつかうサイト
実写と実写の合成時の色の馴染ませテクニック
ZBrushでアヴァン・ガメラを作ってみる 歯を配置
コンピュータビジョンの技術マップ
ZBrush 2018へのアップグレード
Super Resolution:OpenCVの超解像処理モジュール
Unity MonoBehaviourクラスのオーバーライド関数が呼び出される順番
ZBrushでアヴァン・ガメラを作ってみる パーツ分割
クラスの基本
Maya LTのQuick Rigを試す
プロシージャル手法に特化した本が出てるみたい(まだ買わないけど)
Iridescence:プロトタイピング向け軽量3D可視化ライブラリ
ZBrushでリメッシュとディティールの転送
ポリゴンジオメトリ処理ライブラリ『pmp-library (Polygon Mesh Process...
『ゴジラ キング・オブ・モンスターズ』のVFXブレイクダウン
スターウォーズ エピソードVIIの予告編
ブログのデザイン変えました
.NETで使えるTensorFlowライクなニューラルネットワークライブラリ『NeuralNetwo...
OpenCVで動画の手ぶれ補正
スクレイピング
ZBrushのZmodelerとDynamic Subdivisionを学ぶ
Raspberry Piでセンサーの常時稼働を検討する
DensePose:画像中の人物表面のUV座標を推定する
SVM (Support Vector Machine)
Theia:オープンソースのStructure from Motionライブラリ
Verilog HDL
Unityで360度ステレオVR動画を作る
CLO:服飾デザインツール
Mechanizeで要認証Webサイトをスクレイピング
RefineNet (Multi-Path Refinement Network):ディープラーニン...
ArUco:OpenCVベースのコンパクトなARライブラリ
viser:Pythonで使える3D可視化ライブラリ
ZBrush 4R8 リリース!

コメント