[Survey]Inside-Outside Net: Detecting Objects in Context with Skip Pooling and Recurrent Neural Networks


[MS COCO Detection Challenge 2015](http://mscoco.org/dataset/#detections-challenge2015) で3位かつ、Best Student Entryだった論文です。

![範囲を選択_100.png](https://qiita-image-store.s3.amazonaws.com/0/100523/cdd98f0c-e2af-4e6f-af18-d2340deb163f.png)


単純にいうと、**ROI**の内側の情報だけでは、うまくいかないので外側の情報も使おうというもので、その時に外側の情報をどうやって取り込むのかあります。彼らがやったのは、**Contextual Information**という周辺情報のFeature Mapを**spatial RNN**から作って認識に使うことです。


# Architecture

## Inside-Outside Net(ION)

下図は**ION**の全体イメージです。

![範囲を選択_081.png](https://qiita-image-store.s3.amazonaws.com/0/100523/084295fc-3d45-2560-4e06-524bfe681d07.png)

ネットワークは、**Convolutional Layer**がconv1, conv2, conv3 ... とあって、そこから２つの**spatial RNN**が来て、最終的に**context features**につながっています。得られた各LayerのFeatureを結合（**Skip layer connection**)して、Object Detectionを行うという流れになっています。

## Pooling from multiple layers(Skip layer connection)

**Fast R-CNN**, **Faster R_CNN**, **SPPnet**は、最後の**Convolutional Layer**から全部Poolingしています。
![範囲を選択_082.png](https://qiita-image-store.s3.amazonaws.com/0/100523/e359acc9-b242-f6a2-94cd-3386738a82fb.png)


これを**ION**ではMultiple Layerに拡張しました。各Convolutional LayerごとにPooling Layerを用意し、その出力を結合し、1x1 Convolutionで次元を削減しています。
![範囲を選択_084.png](https://qiita-image-store.s3.amazonaws.com/0/100523/a87118da-2fd6-7b9b-6cd4-c3729e1ecfd5.png)

この時に各Layerの出力の強度がことなるので、各Layerごとに**L2 normalize**し、さらに**rescaling**しています。

![範囲を選択_085.png](https://qiita-image-store.s3.amazonaws.com/0/100523/a2a404eb-d8f7-c881-c317-18a08b3522a3.png)

## Context features with IRNNs(spatial RNN)

**RNN**を使う目的は、ROIの外側のデータを使って物体検出したいということです。その時に、自分の近くにあるデータを時系列のデータとみたててRNNに突っ込んでいます。RNNは、もともと**Hidden Layer**が**Feedback Loop**になっているネットワークのことです。
RNNには、以下のような種類があり、今回は**many to many**のPatternを使っています。

![範囲を選択_086.png](https://qiita-image-store.s3.amazonaws.com/0/100523/c2db5f5c-1491-c054-3d30-6ec6f2574842.png)

データを時系列データとみたてる場合に、どの順番で入力するかというのが問題になりますが、ここでは水平方向ｘ２、と垂直方向ｘ２の４方向からデータを入力しています。

RNNの説明
![範囲を選択_088.png](https://qiita-image-store.s3.amazonaws.com/0/100523/2f8dd59d-f9ee-24dc-028f-bcb14a668147.png)

４方向の説明
![範囲を選択_089.png](https://qiita-image-store.s3.amazonaws.com/0/100523/61f58d2a-bc3b-ced4-5492-4e1b0d3d5ebc.png)

# Results
以下結果です。

Dataset: PASCAL, VOC2007, VOC2012, MS COCO

## PASCAL VOC 2007
![範囲を選択_090.png](https://qiita-image-store.s3.amazonaws.com/0/100523/bd9c814d-0a6f-7cc7-6723-2321b8f60692.png)

IONのmAPの結果は、76.5%で、構造に少し手を入れると79.2%を達成した。

## PASCAL VOC2012
![範囲を選択_091.png](https://qiita-image-store.s3.amazonaws.com/0/100523/47aa00e1-c14b-31e6-dd9b-31c327d1e7a7.png)

Datasetが少しむずかしくなっているので、mAPは、７６．４％

## MS COCO
![範囲を選択_092.png](https://qiita-image-store.s3.amazonaws.com/0/100523/092a324b-8785-11d4-9fb0-9bf1d9b97a52.png)

APとARは、7.0%, 10.7%

# Design evaluation
## Poolingに関する性能評価
![範囲を選択_094.png](https://qiita-image-store.s3.amazonaws.com/0/100523/5414d5ab-e7ca-6757-8666-ecc5f1c8eeb0.png)

Conv3からConv5が一番良い

## Scalingに関する評価
![範囲を選択_095.png](https://qiita-image-store.s3.amazonaws.com/0/100523/e55567b7-645b-32be-84b0-535b0b791811.png)
rescalingのscaleを固定の時の学習で決める時の比較
どちらも同じくらいの性能

## RNNの性能評価
RNNを使った時と使わなかった時の比較

比較対象は下の通り
![範囲を選択_099.png](https://qiita-image-store.s3.amazonaws.com/0/100523/4614a624-408c-765d-e4e1-db5e7193ea90.png)

![範囲を選択_096.png](https://qiita-image-store.s3.amazonaws.com/0/100523/b2cc3338-6d6f-810c-96e6-e7c1cacebef4.png)
2x stacked 4-dir IRNNが一番性能が良かった

IRRNの個数による比較
![範囲を選択_097.png](https://qiita-image-store.s3.amazonaws.com/0/100523/c2733254-118a-1f62-e042-02c4d2b06471.png)

RNNのHidden Unit数による比較
![範囲を選択_098.png](https://qiita-image-store.s3.amazonaws.com/0/100523/cbd77ba4-5b6d-317a-72be-d588cb6b45ce.png)