[Survey]Deep3D: Fully Automatic 2D-to-3D Video Conversion with Deep Convolutional Neural Networks


[Deep3D: Fully Automatic 2D-to-3D Video Conversion with Deep Convolutional Neural Networks](http://homes.cs.washington.edu/~jxie/pdf/deep3d.pdf)

この論文は、**２次元画像**から**３次元画像**を生成するものです。[ここ](https://github.com/piiswrong/deep3d)で結果とコードが見れます。
３次元画像は**3D映画**や**VR**などで必要とされています。３次元画像を生成する方法としては、「**Stereo Cameraを使用**」するものと「**2D画像から3D画像を生成**」する２つあります。Stereo Cameraを使用する方法には、**コストの問題**や**特殊な撮影（force perspective）**をするときはMulti ViewのCameraが使えないなど問題があり、その場合には2D画像から3D画像を生成する技術が代替案として必要とされます。プロによる映像の2D、3D変換は、**depth artist**による手作業のMapに頼っています。2D、3D変換は人手によるMapに頼っており、3D映像産業の発展の障害になっています。
　2D、3D変換問題は"**under constrained**"な問題で解くのに条件がたりないため、Depthは曖昧になります。さらに隠れている部分は**Inpainting**アルゴリズムで**Hullucination**しなければならないという問題もあります。
　学習によりDepthMapを生成する場合は正解データが必要になりますが、**室内**とか**一般的ではない屋外のシーン**など数が少ないと問題もあります。
　この論文ではすでに存在する**3D Stereo movie**を利用して学習を行い、**確率的なDisparity Map**を推定します。

**従来の2D、3D変換**は、２つのステップからなります。
１．左目画像からDepth Mapを推定する
２．Depth Image Based Renderingによって右目画像をRenderingする

Pixel単位で右目画像を推定すると精度がよくないので、論文では右目画像は**左目画像をshiftしてcopyしたもの**として**DIBR処理**を利用しています。従来手法とは異なり、**正確なDepth Map**を生成する仕組みはいらないし、学習のために**正確なDepth Map**も必要ない。そのかわり、**確率的なDisparity likeなMap**を推定し、そこから**DIBR処理**をつかって左目画像と結合して右目画像を生成しています。
学習中は、Modelによって生成された**Disparity likeなMap**は**本物のDisparity Map**とは直接比較せず、**水平方向のDisparity**と**inpainting処理**に使われます。

# Model Architecture
下図がArchitectureになります。**Pooling　Layer**の後に２つに分かれて**Deconvolution（Convolution transpose)** によって入力画像と同じサイズにします。その後、すべてのFeature Mapが加算されます。それをさらに**Convolution処理**を行って、得られたFeature MapのChannel方向に対して**Softmax**を出して確率にします。この**Softmax値**が確率的Disparity Mapになります。その後に左目画像と確率的Disparity Mapから右目画像を生成します。

![image](https://qiita-image-store.s3.amazonaws.com/0/100523/2c7a782e-e67b-fa8f-580e-0c89014d1072.png)

**Deconvolution**は、**Convolution**のforwardとbackwardを入れ替えたものです。**bilinear interpolation**と等しくなるように**Deconvolutional layer**を初期化すると学習が容易になることがわかったとのことです。初期化の式は下記の通りです。

![image](https://qiita-image-store.s3.amazonaws.com/0/100523/d5ea841b-c6a5-b21d-6270-5a291dcb109a.png)

# Reconstruction with Selection Layer
2D-to-3D 変換の一般的な式は下記の通りです。

![image](https://qiita-image-store.s3.amazonaws.com/0/100523/a900c135-a8f7-7b9c-fa54-a9bb8cedad66.png)

B ... 2つのカメラ間の距離
I ... 左目画像
O ... 右目画像
Y ... 右目画像(正解データ)
Z ... Depth Map
D ... Disparity Map (負の時Focus Planeより物体が手前、正の時Focus Planeより物体が奥）
f ... カメラからfocus 面までの距離

![image](https://qiita-image-store.s3.amazonaws.com/0/100523/030b336c-19a3-d815-88de-e35737ae6de0.png)

この論文では、**右目画像**は**左目画像**を**水平方向**にずらしたものいう条件を使っています。なので関係式は下記のようになります。
ここでOは右目画像で$D_{i,j}$は位置$(i,j)$のDisparity（ずれ量）です。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/4e124be9-0cdd-c9c7-77f7-467d64ad8071.png)

しかしながらこれは$D$に関して微分可能ではないので、**deep neural network**では学習できません。ネットワークでは、それぞれの画素位置でDisparityの値がdである可能性の確率値$D^d_{i,j}$を推定します。ここで左目画像をdずらしたものを$I^d_{i,j}$とします。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/1bbb6b5b-9300-500c-0970-d2edf86cbb0c.png)
右目画像$O_{i,j}$は左目画像をdずらしたもの$I^d_{i,j}$とその確率$D^d_{i,j}$をかけてそれぞれの$d$を加算したものとして表現されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/429a6692-d968-e673-2bf3-0c758d8c9c49.png)
これは$D^d_{i,j}$に関して微分可能なので、Loss functionをL1 normとすると下記のようになります。ここで$Y$は右目画像の正解データです。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/95c4dcac-17ae-d29e-280e-df1b802e3cb2.png)

映像データ$1920\times 1080$を1/4に縮小$432\times 180$にして確率的Disparity Mapを推定し、それを原画ザイズまで拡大して右目画像生成に使用します。

# Experiments
## Implementation Details
実装の詳細情報
・Network構造は**VGG16**ベース
・VGG16のParameterを初期化値として使用
・VGG16以外で使いした部分のParameterの初期値は**normal distribution**で標準偏差が0.01を使用
・**Pooling Layer**の後で枝分かれして、**Batch Normalization**して3x3の**Convolution**をして**Deconvolution**をします。
・**Deconvolution**の初期値は**bilinear upsampling**になるような値にします。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/a4a8015f-d834-2548-5fe7-9fcc2e94a0fd.png)
・２つの4096 unitの**fully connected layer**をConvolutionの後に行います。（論文は4096と書いてありますが、最後のfully connected layerは1980unitのようです。そうでないと次のReshapeで33channel 12x5のサイズにした時に余ってしまいます。）
・最後にReshapeで33channelの12x5のサイズにします。
・33channelの12x5を**Deconvolution**で入力と同じサイズにします。
・**Deconvolution**の出力を全部足します。
・画素毎に全部たしたものを**Deconvolution**で33channelにし、さらに**Convolution**します
・Convolutionで得られた結果を**Softmax**で確率にします
・Selection Layerでは-15～16までのDisparityと**確率的Disparity Map**をかけたものをたして右目画像を生成します。
　※-15～16トータル33channelと書いてありますが、これだと32channelしかない気がするのですがどういうことかな？
・mini batch size 64
・学習回数は100,000回
・learning rate初期値が0.002で20000毎に1/10
・**Weight decayなし**
・**dropout rate 0.5**で場所はfully connected layerの後

## Result
下記は性能比較結果です。
比較はMean Absolute ErrorとPSNRで行っています。
Global Disparityは、全画面で一つのDisparity値を使ったもので、値はMAEが最小の時ものです。

![image](https://qiita-image-store.s3.amazonaws.com/0/100523/9c2b0ba4-2817-cef7-535d-dab599f1e5d1.png)

下は主観評価の結果です。
主観評価は２つのアルゴリズムの結果を提示して、どちらがいいか又はわからないを選んで評価するというものです。
値は行の方に書いてあるAlgorithmの方がいいと言った割合です。
例えばDeep3Dと論文[10]のアルゴリズムでは総質問回数のうち66.08%でDeep3Dの方がいいという回答を得たということになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/eccc16a3-9638-0330-975e-219b60858044.png)

## Ablation Study
low level featureとselection layerの有り無しの性能比較の結果です。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/4b2d57ee-9912-c21d-e1ad-d80651eaa2ce.png)

