一般物体検出アルゴリズムの紹介
今回CNNを用いた一般物体検出アルゴリズムの有名な論文を順を追って説明します。
コンピュータビジョンの分野において、一般物体検出とは下記の図のように、ある画像の中から定められた物体の位置とカテゴリー(クラス)を検出することを指します。
Deep Learningアルゴリズムの発展によって、一般物体認識の精度は目まぐるしい勢いで進歩しております。 そこで今回はDeep Learning(CNN)を応用した、一般物体検出アルゴリズムの有名な論文を説明したいと思います。
R-CNN (Regions with CNN features) (CVPR 2014) [1]
かの有名なCNNの論文[8]で、ILSVRC 2012の物体認識チャレンジで大差をつけて1位になりました。 このチャレンジでは1枚の画像が1000クラスのうちどれに属するかを推定する、という問題設定でしたが、 物体検出のタスクに対してもCNNのアルゴリズムを上手く応用できないか?という課題を解く先駆けとなった論文がR-CNN[1]です。
R-CNNのアルゴリズムは、
- 物体らしさ(Objectness)を見つける既存手法(Selective Search)[7]を用いて、画像から物体候補(Region Proposals)を探す(2000個程度)
- 物体候補の領域画像を全て一定の大きさにリサイズしてCNNにかけてfeaturesを取り出す
- 取り出したfeaturesを使って複数のSVMによって学習しカテゴリ識別、regressionによってBounding Box(物体を囲う正確な位置)を推定
といった流れになります。
つまり、物体っぽい場所を大量に見つけてきて、無理やり画像をリサイズしてCNNにて特徴抽出、SVMによってどのクラスっぽいかを識別する、というものです。 このアルゴリズムにより、PASCAL VOC 2012のデータセットにおいて(Deepじゃない)既存手法の精度を30%以上改善し、53.3%のmAPを達成しました。
ただし、欠点もあり、
- 学習を各目的ごとに別々に学習する必要がある(ad hoc)
- CNNのFine-tune
- 複数のSVMによるクラス分類 (Classification)
- 物体の詳細位置推定 (Bounding Box Regression)
- 実行時間がすごく遅い
- GPUを使って10-45 [s/image] (ネットワークに応じて変化)
といった課題もありました。
SPPnet (ECCV 2014) [2]
この論文のアイディアとしては、画像をリサイズするのではなく、feature mapsをpoolingするときにリサイズしてしまおう、というものです。
R-CNNでは、固定サイズの画像を入力として識別していましたが、 SPPnetでは、Spatial Pyramid Pooling (SPP)という手法を用いることで、 CNNで畳み込んだ最終層のfeature mapsを縦横可変サイズで取り扱えるようにしました。
これにより、R-CNNのように大量の物体量領域ごとにCNNで特徴抽出するのでなく(約2000個のRegion Proposalはかなり領域の重複が多いため、重複する画像領域をCNNで特徴抽出するのはかなり無駄)、 画像1枚から大きなfeature mapsを作成した後、Region Proposalの領域の特徴をSPPによってベクトル化することで、スピードはGPU上にて24-102倍に高速化できました。
この手法の欠点としては下記のものが挙げられます。
- 学習がad hocなのは変わらず
- 最終的な学習時にSPP Layer以下のパラメータが更新できない
Fast R-CNN (ICCV 2015) [3]
R-CNN/SPPnetでは、fine-tune/classification/bounding box regressionをそれぞれ別々に学習する必要がありました。そこで、Fast R-CNNではこれらを課題を解決するために、下記の手法を提案しました
- RoI pooling layerという、SPPのpyramid構造を取り除いたシンプルな幅可変poolingを行う
- classification/bounding box regressionを同時に学習させるためのmulti-task lossによって1回で学習ができるようにする(ad hocでない)
- オンラインで教師データを生成する工夫
またmulti-task lossの導入により、Back-Propagationが全層に適用できるようになったため、全ての層の学習が可能になりました。
これにより、R-CNN, SPPnetより高精度な物体検出を実現しました。 また実行速度は、VGG16を用いたR-CNNより9倍の学習速度、213倍の識別速度で、 SPPnetの3倍の学習速度、10倍の識別速度を達成しました。
Faster R-CNN (NIPS 2015) [4]
Fast R-CNNは、物体検出のほとんどの学習/識別フェーズをDeep Learningを用いることで実現できました。 しかしながら、物体候補(Region Proposals)を検出するアルゴリズムは前述の論文同様、既存の手法を使っていました。 そこで、Faster R-CNNはRegion Proposal Network (RPN)という物体候補領域を推定してくれるネットワーク + RoI Poolingにクラス推定を行うことでEnd to Endで学習できるアーキテクチャを提案しました。
*ちなみにFaster R-CNNの論文は、Fast R-CNNがarXivにアップされた約1ヶ月後に初稿がアップされている、恐ろしい速さや。。。
RPNは、物体候補を出力するために(1)物体かどうかを表すスコア(図中cls layer)と(2)物体の領域(図中reg layer)の2つを同時に出力するように設計されています。画像全体のfeature mapsから予め決められたk個の固定枠(Anchor)を用いて特徴を抽出し、RPNの入力とすることで、各場所において物体候補とすべきかどうかを推定します。 物体候補として推定された出力枠(reg layer)の範囲を、Fast R-CNN同様にRoI Poolingしクラス識別用のネットワークの入力とすることで最終的な物体検出を実現します。
物体候補検出がDeep化されたことで、既存手法(Selective Search)[7]よりも物体候補が高精度化&候補数が少なくなり、 GPU上で5fpsの実行速度(VGGのネットワークを利用)を達成しました。 また、識別精度もFast-RCNNより高精度化しています。
YOLO(You Only Look Once) (CVPR 2016) [5]
上記の研究では、Region Proposalを何かしらの手法で検出した後、classificationを行っていましたが、 YOLOでは別のアプローチとして、予め画像全体をグリッド分割しておき各領域ごとに物体のクラスとbounding boxを求める、という方法を提案しています。 CNNのアーキテクチャがシンプルになったため、Faster R-CNNに識別精度は少し劣るが45-155FPSの検出速度を達成ました。 またSliding WindowやRegion Proposalを使った手法と違い、1枚の画像の全ての範囲を学習時に利用するため、周辺のコンテクストも同時に学習することができます。これにより、背景の誤検出を抑えることができるようになり、背景の誤検出はFast R-CNNの約半分の抑えることが出来ました。 (今回の実験では、7x7のグリットに分割し、1つのセルに対して1クラス, 2box、20クラスを推定できるようにしている)
ただし欠点として、分割されたグリッドサイズは固定かつ、グリッド内で識別できるクラスは1つであり、 検出できる物体の数は2つという制約を設けているため、 グリッド内に大量のオブジェクトが映ってしまうような場合に弱くなります。
SSD: Single Shot MultiBox Detector (ECCV2016) [6]
YOLOのアルゴリズムと同じような系統のアルゴリズムとしてSSDがあります。 SSDは様々な階層の出力層からマルチスケールな検出枠を出力できるように工夫されています。
下記のような特徴があります。
- state of the artな検出速度のアルゴリズム(YOLO)より高速で、Faster R-CNNと同等の精度を実現するアルゴリズムの提案
- 小さなフィルタサイズのCNNをfeature mapに適応することで、物体のカテゴリと位置を推定
- 様々なスケールのfeature mapと利用し、アスペクト比ごとに識別することで、高い精度の検出率を達成
- 比較的低解像度でも高精度に検出できるend-to-end trainableなアルゴリズム
上図の様に異なる階層からfeature mapを使い、比較的小さなサイズの物体も検出できるため、入力画像サイズを小さくしても、それなりの精度がでるため、高速化できています。
SSDは300×300の画像サイズにおいてVOC2007のデータセットにおいて74.3% mAPという高精度を保ったまま、59 FPSを達成(Nvidia Titan Xを利用)し、512×512の画像サイズにおいては、76.8% mAPを達成しました。(Faster R-CNNは73.2% mAP) )
SSDについての詳細は下記参考資料を参照いただけると。
感想
歴史を辿っていくと、R-CNN懐かしいなーとか、どれも再現実験が超大変だーとか(理解、実装、学習時間含め)、魔改造Caffeの解読つらい。。。など思い返すことが多く、良い振り返りになりました。この分野は進展が目まぐるしく、ほとんどの論文が学会発表の半年から1年以上前にarXivに投稿されています。 学会で発表を聞いていても、「あれ、それ半年前ぐらいの論文じゃない?」ぐらいの速さで進化していて、驚くばかりです。 ”一般物体検出”の分野は、偉大なる先人のお陰でだいぶ実現可能性が見えてきているので、これからは如何にアルゴリズムやネットワークをシンプルにできるか?や少ないデータセットで高精度な検出ができるか?という方向に発展していくのでしょうか。また、一般物体検出はクラス+物体領域の教師ラベルが必要で作成が大変なため、よりライトな教師データでも学習可能な手法が提案されるとより可能性が広がると感じております。
果たして来年はどうなってることでしょうか。
宣伝
ちなみにABEJAでは、イケてるしヤバいエンジニア、リサーチャーを募集していますので、 最先端のテクノロジーで世界を変えるようなプロダクトを作りたいという方は、どしどしご応募ください☆ リサーチャーだけでなく、Spark+Scalaできる方や、Vue.jsを使ってSPAのアプリケーション作りたい方、数千台ぐらいのDockerコンテナをマネージしたい方や、AWS上でゴリゴリTerraformやりたい方等募集しております!
参考文献
[1] Girshick, Ross, et al. "Rich feature hierarchies for accurate object detection and semantic segmentation." Proceedings of the IEEE conference on computer vision and pattern recognition. 2014. link
[2] He, Kaiming, et al. "Spatial pyramid pooling in deep convolutional networks for visual recognition." European Conference on Computer Vision. Springer International Publishing, 2014. link
[3] Girshick, Ross. "Fast r-cnn." Proceedings of the IEEE International Conference on Computer Vision. 2015. link
[4] Ren, Shaoqing, et al. "Faster R-CNN: Towards real-time object detection with region proposal networks." Advances in neural information processing systems. 2015. link
[5] Redmon, Joseph, et al. "You only look once: Unified, real-time object detection." arXiv preprint arXiv:1506.02640 (2015). link
[6] Liu, Wei, et al. "SSD: Single Shot MultiBox Detector." arXiv preprint arXiv:1512.02325 (2015). link
[7] Uijlings, Jasper RR, et al. "Selective search for object recognition." International journal of computer vision 104.2 (2013): 154-171. link
[8] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "Imagenet classification with deep convolutional neural networks." Advances in neural information processing systems. 2012. link