サイトアイコン NegativeMindException

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):敵対的生成ネットワーク手法のアルゴリズム一覧。


スポンサーリンク

関連記事

  • Maya API Reference
  • オープンソースの顔の動作解析ツールキット『OpenFace』
  • Transformers ”Reference & Bulid” Siggraph 2007
  • ラクガキの立体化 1年半ぶりの続き
  • Maya 2015から標準搭載されたMILA
  • 統計的な顔モデル
  • fSpy:1枚の写真からカメラパラメーターを割り出すツール
  • 機械学習手法『Random Forest』
  • OpenFace:Deep Neural Networkによる顔の個人識別フレームワーク
  • テスト
  • MeshLab:3Dオブジェクトの確認・変換に便利なフリーウェア
  • 機械学習に役立つPythonライブラリ一覧
  • After Effects全エフェクトの解説(6.5)
  • CGALDotNet:計算幾何学ライブラリ CGALのC#ラッパー
  • ZBrushからBlenderへモデルをインポート
  • Iterator
  • AI英語教材アプリ『abceed』
  • Maya には3 種類のシェーダSDKがある?
  • FacebookがDeep learningツールの一部をオープンソース化
  • CLO:服飾デザインツール
  • 『ピクサー展』へ行ってきた
  • ManuelBastioniLAB:人体モデリングできるBlenderアドオン
  • PureRef:リファレンス画像専用ビューア
  • Quartus II
  • Kornia:微分可能なコンピュータービジョンライブラリ
  • ブログの復旧が難航してた話
  • WordPressのサーバ引っ越し方法を考える
  • UnityのTransformクラスについて調べてみた
  • ManimML:機械学習の概念を視覚的に説明するためのライブラリ
  • BGSLibrary:OpenCVベースの背景差分ライブラリ
  • 2022年 観に行った映画振り返り
  • GoogleのDeep Learning論文
  • ZBrushでアヴァン・ガメラを作ってみる モールドの彫り込み・身体の形出し
  • 2012のメイキングまとめ(途中)
  • S.H.Figuarts 仮面ライダーアマゾンズ
  • C++ 標準テンプレートライブラリ (STL)
  • AnacondaとTensorFlowをインストールしてVisual Studio 2015で使う
  • 2D→3D復元技術で使われる用語まとめ
  • Google Earth用の建物を簡単に作れるツール Google Building Maker 公...
  • Kinect for Windows v2の日本価格決定
  • BlenderのRigifyでリギング
  • OpenVDB:3Dボリュームデータ処理ライブラリ
  • モバイルバージョンを終了