「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
- 制約を置かない実世界の画像に対する認識タスク
- 物体検出タスクと物体識別タスクの両方を行う。
タスク †
- 物体が
- 事前に与えられたどのラベルに属するか?(≒ 物体識別 / 分類)
- 画像中のどの位置にあるか?(≒ 検出)では物体を囲む矩形のBounding box(BBox)を予測する。
- 注
- 同様に、ラベルが追加されていくオペレーションには向かない。
- あくまで画像中の位置(Bounding box(BBox))しか示さない。
歴史 †
Sliding window approach時代 †
- 画像の左上から右下にかけてウィンドウをスライドして
- 画像のすべての領域をウィンドウで探索し検出して
- そして逐一ウィンドウ内の物体に対して物体識別を行う手法
Region proposal method + CNN時代 †
- 画像中から物体らしさの高い領域を見つけるRegion proposal methodで候補領域を検出。
- 候補領域をCNNの入力として物体識別を行う2段構え
- 全部の候補領域をCNNで処理するため時間がかかる。
End-to-end時代 †
- Region proposalをDNNの一レイヤとして組み込んだEnd-to-endな物体検出手法
- Faster R-CNNが初めてこのend-to-endの物体検出手法を実装
詳細 †
アルゴリズム・モデル
R-CNN(Regional CNN) †
(CVPR 2014)
- Region proposal method + CNN時代
- 物体検出タスクと物体識別タスクを順次行う。
手続き †
問題点 †
計算が多く、学習がEnd-to-endで無い点
- 各目的毎に別々に学習する必要がある
- CNNのFine-tune
- 複数のSVMによるクラス分類
- 物体の詳細位置推定 (BBox回帰)
- 実行時間がすごく遅い
- 大量(約2000個)の候補領域毎にCNNで特徴抽出するのは、かなり領域の重複が多く無駄
- GPUを使って10-45 [s/image] (ネットワークに応じて変化)
SPPnet †
(ECCV 2014)
- Region proposal method + CNN時代
- CNNの適用回数を1回にしたことで、GPU上にて24-102倍に高速化
手続き †
- 入力画像からSelective Searchで候補領域を検出。
- 特徴マップを得たら候補領域に対応する特徴マップ上の領域を抜き出す。
- 抜き出した特徴マップ上の領域を、Spatial Pyramid Pooling(SPP)と言うPooling手法で固定長ベクトルにリサイズする。
問題点 †
- 各目的毎に別々に学習する必要があるのは変わらず
- 最終的な学習時にSPP Layer以下のパラメータが更新できない(?
Fast R-CNN †
(ICCV 2015)
中間の時代(クラス分類とBBox回帰の学習をEnd-to-end)
- CNNの演算回数を大幅に減らすことができ、
- R-CNNより9倍の学習速度、213倍の識別速度
- SPPnetの3倍の学習速度、10倍の識別速度
- クラス分類とBBox回帰を全てニューラルネットワークにして
損失関数を合体させたmulti-task-lossにすることで学習をEnd-to-endにできる。
手続き †
- 入力画像からSelective Searchで候補領域を検出。
- 入力は画像と候補領域、出力はクラスとBBox(物体領域)
- 特徴マップを得たら候補領域に対応する特徴マップ上の領域を抜き出す。
- 抜き出した特徴マップ上の領域を、RoI Poolingで固定長ベクトルにリサイズする。
問題点 †
候補領域の検出は別途学習
Faster R-CNN †
(NIPS 2015)
- End-to-end時代、物体検出タスクと物体識別タスクを順次行う。
- Selective SearchをRegion Proposal Network(RPN)と言うニューラルネットワークにして
- End-to-endで学習でき、
- 候補領域の高精度化&候補数の減少
手続き †
- 画像を、学習済みVGG16などに入力し、畳み込み層の最後の出力を、特徴マップとして出力(図中①)。
- 次に、物体の候補領域を見つけるAnchor(格子点のようなもの)を作成し、
Anchorを中心に、ハイパーパラメタで指定した数、Anchor boxes(矩形 ≒ 四角の領域)を作る。
- RPNで、候補領域に、3*3 Conv → 1*1 Convを行い、以下の2項目を出力&学習(図中②)
- Ground truth box(教師)とAnchor boxesのIoUを計算し物体か?背景か?
- Ground truth box(教師)とAnchor boxが、どのくらいズレているのか?
- 物体の候補領域をRoI Poolingで固定長ベクトルにする(図中③)。
- 固定長ベクトルを全結合層に2回通し最後に、以下の2項目を出力&学習(図中④)
- クラス分類用
- 矩形ズレ回帰用
#ref(): File not found: "FasterR-CNN.png" at page "画像処理とコンピュータビジョン(物体検出)"
| #ref(): File not found: "FasterR-CNN2.png" at page "画像処理とコンピュータビジョン(物体検出)"
|
問題点 †
- ネットワークが複雑で実装が大変。
- まだまだリアルタイムには程遠い。
YOLO(You Only Look Once) †
(CVPR 2016)
End-to-end時代、物体検出タスクと物体識別タスクを同時並行で行う。
- CNNのアーキテクチャがシンプルになり、Faster R-CNNより識別精度は少し劣るが45-155FPSの検出速度を達成。
- 1枚の画像の全ての範囲を学習時に利用するため、周辺のコンテクストも同時に学習でき、背景の誤検出がFast R-CNNの約半分
手続き †
- 物体検出タスクが、図5、物体識別タスクが、図3, 4
図1 |
#ref(): File not found: "yolo1.png" at page "画像処理とコンピュータビジョン(物体検出)"
|
入力画像 |
図2 | 図3 | 図4 |
#ref(): File not found: "yolo2.png" at page "画像処理とコンピュータビジョン(物体検出)"
| #ref(): File not found: "yolo3.png" at page "画像処理とコンピュータビジョン(物体検出)"
| #ref(): File not found: "yolo4.png" at page "画像処理とコンピュータビジョン(物体検出)"
|
グリッドセルに分割 | それぞれのグリッドセルでクラス予測 | グリッドセルのクラス |
図5 | 図6 | 図7 |
#ref(): File not found: "yolo5.png" at page "画像処理とコンピュータビジョン(物体検出)"
| #ref(): File not found: "yolo6.png" at page "画像処理とコンピュータビジョン(物体検出)"
| #ref(): File not found: "yolo7.png" at page "画像処理とコンピュータビジョン(物体検出)"
|
BBoxとConfidenceを推測 | 図4, 5を合わせ信頼度スコアを得る | 信頼度スコアに基づいて判断 |
問題点 †
制約で、グリッド内に大量のオブジェクトが映ってしまうような場合に弱い。
SSD(Single Shot Multibox Detector) †
End-to-end時代、物体検出タスクと物体識別タスクを一度の演算にまとめ(Single Shot)て行う。
手続き †
色々な説明のパターン
- パターンB
- 300*300の元画像からベースネットワーク(VGG16)で38*38の特徴マップを作成。
- それ以降、畳み込みを重ねて異なる階層の特徴マップを作成(38*38、19*19、10*10、5*5、3*3)。
- 検出のためのマルチスケール特徴マップを作成(各スケールでの特徴マップ(空間方向))。
- スケールの異なる特徴マップ上に小さなサイズ(3*3)の畳み込みフィルターをかけて、
- 出力の1つ1つのセルが(?)物体のクラスと位置のオフセットを表し(?)、クラス分類とBBox回帰(?)
- 各位置においてDefault boxと呼ばれる異なるアスペクト比の矩形を複数設定
- 各位置の各Default boxについてスコア(confidence)の高いクラスを検出。
- 訓練時にはクラスとDefault boxとGround truth box(教師)のオフセットの誤差を元にモデルの学習。
#ref(): File not found: "SSD2.png" at page "画像処理とコンピュータビジョン(物体検出)"
#ref(): File not found: "SSD3.png" at page "画像処理とコンピュータビジョン(物体検出)"
| #ref(): File not found: "SSD5.png" at page "画像処理とコンピュータビジョン(物体検出)"
|
損失関数 †
- 何故か、SSDだけ損失関数が結構詳しく書かれている。
- Hard Negative Mining
- 大量にBounding Boxをサジェストされるので、学習時にNegativeが大量に発生
- confidence lossを降順にソートして上位からピックアップNegativeとPositiveの比率が3:1になるように調整
問題点 †
...
参考 †