物体検出
概要
物体検出とはclassificationに加えて、localizationが必要なタスクである。
物体を囲む矩形領域をbounding boxと呼ぶ。
物体検出は以下を予測値として学習する。
classification
物体の中心座標x,y(連続値)
bounding boxのheightとwidth(連続値)
学習の際、正解がない場所についてはback propagationをしないなど工夫をして学習が必要。
上記の基本的な手法のままでは、以下の課題がある
Convの最終層の画像サイズに依存した個数しか検出できない。(最終層が8x8ならば64個が上限)
中心が同じ領域にあるものを検出できない。(学習時の正解も一つしか設定できない)
上記を解決するために、anchor boxを準備する。
anchor boxはいろんなサイズ、縦横比のbounding box候補のようなイメージ。
anchor boxの種類毎に、上記の基本的な手法で学習を実施する。
anchor boxの種類はクラスタリングなどにより求める。
anchor boxの種類毎に、最終層の出力解像度を分けるアプローチのモデルもある。
NMS(Non-maximum Supressions)で候補を削減。
anchor boxを用いると、重なりの大きな物体が複数検出されるので、IoUが一定以上の場合は、その中で一番大きいスコアの領域のみを採用する。
これらの手順は煩雑なので、anchor boxを使わない方法も近年人気である。
最終層を元画像の1/4程度に収めて、高解像で出力するCenterNetなど。
学会
CVPR
ICCV
NeurIPS
レポジトリ(フレームワーク)
OpenMMLabによるレポジトリ
Baidu社によるPaddlePaddleというフレームワークを用いたレポジトリ
FAIRによるレポジトリ
主要なモデル一覧
HOG+SVM 2005.06.20 CVPR'2005 / 論文
CNN誕生前のモデルで良く参照された論文
HOGはpixel変化を捉える特徴量
HOG特徴量を用いてSVMで多クラス分類する
NMSはこの時から使われている
R-CNN 2013.11.11 CVPR'2014, 2stage / 論文 / 実装例
CNN適用の先駆け論文
selective searchという古典的手法で領域候補を抽出
候補領域をリサイズしてCNNに入力して特徴量ベクトルを得る
その後段で1-class SVMとbounding boxのregressionを実施
SPP-net 2014.06.18 TPAMI'2015, 2stage / 論文 / 実装例
領域候補の切り出しを特徴量マップに対して実施し効率化
これにより最大2000毎程度ある領域候補のCNN処理が1回で実現可能
切り出した特徴量マップはSPPで固定長の特徴量に変換して後段で処理
Fast R-CNN 2015.04.30 ICCV'2015, 2stage / 論文 / 実装例
Multi-task lossによりclassificationとbounding box推定を同時学習
固定長の特徴量変換としてSPPの代わりにRoI Poolingを使用
RoI Poolingは両機をグリッド分割し各グリッドに対してpooling処理を実施
Faster R-CNN 2015.06.04 NeurIPS'2015, 2stage / 論文 / 実装例
領域候補を抽出するselective searchをCNNで置き換え
このNetworkをRPN(Region Proposal Network)と呼ぶ
RPNには9個のanchor boxを使用し領域有無とbounding box回帰を実施
YOLO 2015.06.08 CVPR'2016, 1stage (anchor free) / 論文 / 実装例
領域検出とclassificationの同時学習を実現(You only look once)
入力画像をグリッド分割し、各グリッドに固定数のbounding box回帰を実施
SSD 2015.12.08 ECCV'2016, 1stage / 論文 / 実装例
YOLOと同じく領域検出とclassificationの同時学習を実現(Single shot detector)
backboneの途中層の高解像な特徴量マップを使用
特徴量マップの解像度毎に様々な大きさのanchor boxを定義
R-FCN 2016.05.20 NeurIPS'2016, 2stage / 論文 / 実装例
RoI Pooling以降の全結合層をCNN化したモデル
RoI Poolingの前段にposition sensitive mapという畳み込みを追加
その後段でRoI Poolingを実施する構成
FPN 2016.12.09 CVPR'2017, 2stage / 論文 / 実装例
ピラミッド構造の特徴量マップを実現したモデル
ベースはFaster R-CNNであり、RPNとclassificationどちらもピラミッド構造化
FPNの考え方は現在まで採用されており重要な論文
YOLOv2(YOLO9000) 2016.12.25 CVPR'2017, 1stage / 論文 / 実装例
YOLOをベースに改良を実施
入力の高解像化、anchor boxの導入、高解像な特徴量マップの使用など
それ以外に9000クラスまで分類可能なWordTreeというアーキテクチャを構築
RetinaNet 2017.08.07 ICCV'2017, 1stage / 論文 / 実装例
ロス計算(CE)をサンプルの難易度によって動的に変化させるFocal lossを提案
ベース構造はFPNのようなピラミッド構成だが、1stageとなっている。
シンプルな構成のため現在でもベースラインされることも多い
Focal loss自体も現在でも使用されている重要な論文
Mask R-CNN 2017.03.20 ICCV'2017, 2stage / 論文 / 実装例
Instance Segmentation用のheadを追加したMulti-taskモデル
物体検知としては、RoI Poolingの代わりに補完を考慮したRoI Alignを導入
RefineDet 2017.11.18 CVPR'2018, 1stage / 論文 / 実装例
1stageモデルだが2stageモデルのようにanchor boxをCNNで推定
anchor box用CNNと物体検知用のCNNを相互接続し同時に学習
改良のベースはSSDを用いているが、近年参照されることは少ない
PANet 2018.03.05 CVPR'2018, 2stage / 論文 / 実装例
buttom-up構造により深い特徴量マップにも高解像情報を付与
後段はMask R-CNNと同様のRoI Alignを使用している
RPN側は従来通りのFPN構造と思われる
Mask R-CNNと同様、Segmentationタスクにも対応したMulti-taskモデル
YOLOv3 2018.04.08, 1stage / 論文 / 実装例
YOLOv2をベースに改良を実施
skip-connectionの採用、複数解像度(3つ)の特徴量の融合など実施
anchor box数を増やし、結果として速度面ではYOLOv2よりも低下
CornetNet 2018.08.03 ECCV'2018, 1stage (anchor free) / 論文 / 実装例
姿勢推定の影響を受けた技術が多いanchor freeの方式
corner poolingによりbounding boxのコーナーをうまく検出している
またImageNetなどの事前学習が不要な点も特徴的
M2Det 2018.11.12 AAAI'2019, 1stage / 論文 / 実装例
SSDをベースに特徴量マップを複雑に処理するMLFPNを提案
MLFPNはFPNのピラミッド構造を繰り返し可能な設計とした構造
当時は高速・高性能をうたっていたが近年参照されることは少ない論文
FCOS 2019.04.02 ICCV'2019, 1stage (anchor free) / 論文 / 実装例
物体検出をsegmentationと同様画素単位で再構築したanchor freeモデル
特徴量マップの各位置からbounding boxまでの4方向の距離を直接推定する
特徴量マップはFPN構造を使い複数の解像度を使用
応用がしやすいため参照されることが多いanchor freeモデル
CenterNet 2019.04.16, 1stage (anchor free) / 論文 / 実装例
CornerNetと同様にheatmapを推定するanchor freeモデル
CenterNetでは中心位置のheatmapを推定する
高解像な特徴量を扱うための工夫がbackboneに施されている
CenterNet 2019.04.17 ICCV'2019, 1stage (anchor free) / 論文 / 実装例
CenterNetは同名のものが2つあるがこちらはCornerNetの改良版
ConerNetはbounding boxの内部を見ていないため誤検出が多い
改善するためにCenter heatmapを計算し、Corner Poolingも改良
EfficientDet 2019.11.20 CVPR'2020, 1stage / 論文 / 実装例
EfficientNetの考え方を取り入れた複合スケール方式を提案
backbone自体もEfficientNetを使用
FPN系のアーキテクチャの体系を整理しより最適でスケーラブルなBiFPNを提案
Focal Lossを用いるなどベースの部分はRetinaNetに近いと思われる
YOLOv4 2020.04.23, 1stage / 論文 / 実装例
研究成果を体系的に整理し高速かつ高精度なYOLOを目指した改良版
GPU1個で学習可能でリアルタイム推論が可能なモデルを構築
DETR 2020.05.26 ECCV'2020 1stage (anchor free) / 論文 / 実装例
Transformerを物体検知に導入したモデル
backboneの後段の処理としてTransformerを使用
これによりanchor boxやNMSなどハンドメイドな部分を削除
正解の割り当てを最適割当問題とみなしhungarian algorithmで解く
比較対象がFaster R-CNNなのでこれからの発展に期待
YOLOv5 2020.06.01, 1stage / 論文なし / 実装例
フレームワークが優れており、広く利用されている物体検知のモデル
アーキテクチャの詳細は論文がないため確認が困難
v4との比較について第三者が検証しているが明確な結論はでていない
Scaled-YOLOv4 2020.11.16 CVPR'2021, 未調査 / 論文 /
PSS 2021.01.28, 1stage (anchor free) / 論文 / 実装例
NMSフリーなモデルを学習するためにPSSヘッドを導入した論文
PSSヘッドにより1つの正解に対して1つだけ正例を出力するよう学習
YOLOXのNMSフリー用オプションとして使用
YOLOF 2021.03.17 CVPR'2021, 1stage / 論文 / 実装例
FPN構造の成功は複数解像度の特徴量ではなく分割統治法である
そのことから単一解像度の特徴量からのモデルを考案した
名前はYOLOが付いているが、ベースはRetinaNetの構造
OTA 2021.03.26 CVPR'2021, 1stage / 論文 / 実装例
ラベル割り当てを最適輸送問題(OTA)として解いたモデル
OTAはペアのロスを定義することに加え、需要量と供給量を定義
この問題設定かでSinkhorn-Knopp法で最適値を求める
YOLOXでこれの高速な手法が用いられている
YOLOX 2021.07.18, 1stage (anchor free) / 論文 / 実装例
YOLOに先端のラベル割り当て(OTA)やアンカーレス方式を導入した
OTAをより高速にするため近似計算するSimOTAを用いている
アンカーレスの方式はシンプルでYOLOv1に近い方式
YOLOv3をベースとしているため、特徴量融合もv3の方式となる
YOLOシリーズ特有のSingle HeadはDecoupledされている
参考
物体検出の概要がわかる
https://www.youtube.com/watch?v=5nmVHoA-A2E
物体検出についての歴史まとめ
https://qiita.com/mshinoda88/items/9770ee671ea27f2c81a9
https://qiita.com/mshinoda88/items/c7e0967923e3ed47fee5
物体検出モデルの進展
https://qiita.com/TaigaHasegawa/items/b05110a2571a5289cbab
https://qiita.com/TaigaHasegawa/items/a3cb98fb27cc7a9307b4
https://qiita.com/TaigaHasegawa/items/653abc81ac4ee1f0d7b8
YOLOシリーズ徹底解説
https://deepsquare.jp/2020/09/yolo/
ディープラーニングによる一般物体検出アルゴリズムまとめ NegativeMindException
https://blog.negativemind.com/portfolio/deep-learning-generic-object-detection-algorithm/
YOLOのv1~v5まで
https://qiita.com/tfukumori/items/519d84bf3feb8d246924
YOLOシリーズについて2021年時点までの情報がいろいろ書いてある。
https://www.slideshare.net/ren4yu/you-only-look-onelevel-feature
2014~2019までの物体検知の歴史
https://github.com/hoya012/deep_learning_object_detection
Last updated