[Survey]Predicting Depth, Surface Normals and Semantic Labels with a Common Multi-Scale Convolutional Architecture

この[論文](http://arxiv.org/pdf/1411.4734v4.pdf)は、**depth estimation**, **surface normal estimation**, **semantic labeling**の３つの問題を一つのmultiscale convolutional networkで扱うという論文です。
この論文自体は、これの前の論文["Depth Map Prediction from a Single Image using a Multi-Scale Deep Network"](http://www.cs.nyu.edu/~deigen/depth/depth_nips14.pdf)を拡張したものになっています。

Surface normal estimationは、物体の表面の法線方向を推定する問題です。(normalは垂直のという意味があるらしいです）
![範囲を選択_003.png](https://qiita-image-store.s3.amazonaws.com/0/100523/80257599-17ea-729c-19d0-e2f0b6f391bd.png)

Semantic Labelingは、意味的に同じ物体表面をSegmentationしてLabelingするというものです。
![範囲を選択_002.png](https://qiita-image-store.s3.amazonaws.com/0/100523/feff7ba6-71c9-affd-c32a-50ae2994489f.png)

# Architecture
![範囲を選択_131.png](https://qiita-image-store.s3.amazonaws.com/0/100523/c3114a32-969d-7b93-0631-f5e763126d50.png)
![範囲を選択_132.png](https://qiita-image-store.s3.amazonaws.com/0/100523/d42ebb49-94d2-f7e5-ba9a-830a961b737c.png)

・depth prediction, surface normal estimation , semantic labelingを共通の一つのアーキテクチャで取り扱う
・Multi Scale Approachでpixel-wiseなMapを生成する
・３map出力の速度は、リアルタイム（〜30Hz）
・superpixelやcontourなどは使用しない
・前回からの拡張は、featureの抽出とRefineのために３ scaleのCNNを使用
・画像全体をみるcoarse scaleは、とくにdepthとnormalの推定で重要な役割



## Model Architecture

### Scale1: Full Image View
・粗く画面全体を推定するためのNetwork
・2 fully connected layer
・最終のfully connected layerの出力を入力の1/16のサイズ、 64 featureにreshapeして4倍に線形upscaleして1/4にする
・初期値としてAlexNetとVGGを使った

### Scale2: Predictions
・Scale2の役割は、精細だけど狭い範囲の画像とCoarse Networkの出力を用いて中解像度で推定すること
・出力サイズは74x55で、channel数はタスク依存とした

### Scale3: Higher Resolution
・Scale3の役割は、推定MapをRefinementして、高解像度のMapを出力すること
・最終Layerの出力は入力画像サイズの1/2

## Tasks

Task毎に異なるloss functionを使用します。

### Depth

![範囲を選択_133.png](https://qiita-image-store.s3.amazonaws.com/0/100523/ffbc6b14-0fc0-2a8b-296a-bfc19be58644.png)

・$d=D-D^*$
・基本的には前の論文と同じ
・$\nabla_xd_i$と$\nabla_yd_j$の項を追加
・追加する前の式がscale invariant difference項
・追加したgradientの項は値が近くなるだけでなく、局所的な構造も似せる効果もある。
　（差分の勾配が小さくなるので、正解データと突然かけ離れたりしないで差が一定に保たれる効果があると言うことだと思われる）

### Surface Normals

![範囲を選択_134.png](https://qiita-image-store.s3.amazonaws.com/0/100523/6f58b8f7-02a5-f122-d275-e9818ae82df4.png)

・ surface normalを推定するために、Depthでは1 channelだったけどsurface normalではｘ，ｙ，ｚの3 channelにした
・ surface normalはl2ノルムで正規化する
・ surface normalは法線ベクトルなので、ベクトルの類似度を計算するために正解データとの内積をとっている。

### Semantic Label

![範囲を選択_135.png](https://qiita-image-store.s3.amazonaws.com/0/100523/097d8b84-cd97-8ac7-7d54-4e4d08ec4f5a.png)

・ 画素のclass labelを推定する
・ その画素がどのLabelかをsoftmaxで出す（object recognitionと同じ、objectがlabelになっただけ）
・ softmaxで出した確率を使ってcross entropyをだしてlossにする
・ 入力には、NYUDepth RGB-D Datasetをlabelingするときは、groundtruthのdepthとnormalをRGBの他に使った
・ RGB,depth, normalそれぞれに32x9x9のfilterでconvolutionし、出てきた３つの結果を結合して、次のLayerの入力とした。

## Training

Traningは2段階で実施：
1. scale1, scale2の両方をトレーニング
2. １，２のパラメーターを固定して、scale3をトレーニング

・ここで、scale3はscale2に比べて４倍の画素数なので、トレーニングが大変だから、画像全体ではなく、74x55のサイズでRandom Cropする
・scale1, scale2を画像全体でforward propagationして、出力をupsamplingして、そこからcropしたものをScale3の入力とする。この時原画像も同じ場所をcropする。
・３タスクは同じ初期値、learning rateを使用。
設定の違いは
(i) normal taskのlearning rateはdepth, labelの10倍
(ii) 1.6. 1.7layerのlearning rateはdepth/normalで0.1, 0.1, semantic labelは0.1と0.01
(iii)１.6layerのdropoutはdepth/normal 0.5, semantic label 0.8

・Scale1のconvolutional layerはImageNetの値で初期化、full connected layerとScale2,Scale3のすべてのlayerはランダム
・batch sizeはalexNet初期化したモデルが32 ,VGG で初期化したモデルがメモリ制限のため16とした
・learning rateは2M step後に1/10,にして、追加で0.5M step学習した

### 5.2 Data Augmentation
・random scaling
・in-plane rotation
・translation
・color 
・flips
・contrasts

## Experiments
### Depth
![範囲を選択_136.png](https://qiita-image-store.s3.amazonaws.com/0/100523/404f8021-b16d-c186-5c4e-b55b3dd8a37d.png)

![範囲を選択_137.png](https://qiita-image-store.s3.amazonaws.com/0/100523/543a6ede-87cc-8679-68ad-da4d3e0e6071.png)
### Surface Normals
![範囲を選択_138.png](https://qiita-image-store.s3.amazonaws.com/0/100523/84f5de51-0c76-c623-cf72-160b40f5a3b9.png)

### Semantic Labels
![範囲を選択_139.png](https://qiita-image-store.s3.amazonaws.com/0/100523/57248895-dba2-9b8b-4e81-de86e33294b0.png)
Semantic Labelは、４、１３、４０Labelで評価した

### Sift Flow
![範囲を選択_140.png](https://qiita-image-store.s3.amazonaws.com/0/100523/d7f90a19-b257-b982-1b4c-70f30cb91560.png)
Sift Flow Datasetで試した結果

### Pascal VOC
![範囲を選択_141.png](https://qiita-image-store.s3.amazonaws.com/0/100523/f2b1cdd9-8871-4f3a-5586-776342a9fe3c.png)
Pascal VOC Datasetで試した結果

### Contributions of Scales
![範囲を選択_142.png](https://qiita-image-store.s3.amazonaws.com/0/100523/b181cd29-27a6-7694-2559-bbb1b8e2549b.png)
Single ScaleとMulti Scaleで性能比較
MutlScaleの方が良くなっている

### Effect of Depth and Normals Inputs
![範囲を選択_143.png](https://qiita-image-store.s3.amazonaws.com/0/100523/4faf982c-f9c0-5813-01d5-731edda44147.png)
DepthとNormalsの推定値がSemantic Labelにどのくらい影響があるか調べた
DepthとNormalが推定値の時と、正解値を使った時で性能を比較

![範囲を選択_144.png](https://qiita-image-store.s3.amazonaws.com/0/100523/23f79880-0de2-8738-4821-4a98dfb87b17.png)
![範囲を選択_145.png](https://qiita-image-store.s3.amazonaws.com/0/100523/f6d6f009-3e21-8a94-aa05-e3545414fdf6.png)