RefineDet より高精度な物体検出器、M2Det を実行する

はじめに

オプティムの R&D チームで Deep な画像解析をやっている奥村です。最近の主力開発言語は Rust になりました。噂の M2Det のコード *1 が公開されたようなので試してみましょう。すでに Ubuntu の開発環境があれば 30 分ほどで試せます。GPU はあった方がいいです。

github.com

M2Det は 2018 年 11 月に登場したばかりです*2。SSD や YOLO と同じく、Single-Stage Detectors の一つです。SSD の派生系です。

arxiv.org

環境構築

Ubuntu 16.04 に conda と pip を使って環境を作りました。

$ conda create -n m2det python=3.6
$ conda activate m2det
$ conda install opencv -c conda-forge
$ pip install cython
$ pip install https://download.pytorch.org/whl/cu100/torch-1.0.1.post2-cp36-cp36m-linux_x86_64.whl
$ pip install torchvision
$ pip install tqdm
$ pip install addict
$ pip install matplotlib
$ pip install termcolor

公式の手順とは異なり、PyTorch を conda ではなく pip でインストールしています *3。PyTorch のインストールについては、CUDA のバージョンなどに応じて適宜変更する必要があります。

次はコードをチェックアウトして、NMS や COCO データセットを扱うための C 拡張をビルドします。ここで Cython が必要になります。物体検出系ではおなじみの手順ですね。

$ git clone https://github.com/qijiezhao/M2Det
$ cd M2Det
$ sh make.sh

次は重みをダウンロードします。Google Drive から Backbone が VGG-16、解像度が 512 のものがダウンロードできるのでM2Det/weights に配置してください。507MB 程度です。

デモの実行とその速度

以下を実行すると imgs ディレクトリにある JPEG 画像が順番に推論されます。

$ python demo.py -c=configs/m2det512_vgg.py -m=weights/m2det512_vgg.pth --show

推論時間を計測 *4 するコードを追加してみたところ、GTX 1080 Ti では 80 ~ 90ms かかるようでした。およそ 12fps ですね。NMS は Soft-NMS にも対応しており 10ms 程度かかっているようです。前処理や後処理をのぞき、CPU からデータを GPU に送って DNN を回して GPU からCPU にデータを送るまでの時間だと 56ms 程度のようです。論文によると、TITAN X で同じ構成を実行すると 18.0fps、推論時間は 55ms 程度とありましたので、まぁこんなものかもしれません。

考察

精度と速度のバランスについて見てみましょう。以下に MS COCO 2014 test-dev set での精度 (mAP) と速度を抜粋します。

Model Date Backbone Size FPS mAP
SSD 2015/12 VGG-16 512x512 22.0 28.8
RefineDet 2017/11 VGG-16 512x512 22.3 33.0
YOLOv3 2018/04 DarkNet-53 608x608 19.8 33.0
M2Det 2018/11 VGG-16 512x512 18.0 37.6

過去に紹介した RefineDet から、さらに 4.6 ポイント mAP が向上しています。

tech-blog.optim.co.jp

この向上を直感的に知ることは難しいのですが、MS COCO データセットでは 41% が小さい物体、34% が中くらいの物体、24% が大きい物体という構成になっているので、検出対象が小さいほど効果を体感できると思います。逆に、検出対象が大きいほど効果を体感しづらいと思います。とはいえ、Single-Stage Detectors なので、小さすぎる物体は検出できません。デモの実行したときに、それが分かる画像がいくつかありますのでぜひ確認してみてください。

M2Det の詳細については論文を読むのが一番だと思いますが、日本語解説記事もいくつかあるので参考になると思います。

qiita.com note.mu

まとめ

M2Det のコードを実行するまでの手順をまとめ、簡単に考察してみました。今後、RefineDet と同じように TensorRT で動くように調整して、両者をベンチマークしてみたいと思います。その中で PyTorch の訓練済みモデルをうまく ONNX に変換するテクニックも紹介できればと思います。

オプティムでは、こうした技術に興味がある・作ってみたい、というエンジニアを募集しています。興味のある方は、こちらをご覧ください。

www.optim.co.jp

*1:PyTorch で実装されています。

*2:どうでもいいですが、M2Det を 2017 年 11 月登場の MegDet として誤認識していたため「ようやく公開か」と思ってしまいました。

*3:conda でインストールしようとすると cudatoolkit もインストールしようとするので pip にしました。

*4:画像を cv2.imread で読み込んでから、検出結果を print するところまでを計測しました。