Tutorial実装で確認するTensorFlow④(Pix2Pixの概要と実装)|DeepLearningの実装 #5

f:id:lib-arts:20190602114525p:plain

ライブラリの使い方を中心に取り扱った記事は深い考察になりづらいのであまり書きたくないのですが、DeepLearning系は仕様の変化が早過ぎるので、DeepLearningの実装に関しては諸々のドキュメントのまとめを備忘録も兼ねてシリーズ化していければと考えています。
#1ではKerasのチュートリアルを元にMLP(MultiLayer Perceptron)やCNNの動作確認、#2ではTensorFlowのチュートリアルを元に簡単な動作確認、#3、#4ではMobileNetを用いた画像分類(image classification)と同じモデルを用いた転移学習について行いました。

Kerasチュートリアルに学ぶ簡単な実装|DeepLearningの実装 #1 - lib-arts’s diary

Tutorial実装で確認するTensorFlow①(Tutorialsの概要とMNIST問題のサンプル実装の確認)|DeepLearningの実装 #2 - lib-arts’s diary

Tutorial実装で確認するTensorFlow②(MobileNetによる画像分類とTensorFlow Hub)|DeepLearningの実装 #3 - lib-arts’s diary

#5では画像変換に関しての研究であるPix2Pixについて取り扱います。
以下目次になります。
1. Pix2Pixの概要
2. Tutorialコードの実行&実装の確認
3. まとめ


1. Pix2Pixの概要
1節ではPix2Pix(Image-to-Image Translation with Conditional Adversarial Networks)の概要について取り扱います。

[1611.07004] Image-to-Image Translation with Conditional Adversarial Networks
基本的には上記のオリジナル論文を参照します。
まず、タイトルから見ていくと前半の"Image-to-Image Translation"とあるので、これは画像変換を意味していると考えることができます。またタイトルの後半の"with Conditional Adversarial Networks"は、Conditional GANを表しています。

[1411.1784] Conditional Generative Adversarial Nets
Conditional GANの説明箇所では参照として、上記などの論文が挙げられています。とにかく大枠の目的として意識すると良いのが、敵対的な生成ネットワークを用いて画像の変換を試みているということです。

f:id:lib-arts:20190602120225p:plain
上記は論文のトップビューの画像ですが、航空写真を白地図に変換したり、白黒画像をカラー画像に変換したり、イラストを写真に変換したりなどの例を表しています。

f:id:lib-arts:20190602122153p:plain
Conditional GANについては論文のFigure.2で図示されています。オリジナルのGANではGeneratorのGはなんらかの潜在変数から画像を生成していたのに対し、Pix2Pixでは変換前の画像を入力します。画像を入力として与えることをConditional(条件付きの)と表しています。またネットワーク構造としてはオリジナルのGANではup sampling(画像を元の解像度に戻す)のみを行うのに対して、Conditional GANをベースとするPix2Pixではdown samplingを行なってからup samplingを行います。

f:id:lib-arts:20190602122209p:plain
この際の処理概要は上図のようになるのですが、二つパターンが描かれており、左のEncoder-decoderのパターンと右のU-Netのパターンの二つがあります。3.2.1の"Generator with skips"に、"To give the generator a means to circumvent the bottle-neck for information like this, we add skip connections, following the general shape of a 'U-Net'[50]"とあるので、U-Netのようにショートカットを加えているというのがここからわかります。
上記で大体のPix2Pixの概要について把握できたので、2節ではTutorialコードの実行と、実装の中身の把握を行なっていきます。

 

2. Tutorialコードの実行&実装の確認
1節ではPix2Pixの概要について把握を行いました。2節ではそれを受けてコードの実行と実装の確認を行なっていきます。

docs/pix2pix.ipynb at master · tensorflow/docs · GitHub
実行するコードとしては上記を用います。
まずデータセットとしては、建物の外観のデータセットである、"facades.tar.gz"をダウンロードしています。

f:id:lib-arts:20190602114525p:plain

データセットとしては上記のようになっており、左の配置の図から右のリアルの画像への変換を試みていきます。
まず、大枠のソースの確認として気になるのがGeneratorとDiscriminatorの実装です。まずGeneratorですが下記のように実装されています。

f:id:lib-arts:20190602160337p:plain
(中略)

f:id:lib-arts:20190602160412p:plain

downsample->upsampleの流れで処理が行われています。
次にDiscriminatorにつきましては下記のように実装されています。

f:id:lib-arts:20190602160540p:plain
上記ではdownsample->Conv2Dの流れで計算がされています。downsampleはConv2Dを元に別途作成されており、TensorFlowの実装ではそれぞれのDeepLearningのモデルに合わせてモジュールをブロック化しておくと記述量が少ないのでこのような書き方はよく見る印象です。

f:id:lib-arts:20190602160558p:plain
また学習に関しては、上記で実装されています。train->train_stepの流れで関数の呼び出しをしており、train_stepの中のgradientの周辺でパラメータのアップデートを行ってくれています。
学習の実行結果としては下記のようになります。

f:id:lib-arts:20190603160747p:plain
また、構築したモデルで画像を変換すると下記のようになります。

f:id:lib-arts:20190603160813p:plain
概ねうまく変換できているということを読み取ることができます。


3. まとめ
#5ではPix2Pixについての概要の把握とサンプルコードの実行と把握について行いました。
#6でも引き続きTensorFlowチュートリアルから題材を選んで実行していければと思います。