はじめに
先日以下の記事を書きました。
で、著者らによる実装がGitHubで公開されたので動かしてみると共にSSDとざっくり比較しました。結論を言ってしまうと、今回試した範囲ではM2DetはSSDよりも遅かったですが、特に小さな物体に対する検出精度がかなり高いです。
実験環境
今回はASUSのゲーム向けラップトップROG ZEPHYRUSGX 501GIを使いました。GTX 1080を積んでるにも関わらずまぁ持ち歩けなくはないというレベルのサイズを実現している優秀なマシンです。スペックはざっとこんな感じです。
- CPU: Intel Core i7-8750H @ 2.2GHz
- MEM: 24GB
- GPU: NVIDIA GeForce GTX 1080 Max-Q
- OS: Ubuntu 16.04 LTS
実装
M2Det
冒頭にも書いたように著者らの実装をそのまま使っています。PyTorchで実装されており、推奨ヴァージョンは0.4.1ですが最新の1.0でも問題なく動きました。
基本的にはREADME通りにやれば動くと思います。今のところ公開されている学習済みのWeightは画像サイズが512×512、BackboneがVGG-16のものです。
SSD
比較用のSSDには一番有名な以下の実装を使いました。
こちらもREADME通りで問題ありません。M2Detと揃えるため、同じく画像サイズが512×512、BackboneがVGG-16の学習済みWeightを使いました。
結果
近所で適当に撮影した映像(640×480)で検出性能を比較しました。まず、SSDです。右下にフレームレートを出してます(サムネールクリックでYouTubeに飛びます)。
次に、M2Detです。
オリジナルのソースコードそのままなので、両手法でボックスの色が全然違っており、かつ大変見づらくてすいません。まずフレームレートですが、SSDが50fps近く出ているのに対し、M2Detは約10fpsとだいぶ遅いです。M2Detの論文で著者らが実際に自分達で評価しているもので今回の条件に近いのは以下の結果です(論文のFigure 5参照)。
- GPU: NVIDIA Titan X PASCAL
- M2Det512-vgg: mAP 37.6% @ 55.5ms (18 fps)
- SSD513-ResNet101: mAP 31.0% @ 37ms (27 fps)
Titan XとGTX 1080の性能差を考えると、M2Detについてはまぁこんなもんかという感じですね。しかしSSDは今回のやつは妙に早いな… 今回のはVGG-16なのでResNet-101よりもさらに遅いはずなんだが… まぁ、速度については、PyTorchとTensorflowの違いとか、とにかくベースが全然違うのであまり正確な比較ではないですね。参考程度。
次に、検出精度ですが、見た目の印象ではM2Detの圧勝という感じ。特に信号なんかはかなり小さく写ってますが、そこそこ検出できてます。あと、歩行者の検出精度がすごい。オクルージョンでほとんど頭しか見えないような場合でも検出できてる。これは驚きました。他にも途中にバスが通りますが、窓越しに上半身だけ見えてるドライバーも検出できてます。
続いてもうちょっとエクストリームな状況で試してみました。まずSSD。
続いてM2Det。
特にSSDの方、歩行者のボックスの枠が大変見づらくて恐縮ですが、こちらも精度はM2Detの方が圧勝しているのがわかるかと思います。交差点の向こう側にいる人すら検出できてますね。あと、歩行者が持ってるバッグやスーツケースも検出できてる。やはり小さな物体にかなり強いみたいです。
まとめ
M2Detのオリジナル実装が公開されたので、SSDと比較してみました。どちらも実装のベースが異なっているので厳密な比較ではないのですが、速度ならばSSD、精度ならばM2Detという結果になりました。特に小さい物体に対するM2Detの検出精度は驚異的です。
おまけ
公開されたM2Detのデモは静止画入力オンリーでしたが、ウェブカメラからの入力に対してリアルタイムに検出結果を見れるように機能を追加しました。以下が機能追加済みのコードですので、ご興味ある方はREADMEを参考に試してみてください。