モチベーションとしては物体検出のベンチマークとしてはスタンダードなPASCAL VOCのメトリックによるmAPの評価器を手に入れたいということになります。実装は出来ればライセンスも無く、あまり読めないMATLAB版よりPythonなどで書かれたものが良いです(そしてPythonの方が速い)。
ということで色々探した結果、https://github.com/amdegroot/ssd.pytorch でmAP評価器の実装が見つかりました。この実装には些細なバグはあり、その内容についてはVOC07のメトリックの計算について紹介したときに紹介しました。
今回は、前回修正したコードを使ってVOC2010のメトリック計算の結果と、2012年版の公式ツールとを比較しました(公式ツールはPascal VOC Dataset MirrorのVOC 2012のDevalopment Kitから入手可能です)。文献を見る限り、メトリックの変更が行われたのは2010年で、2012年も同じものが使われているようです。ですが、使った公式ツールが2012年版なのでこの記事のタイトルも2012としています。
それでは前回と同様、重みssd300_mAP_77.43_v2.pthを使用した場合の結果を示します。
| ap | MATLAB | python(修正後) | python(修正前) |
|---|---|---|---|
| aeroplane | 0.8504 | 0.8505 | 0.8485 |
| bicycle | 0.8843 | 0.8842 | 0.8850 |
| bird | 0.7888 | 0.7885 | 0.7860 |
| boat | 0.7282 | 0.7281 | 0.7231 |
| bottle | 0.5110 | 0.5110 | 0.5001 |
| bus | 0.8847 | 0.8851 | 0.8850 |
| car | 0.8946 | 0.8945 | 0.8896 |
| cat | 0.9012 | 0.9013 | 0.9013 |
| chair | 0.6345 | 0.6345 | 0.6292 |
| cow | 0.8656 | 0.8655 | 0.8625 |
| diningtable | 0.8135 | 0.8134 | 0.8137 |
| dog | 0.8867 | 0.8869 | 0.8855 |
| horse | 0.9016 | 0.9016 | 0.9016 |
| motorbike | 0.8735 | 0.8734 | 0.8734 |
| person | 0.8210 | 0.8208 | 0.8157 |
| pottedplant | 0.5133 | 0.5133 | 0.5083 |
| sheep | 0.7990 | 0.7989 | 0.7930 |
| sofa | 0.8287 | 0.8291 | 0.8281 |
| train | 0.8911 | 0.8911 | 0.8911 |
| tvmonitor | 0.7956 | 0.7957 | 0.7933 |
| mAP | 0.8034 | 0.8034 | 0.8007 |
MATLAB版の計算の実行にはoctaveを使用しました。テスト自体はVOC2007のtestデータを使用しています。2007と2012で画像IDのフォーマットが変わっている関係でVOChash_initとVOChash_lookupには修正が必要です。あとはtic;が抜けていてエラーが出る箇所がありました。
ついでながら、調べる過程でhttps://github.com/rafaelpadilla/Object-Detection-Metrics についても調べましたが、PASCAL VOC型のデータセットでdifficultが1になっているときの処理を含まないので、公式ツールからは結果がズレます。定義の意味ではmAPを計算していると思いますが、他の論文との比較にはならないのではと思います。
今回の計算結果を出すのに使用したコードはここから入手可能です。MATLAB版についてはライセンスが良く分からないので、修正後のコードは公開はしていません。