[Survey]DeepEdge: A Multi-Scale Bifurcated Deep Network for Top-Down Contour Detection

[DeepEdge: A Multi-Scale Bifurcated Deep Network for Top-Down Contour Detection](http://arxiv.org/pdf/1412.1123.pdf)

この論文は、**Contour Detection**にCNNを使った論文です。

**Contour Detection**は物体の輪郭を抽出するというものです。
従来はContour Detectionは**low level**なtaskで、object detectionのような**higher level**なtaskに使われるものと考えられていました。しかし、もしObjectの位置がわかればContourの推定は簡単になります。
　この論文ではこの考えを元に、従来のlow levelのcontourからobjectを検出するというプロセスを逆にしてobject detectionの結果を手がかりにContourを推定するということをコンセプトにしています。具体的には、Object Detection用のCNNの中間Layerの値を入力にContour Detectionを行います。

# Architecture
![範囲を選択_177.png](https://qiita-image-store.s3.amazonaws.com/0/100523/d7944069-6bff-383d-81cc-524619714c52.png)

・Edge候補選択に**Canny**を使用
・CNNを使用してFeature抽出
使用したCNNは[Krizhevskyら](http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)のNetworkです。論文ではこれを**KNet**と呼んでいます。KNetは、**5 convolutional layer**と**3 fully  connected layer**から構成されます。Parameter数は、60 million。

・KNetの入力サイズに合わせるためにPatchをResize
・KNetの最初の5 convolutional layerだけ使用
理由としては、その後段のFully Connected Layerは位置の情報がなくなってしまうためContour Detectionの用途には向かないためです。

・各Layerから切り出してくるサイズは、first layerから、7x7, 5x5, 3x3, 3x3, 3x3のサイズ
・各Layerから取り出したFeatureを**max pooling**, **average pooling**, **center pooling**で各Filter毎に３つの値にする
・得られてFeatureを２つのNetwork branchに入れて学習する
　１． Contourかどうか推定するbranch
　２． Contourとした人の割合を推定するbranch
    BSDS500データ・セットは、ひとつの画像に対して複数の人が正解データとなるContourをannotationしている。正解データをつける人によってContourかどうかの判断が大きく異なるため、Contourとした人の割合を推定する
・Hidden Layerの数は、**1024**と**512**
・Multi Scale対応として、異なるサイズのPatch(64x64, 128x128, 196x196, Full size)を切り出し、KNetのInputサイズ（227x227）にResizeしてFeatureを抽出する。
![範囲を選択_179.png](https://qiita-image-store.s3.amazonaws.com/0/100523/70368163-2a44-ebb6-0874-ca34aba29929.png)


**下記はKNetの各Layerの反応**
![範囲を選択_178.png](https://qiita-image-store.s3.amazonaws.com/0/100523/bacf638f-d796-7339-f9e9-abd1d28c3dac.png)

# Training
・Datasetは**BSDS500**
・Training Data数 **80,000** (Positive 40,000, Negative 40,000)
・Learning rate 0.1
・Dropout 0.5
・Batch Size 100
・Epoch 50
 ・最初の25epochは、OriginalのTraining Dataを使用して各branch別々に学習
 ・残りの25epochは、各branchでfalse negative（誤検出）だったSampleとNegative SampleからRandomに選んだSampleを使ってOriginalのTraining Dataを拡張して学習する

# Experiment
## Comparison with Other Methods
性能は最新手法と同等かそれ以上
Low Recallの時にPrecisionが１になっている。（誤検出が無い）

![範囲を選択_180.png](https://qiita-image-store.s3.amazonaws.com/0/100523/bbb1b6ff-bd66-eebe-f8e0-8056187fac78.png)

![範囲を選択_185.png](https://qiita-image-store.s3.amazonaws.com/0/100523/45b44a8e-634a-9648-b6bf-417a934cea71.png)

## Single Scale versus Multiple Scales
Single ScaleとMulti Scaleの比較
Multi Scaleにしたほうが性能がよくなっている
![範囲を選択_181.png](https://qiita-image-store.s3.amazonaws.com/0/100523/c625b7d4-222a-47f2-bd0e-2d045f177fd9.png)

## Advantages of Higher-Level Features
・各Layerだけの結果と全体を使った時の比較
・CNNのHigher LevelのFeatureを使ったほうがいいかのチェックするために行った
・各Layerの結果では4th layerの性能が一番良い
・全部使うと更に良くなっている

![範囲を選択_182.png](https://qiita-image-store.s3.amazonaws.com/0/100523/be429f7f-cf3c-3b94-537b-06263f32dce6.png)

## Pooling Scheme
・各Poolingの性能比較
・Centerがそこそこ性能がよい。全部使ったほうが更に良くなっている

![範囲を選択_183.png](https://qiita-image-store.s3.amazonaws.com/0/100523/ff8c9a30-80d1-8bdb-832e-b319a5533ef7.png)

## Bifurcation and Training Objective
・２つのBranchの性能比較
・Classification(Contourかどうか推定）はF-Scoreが高い
・Regression（Contourとする人の割合の推定）は、APが高い
・２つ使うと性能がよくなっている

![範囲を選択_184.png](https://qiita-image-store.s3.amazonaws.com/0/100523/7111374c-f92a-5795-7375-f6130ed52f87.png)

## Qualitative Results
・検出結果の主観評価
・Raw DeepEdgeはそのままの値
・Thresholded DeepEdgeは、0.5でしきい値処理した結果

![範囲を選択_186.png](https://qiita-image-store.s3.amazonaws.com/0/100523/2d300d66-ce20-3633-1d91-3663dedd970b.png)

## Computational Cost
・**約５分**
・各Featureを抽出するためにKNetを、**60K回**（15K回/scale)実行しないと行けない
・改善方法としては、４回（1回/scale)でFeatureを抽出してInterpolationするという方法がある

# 最後に
5分は長い。Featureを拡大するという方法も書いてあるが物体検出ではいいが、位置精度が要求されるContour Detectionではどうか少し疑問が残る。