はじめに
オプティムの R&D チームで Deep な画像解析をやっている奥村です。最近の主力開発言語は Rust になりました。噂の M2Det のコード *1 が公開されたようなので試してみましょう。すでに Ubuntu の開発環境があれば 30 分ほどで試せます。GPU はあった方がいいです。
M2Det は 2018 年 11 月に登場したばかりです*2。SSD や YOLO と同じく、Single-Stage Detectors の一つです。SSD の派生系です。
環境構築
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 が向上しています。
この向上を直感的に知ることは難しいのですが、MS COCO データセットでは 41% が小さい物体、34% が中くらいの物体、24% が大きい物体という構成になっているので、検出対象が小さいほど効果を体感できると思います。逆に、検出対象が大きいほど効果を体感しづらいと思います。とはいえ、Single-Stage Detectors なので、小さすぎる物体は検出できません。デモの実行したときに、それが分かる画像がいくつかありますのでぜひ確認してみてください。
M2Det の詳細については論文を読むのが一番だと思いますが、日本語解説記事もいくつかあるので参考になると思います。
まとめ
M2Det のコードを実行するまでの手順をまとめ、簡単に考察してみました。今後、RefineDet と同じように TensorRT で動くように調整して、両者をベンチマークしてみたいと思います。その中で PyTorch の訓練済みモデルをうまく ONNX に変換するテクニックも紹介できればと思います。
オプティムでは、こうした技術に興味がある・作ってみたい、というエンジニアを募集しています。興味のある方は、こちらをご覧ください。