物体検出モデルSSDの派生ーPeleeモデルの実力はいかに？

# はじめに

今回は、今年（2018）の４月に発表された、物体検出モデルPeleeについて調べてみました。

# Peleeについて
Peleeの論文のタイトルは、[「Pelee: A Real-Time Object Detection System on Mobile Devices」](https://arxiv.org/pdf/1804.06882.pdf)です。

タイトルの通り、モバイル端末でのリアルタイムでの物体検出に適したモデルらしいです。

つまり、処理速度を上げつつ、モデルの大きさ（パラメータ数）を抑えたモデルらしいです。

# Peleeモデルのテクニック
PeleeモデルはDenseNetベースのモデルで、これをSSDと組み合わせたようです。

<img width="368" alt="スクリーンショット 2018-06-14 10.45.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/247972/c00a0afd-a430-e435-712f-2eaf405b2dc1.png">
[Densely Connected Convolutional Networks](https://arxiv.org/pdf/1608.06993v3.pdf)

Peleeの主なテクニックとして、以下のようなものが上げられています。

- ResBlockのconvにおける1×1カーネル

これにより、モデルの大きさを削減できる。

<img width="241" alt="スクリーンショット 2018-06-14 11.03.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/247972/e2601743-86b2-768f-9f34-fa6d26e8d0f5.png">
[Pelee: A Real-Time Object Detection System on Mobile
Devices](https://arxiv.org/pdf/1804.06882.pdf)

- Post Activation

これにより、最後の推論時にまとめて正規化・活性化できるので、処理速度が向上する。

<img width="614" alt="スクリーンショット 2018-06-14 11.13.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/247972/dec9a3d1-415b-807f-56bb-1be2891578df.png">
[Post Activation vs Pre Activation](https://deepage.net/deep_learning/2016/11/30/resnet.html)

- SSDの特徴マップで38x38を使用しない

これにより、モデルの大きさが削減でき、処理速度が向上する。

<img width="364" alt="スクリーンショット 2018-06-14 11.17.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/247972/53b2b63c-a7bb-5848-cd8d-b77696bd5609.png">
[Pelee: A Real-Time Object Detection System on Mobile
Devices](https://arxiv.org/pdf/1804.06882.pdf)

# 比較
学習済みモデルを使って、SSD（VGGベース）とPeleeのモデルの大きさと速度を比較してみたいと思います。

精度の計測は、実際に行っていないので論文の値を載せておきます。

| Method | 07+12 | 07+12+coco |
|---|---|---|
| SSD300 | 77.2	 | 81.2 |
| Pelee | 70.9 | 76.4 |

[SSDモデル](https://github.com/weiliu89/caffe/tree/ssd)と[Peleeモデル](https://github.com/Robert-JunWang/Pelee)はGitHubにCaffe形式で上げられています。

まずは、モデルの大きさが以下の通りです。

| SSD_300x300 | Pelee_304x304 |
|-------------|---------------|
| 約100M | 約20M |

SSDの方が約５倍くらい大きいようです。

次に、コマンドラインによる（CPUの仮想マシン環境下における）ベンチマークが以下の通りです。

|  | SSD_300x300 | Pelee_304x304 |
|-----|-----|-----|
| Average Forward pass | 475.895 ms | 90.4204 ms |
| Average Backward pass | 386.498 ms | 41.6736 ms. |
| Average Forward-Backward | 863.5 ms | 133.7 ms |
| Total Time | 8635 ms | 1337 ms |

Peleeの方がかなり速いようです。

ついでに、物体検出の様子をGIFにしてみました。

![SSD-Pelee.gif](https://qiita-image-store.s3.amazonaws.com/0/247972/da0d67a2-7b0f-432f-313c-8b329babe164.gif)

左がSSD、右がPeleeです。

検出を表示する閾値は、両者とも0.6以上に設定しています。

結果は、Peleeの方も結構いい感じに検出してくれているように見えます。


 





# 最後に
PeleeはSSD（VGGベース）よりも、たしかに処理速度が早く、モデルの大きさが小さいモデルでした。

論文によると精度はPeleeの方が少し低いので、Peleeは精度と速度をトレードオフしたモデルのようです。

そして、最後の最後に一言。

Caffeのインストールが難しすぎる。。。

# 参考
+ [Pelee: A Real-Time Object Detection System on Mobile Devices](https://arxiv.org/pdf/1804.06882.pdf)
+ [Densely Connected Convolutional Networks](https://arxiv.org/pdf/1608.06993v3.pdf)
+ [Residual Network(ResNet)の理解とチューニングのベストプラクティス](https://deepage.net/deep_learning/2016/11/30/resnet.html)
+ [SSD: Single Shot MultiBox Detector - GitHub](https://github.com/weiliu89/caffe/tree/ssd)
+ [Pelee: A Real-Time Object Detection System on Mobile Devices - GitHub](https://github.com/Robert-JunWang/Pelee)