[Survey]Depth Map Prediction from a Single Image using a Multi-Scale Deep Network

**Single Image**から**Depth Map**を推定するという[論文](http://www.cs.nyu.edu/~deigen/depth/depth_nips14.pdf)
この後更に改良したバージョンの[論文](http://arxiv.org/pdf/1411.4734v4.pdf)が出ています。

Depth Estimationはシーンの幾何学的な理解のために重要です。**Stereo Image**からのDepth Estimationに比べてSingle ImageからのDepth Estimationは少ないです。Single ImageからのDepth Estimationでは、Depthの手がかりとなる、**line angle**, **perspective**, **object size**, **image position**, **atmospheric effect**を使う必要があります。GlobalなSceneではこのような関係は必要になるかもしれないけれど、LocalなSceneではStereoで十分です。
　Sinｇle ImageからのDepth Estimationは、**ill pose問題**なので、与えられたImageのDepthは無限に可能性が存在します。
例えば、Scaleの問題では、実際の部屋なのかdoll houseなのかとか、家具でも様々なサイズがあります。
　彼らは、実際に使用するApplicationが**Postprocessing**で**Rescaling**しやすいように、空間の相対関係にFocusして、**scale dependent errorｓ**に加えて、**scale invariant errors**も使ってこの問題に対処しました。
　Depth Estimationには、**Global**なScene情報を推定するNetworkと、**Local**情報を使ってRefinementするNetworkの２つのNeural Networkを使用ししています。

# Approach
Depth EstimationのNetworkはGlobal Coarse-Scale NetworkとLocal Fine Scale Networkの２つのネットワークで構成されています。

![範囲を選択_122.png](https://qiita-image-store.s3.amazonaws.com/0/100523/095b2fb7-beb5-188a-c3cc-d91c1b6c640a.png)

## Global Coarse Scale Network
Global Coarse Scale Networkでは、SceneのGlobalな情報を使って画面全体のDepth構造を推定します。Network途中のMax poolingで周辺の情報を結合して、最後のFully connected layerで画像全体の情報を使っています。

HiddenLayerでは layer7の出力以外はReLUを使っています。Dropoutをｌayer６で使っています。
Randomでもそれほど大きな差ではないけど、初期値はImageNetのDatasetでPretrainingしたものを使用しています。

## Local Fine Scale Network
Global Coarse Scale Networkで推定した結果をLocal Fine Scale NetworkでRefinementします。
入力をstrideとmax poolingで1/4したFeature MapとGlobal Coarse Scale Netowrkの出力を結合して、以降はサイズが小さくならないようにConvolutionだけを行っています。最終的には入力画像の1/4のサイズ(74x55)のDepth Mapが推定されます。
activate function にはReLUを使っています。最終LayerだけLinearです。

## Scale Invariant Error
英語が何言っているかわからなかったが、この式は推定値と正解値の差の平均を基準にしているようです。
推定値と正解値の差の平均と同じだけ対象位置の推定値と正解値の差があれば０になります。

![範囲を選択_123.png](https://qiita-image-store.s3.amazonaws.com/0/100523/8d09373a-2087-7609-a62a-a7b83111518f.png)
![範囲を選択_124.png](https://qiita-image-store.s3.amazonaws.com/0/100523/bb42ef19-18fb-c602-aec4-9432920fa117.png)
![範囲を選択_125.png](https://qiita-image-store.s3.amazonaws.com/0/100523/6b207b7f-e60e-f5fa-04a6-ef759d0c80de.png)
![範囲を選択_126.png](https://qiita-image-store.s3.amazonaws.com/0/100523/b3634b51-edc2-9a06-b0ed-72684e059a2a.png)

## Training Loss
Loss functionは下記の通り。$\lambda\in [0,1]$で$\lambda=0$だとL2 Normで$\lambda=1$だとscale-invariant errorになる。
$\lambda=0.5$にした。
正解データには、特にオブジェクト境界、WindowやSpecular表面でDepth Dataが無い場所がある。データが無い場所は使わないようにしてnを変えた。

![範囲を選択_127.png](https://qiita-image-store.s3.amazonaws.com/0/100523/8af4aab0-e070-fbd9-1184-6212b5a47f03.png)

## Data Augmentation
・Scale: $s\in[1,1.5]$
・Rotation: $r\in[-5,5]$degrees
・Translation: Random cropping
・Color:random RGB x c   $c\in[0.8,1.2]^3$
・Flip: 50% horizontally flipping

※Input画像をScalingするとDepthと合わなくなるので1/s倍した

＃ Experiments & Result
## NYU Depth
・464 indoor scenes
 Training:249 scene, Test: 215 scene
・Training Set 120K, Test Set 694
・Batch Size 32
・Input Imageは640x480から320x240にDownsampling
・Coarse Networkを最初に学習して、Coarseを固定してFine Nextworkを学習
・Learning Rate: Coarse:0.001 (conv1-5), 0.1 (layer6-7), fine: 0.01
![範囲を選択_128.png](https://qiita-image-store.s3.amazonaws.com/0/100523/645a7a9e-8ec6-13ee-247c-5188d334d009.png)
全てにおいて提案手法が上回っている。

## KITTI
・56scenes中Trainingに28scene,Testに28scene
・Image Sizeは1224x368から半分にDownsampling
・800images/scene 止まっているshotは除いた
![範囲を選択_129.png](https://qiita-image-store.s3.amazonaws.com/0/100523/428cdc5a-cd07-2133-735b-3d79315feec9.png)
全てにおいて提案手法が上回っている。

NYUDepth 左から、原画、Coarse,Fine,GroundTruth、KITTI上から原画、Coarse,Fine,GroundTruth
![範囲を選択_130.png](https://qiita-image-store.s3.amazonaws.com/0/100523/ec7304dc-60a7-fa2d-68f1-34f356512539.png)