lower level featureなしは、下層のConvolutional Layerからの枝分かれなしで、単純に5つのconvolutional Layerとpoolingさらに2つのfully connected layerで構成されたfeed forwardのネットワークです。
Selection layerなしは、論文に詳細が書かれていませんが、Probability Disparity Mapの部分がない場合ということだと思われます。
当然ですがすべて使ったほうが性能は良くなっています。（ただPSNRだけselection layerなしの方がいいのですが、これがどのくらいの差なのかわからないです。）

## Temporal Information
こちらは時間方向の情報を使った時の性能の向上をチェックしたものです。
時間方法の情報は、(1)単純に入力を5frameにしたものと(2)入力を1frameでかつ5 frame のoptical flowを使ったものの２つの方法で試しています。下記が結果になりますが、思ったほど性能は上がっていません。著者はもう少しネットワーク構造を変えたり、パラメータを調整したりすれば性能がでるだろうと言っています。
![image](https://qiita-image-store.s3.amazonaws.com/0/100523/1ced9a7f-be03-ccb1-a0dd-db1966280e0e.png)

# 感想
左目画像と確率的Disparity Mapをかけて足したものから右目画像を作ろという手法だが、これで隠れている部分が推定できるのか不明。
ただし、DatasetのDepthデータはkinectで取得できるような室内ばかりで屋外はほとんどない。Stereo画像を使うというのはDatasetの問題を解決できる方法の一つかと思う。