物体検出の黎明から発展
明治大学大学院 先端数理科学研究科 ND専攻
櫻井研究室 金澤滉典
今回の目的
物体検出における
DLの実用化 からモデルの高速化
までを理解する
目次
0. 物体検出とは
1. DL以前の物体検出
2. R-CNN
• Fast R-CNN
• Faster R-CNN
3. YOLO
4. SSD
5. ソースコード配布
0. 前提:物体検出とは
矩形で囲む処理
https://www.renom.jp/packages/renomimg3/renom_img/41_what_is_image_recognition.html
評価指標:重なりと処理速度と適合率
正解ラベルがm
𝐼𝑜𝑈 =
𝑇𝑃
𝑇𝑃 + 𝐹𝑃 + 𝐹𝑁
FPS
Sec/Image
or
𝑃𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 =
𝑇𝑃
𝑇𝑃 + 𝐹𝑃
𝑅𝑒𝑐𝑎𝑙𝑙 =
𝑇𝑃
𝑇𝑃 + 𝐹𝑁
Intersection OverUnion
(JaccardOverlap)
https://qiita.com/mshinoda88/items/9770ee671ea27f2c81a9
https://pystyle.info/how-to-calculate-object-detection-metrics-map/
APとmAP:物体検出におけるRecall,Precision
• TP:TruePositive(正解と予測が一致)
予測BoundingBoxと正解BoundingBoxが十分に重なっている(IoU>=0.5)
• FP:False Positive(検出はしたが対象が違う)
予測BoundingBoxが正解BoundingBoxが十分に重なっていない(IoU< 0.5)
• FN:False Negative(検出すべきものができていない)
正解BoundingBoxが予測BoundingBoxが十分に重なっていない(IoU< 0.5)
• TN:TrueNegative
検出しないのが正解である矩形というのは多数考えられるため定義されない
APとmAP:物体検出におけるRecall,Precision
• TP: True Positive
>>正解と予測が一致
• FP: False Positive
>>検出はしたが対象が違う
• FN: False Negative
>>正しいものが検出できていない
• TN: True Negative
>>定義する必要ない
1. この指標を用いて、検出したクラスごとに
Precision, Recallを計算
2. P-R曲線を作成し、APを算出
3. 全クラスのAP平均がmAP
𝑃𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 =
正しく(𝐼𝑜𝑈 ≥ 0.5)で検出できた数
全ての予測𝐵𝐵𝑜𝑥の数
𝑅𝑒𝑐𝑎𝑙𝑙 =
正しく(𝐼𝑜𝑈 ≥ 0.5)で検出できた数
全ての正解𝐵𝐵𝑜𝑥の数
最重要
𝑃𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 =
𝑇𝑃
𝑇𝑃 + 𝐹𝑃
, 𝑅𝑒𝑐𝑎𝑙𝑙 =
𝑇𝑃
𝑇𝑃 + 𝐹𝑁
APとmAP:積分での導出例
• 𝑨𝑷 = 𝟎
𝟏
𝒑 𝒓 𝒅𝒓を計算(p, rはPrecision, Recallの変数)。
• 積分にあたり、各RecallのPrecisionを最大値に置き換える。
• プログラム上では全点を扱えないため、代表点を取る。
• この例では𝑨𝑷 = 𝑨𝒗𝒈 𝒑 𝟎 , 𝒑 𝟏 , … , 𝒑 𝟏. 𝟎 = 𝟎. 𝟕𝟓𝟑となる
ある物体の検出結果
https://qiita.com/cv_carnavi/items/08e11426e2fac8433fed
APとmAP:検出器の精度評価イメージ
検出器
Human
Car
TV
この3つに
分類できます
テスト画像
①
②
𝐴𝑃𝐻𝑢𝑚𝑎𝑛 = 0.67
𝐴𝑃𝑇𝑉 = 0.85
𝐴𝑃𝐶𝑎𝑟 = 0.98
𝑚𝐴𝑃 = 0.83
③
これがこの
モデルの精度
※ベンチマークに使うデータセット例
・COCO
・PASCALVOC2007,2012
まとめ:物体検出の前提知識
• 画像内の物体を矩形で囲むタスク
• 処理速度・mAPでモデルを評価
• ベンチマークに使うデータセット(COCO, VOC等)
物体検出とは
評価指標
1. DL以前の物体検出
HOG:Histogramof Oriented Gradients
https://www.slideshare.net/MPRG_Chubu_University/ss-32258845
HOG with SVM
https://www.slideshare.net/MPRG_Chubu_University/ss-32258845
HOG特徴量化 + SVMで物体と背景を分離
実質的
物体検出
2. R-CNN: Region-basedCNN
R-CNN:DLを用いた物体検出の先駆け
3ブロック構成
AlexNet + SVM + Regressor
Selective Search
https://qiita.com/mshinoda88/items/9770ee671ea27f2c81a9#2-2-r-cnn-region-based-cnn
領域提案:Selective Search
https://ivi.fnwi.uva.nl/isis/publications/2011/vandeSandeICCV2011/vandeSandeICCV2011.pdf
• 原論文での手法
• 複数のスケールのウィンドウを調べ、テクスチャ・色・強度を共有する隣接ピクセルを
探し、物体の候補を提案する手法
特徴量化と分類
領域でトリミングした画像
AlexNet
畳込み層 x 5
↓
全層結合層 x2
↓
出力層
SVM
!!??
𝐼𝑜𝑈 > 0.3
で学習
検出したB-Box
の後処理が必須
B-Boxを整理する:Non-Maximum Suppression
• スコアが最も高いB-Boxを基準にIoUを計算していく
• IoUの閾値(低値:< 0.3程度)が超えた場合、比較した
boxを削除
Human: 0.85
Human: 0.90
Human: 0.97
Human: 0.90
Human: 0.97
𝐼𝑜𝑈 = > 0.3,
Human: 0.97
𝐼𝑜𝑈 = > 0.3
Human: 0.85
補足)問:この領域で括るべきではない理由
一見、問題なさそうに思える
補足)解:物体が隣接する場合にエラーが出るから
https://meideru.com/archives/3538
問題点:計算資源への高負荷
実行時間の長さ
学習プロセスが多段階かつ複雑
1. ImageNet(1画像1物体)によるCNN
の事前学習
2. VOC(1画像多物体)によるCNNの
転移学習
3. CNN出力からSVMの分類学習
4. 矩形回帰の学習
• 領域候補が2000個
• 認識時間10-45 [sec/image]
@ NvidiaTesla K40
× 2000 ×画像の枚数
改良:Fast R-CNN
• 精度向上
• Multi-task Lossでシステム全体を一発学習
R-CNN
からの進化
基本設計
1. 学習済みCNN(VGG)で先に特徴抽出
2. 提案された候補領域に相当する部分をRoI Pooling
3. FCを何層か挟み、分類と矩形回帰を同時に解く
候補領域数 ~2000 × 𝑪𝑵𝑵 → 候補領域数 ~2000 × 𝑹𝒐𝑰 𝑷𝒐𝒐𝒍𝒊𝒏𝒈
regionofinterest
高性能化:どれくらい良くなったのか?
Model’s CNN
S: CaffeNet
M:VGG CNN M1024
L: VGG16
100倍高速
深いCNNなら高精度
https://arxiv.org/pdf/1504.08083.pdf
Architecture:CNNは1回のみ
https://arxiv.org/pdf/1504.08083.pdf
CNN結果 分類器+矩形回帰
候補領域
CNN結果を候補領域でRoIPooling
キーワード:RoI Pooling
https://arxiv.org/pdf/1406.4729.pdf
https://arxiv.org/pdf/1504.08083.pdf
RoI Pooling
Spatial PyramidPooling
先行研究で提案された特殊なpooling
分割数ごとにmaxpoolingしてappend
入力画像が固定長である必要が無い
候補領域
特徴マップ
入力画像が固定長で
ある必要が無い
大きさが違う
候補領域に最適
キーワード:Multi-taskLoss
• モデルの出力
• RoIごとの離散確率分布(K+1クラス): 𝑝 = (𝑝0, … , 𝑝𝑘)
• バウンディングボックスの位置情報(K個のオブジェクト): 𝑡𝑘 = (𝑡𝑥
𝑘, 𝑡𝑦
𝑘, 𝑡𝑤
𝑘 , 𝑡ℎ
𝑘
)
• 分類・位置推定の誤差関数の和で定義(論文中では𝜆 = 1)
𝐿 𝑝, 𝑢, 𝑡𝑢
, 𝑣 = 𝐿class 𝑝, 𝑢 + 𝜆 𝑢 ≥ 1 𝐿location(𝑡𝑢
, 𝑣)
𝐿class 𝑝, 𝑢 = −log 𝑝𝑢
𝐿location 𝑡𝑢
, 𝑣 =
𝑡∈ 𝑥,𝑦,𝑤,ℎ
𝑠𝑚𝑜𝑜𝑡ℎ𝐿1
𝑡𝑖
𝑢
− 𝑢𝑖
𝑠𝑚𝑜𝑜𝑡ℎ𝐿1
𝑥 =
0.5𝑥2
( 𝑥 < 1)
𝑥 − 0.5 (𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒)
誤差関数をまとめたことで
モデルを一括で学習可能に
改々良:FasterR-CNN
• ボトルネックだった領域提案を領域提案ネットワーク
(RPN)として実装
• 史上初のEnd-to-Endで学習可能な検出器に
Fast R-CNN
からの進化
基本設計
1. ある矩形の中身が物体なのか背景なのかを学習
2. 1. で検出した場所に具体的に何が写っているのかを学習
領域提案 + 𝑪𝑵𝑵 (分類・位置推定) → 𝑪𝑵𝑵(領域提案・分類・位置推定)
Architecture:領域もCNNで検出
https://arxiv.org/pdf/1506.01497.pdf
https://blog.negativemind.com/2019/02/20/general-object-recognition-faster-r-cnn/
追加されたCNN= RPN
ZFNet / VGG
追加されたRPNがカギ
RPN:Region ProposalNetwork
• 物体が写っている場所・矩形の形のみ検出するモデル
(写っているものは考慮しない)
• 学習が必要かつ教師データ作成が困難
1. 入力画像をCNNに通し特徴マップを出力
2. 特徴マップに対してAnchorboxesを設定
3. Anchorboxesと正解(Ground Truth)の情報を比較しながら
RPNの教師データ(RPNの出力層)を作成
(入力:画像, 出力:3. で作成したデータ)として教師有り学習
https://is.gd/qzboLi
ラベルイメージ
キーワード:Anchor
• 特徴マップのピクセルごとk個存在する
• 異なるアスペクト比・面積を持ったBox
• ピクセル自身のAnkerと正解データのAnchorの比較
で値を出力(物体判定・位置判定)
(中心xのズレ,中心yのズレ,幅のズレ,高さのズレ)
の4次元ベクトルがk個のAnchor分
(背景, 物体)の2次元ベクトルがk個のAnchor分
1, 0 𝐼𝑜𝑈 < 0.3
0,1 𝐼𝑜𝑈 > 0.7
𝐼𝑜𝑈(𝐴𝑛𝑐ℎ𝑜𝑟, 𝐴𝑛𝑐ℎ𝑜𝑟𝑔.𝑡.)
https://arxiv.org/pdf/1506.01497.pdf 位置が学習できれば、以降は同じ
学習についてと性能比較
• 特徴マップを抽出するCNNをRPNも共有している(=片方ずつの学習が必要)
1. ImageNetで学習済みのCNN出力を使ってRPNを学習する
2. 学習済みRPNが出力する矩形を使ってCNNのパラメータを更新する
3. 畳み込み層をfixしてRPNを学習し直す
https://arxiv.org/pdf/1506.01497.pdf
データ量が多いほど高精度
10倍高速
補足)物体検出の系譜
https://www.slideshare.net/DeepLearningJP2016/dl-reading-paper20170804pdf
3. YOLO: YouOnlyLookOnce
1モデル完結:One-Stage型というブレークスルー
• 領域検出(RPNなど)→ 領域ごとに分類
• RPNがボトルネック
YOLO以前
YOLO以後
• 1つのCNNモデルで検出・識別を同時に実行
• 30fpsを超える高速度とSOTAクラスの高精度
𝐶𝑁𝑁(検出) + 𝑪𝑵𝑵 (分類)
→ 𝑪𝑵𝑵(検出・分類)
https://arxiv.org/pdf/1504.08083.pdf
Architecture:画像読み込みは1回
https://arxiv.org/pdf/1506.02640.pdf
入力画像
キーワード:Confidence score
https://arxiv.org/pdf/1504.08083.pdf
入力画像を𝑆 × 𝑆の
グリッドセル領域に分割
各グリッドセルについて、B個(論文中: B=2個)の
B-Boxと各B-BoxのConfidenceを推測
𝐶𝑜𝑛𝑓𝑖𝑑𝑒𝑛𝑐𝑒 = 𝑃𝑟(𝑜𝑏𝑗𝑒𝑐𝑡) × 𝐼𝑜𝑈(𝐵𝐵𝑜𝑥, 𝑇𝑟𝑢𝑒𝐵𝑜𝑥)
各グリッドセルは、C個の物体クラスそれぞれの条件付きクラス確率
(conditional class probabilities)である𝑃𝑟(𝐶𝑙𝑎𝑠𝑠𝑖|𝑂𝑏𝑗𝑒𝑐𝑡) を表す
各B-BoxのConfidenceと各クラスの予測
確率をそれぞれ掛け合わせ、各B-
Box・各クラス毎のConfidencescoreを得
る。
𝑃 𝑟 𝑜𝑏𝑗𝑒𝑐𝑡 × 𝐼𝑜𝑈 𝐵𝐵𝑜𝑥, 𝑇𝑟𝑢𝑒𝐵𝑜𝑥
× 𝑃 𝑟 𝐶𝑙𝑎𝑠𝑠𝑖 𝑂𝑏𝑗𝑒𝑐𝑡
= 𝑃 𝑟(𝐶𝑙𝑎𝑠𝑠𝑖) × 𝐼𝑜𝑈 𝐵𝐵𝑜𝑥, 𝑇𝑟𝑢𝑒𝐵𝑜𝑥
誤差関数
https://www.slideshare.net/ssuser07aa33/introduction-to-yolo-detection-model
誤差関数
https://www.slideshare.net/ssuser07aa33/introduction-to-yolo-detection-model
圧倒的処理速度
脅威の155FPS
Fast YOLOは9層構成
4. SSD:Single ShotmultiboxDetector
1モデル完結その2:高速かつ高精度
• 小さいものの検出精度が低め
• Grid Cellの原理的にシングルスケールのみの対応
YOLOの欠点
基本設計
• 複数の特徴マップでAnchorを利用
• 位置・識別の誤差関数は和を取って最小化
シングルスケールAnchor
→ マルチスケールAnchor
https://arxiv.org/abs/1512.02325.pdf
Architecture:マルチスケールのAnchor
https://arxiv.org/abs/1512.02325.pdf
Architecture:マルチスケールのAnchor
https://arxiv.org/abs/1512.02325.pdf
https://newtechnologylifestyle.net/vgg16originalpicture/
VGG16で特徴量を抽出
FC6とFC7は畳込み層に変更
Architecture:マルチスケールのAnchor
https://arxiv.org/abs/1512.02325.pdf
サイズの違うFeature Mapから
領域候補とクラス確率を出力
領域候補Anchorのアスペクト比
{1, 2,3,1/2,1/3}の5種類
• 分類・位置推定の誤差関数の和で定義(論文中では𝛼 = 1)
𝐿 𝑥, 𝑐, 𝑙, 𝑔 =
1
𝑁
{𝐿𝑐𝑜𝑛𝑓 𝑥, 𝑐 + 𝛼𝐿𝑙𝑜𝑐 𝑥, 𝑙, 𝑔 }
誤差関数
https://qiita.com/mshinoda88/items/9770ee
671ea27f2c81a9
𝐼𝑜𝑈 =
𝑇𝑃
𝑇𝑃 + 𝐹𝑃 + 𝐹𝑁
> 0.5
でマッチしたとみなす
• 分類・位置推定の誤差関数の和で定義(論文中では𝛼 = 1)
𝐿 𝑥, 𝑐, 𝑙, 𝑔 =
1
𝑁
{𝐿𝑐𝑜𝑛𝑓 𝑥, 𝑐 + 𝛼𝐿𝑙𝑜𝑐 𝑥, 𝑙, 𝑔 }
誤差関数
交差エントロピー誤差
何らかのBoxとマッチしたxはここで計算
one-hot出力なので分類ミスの場合は1になる
何のBoxともマッチしない場合はここで計算
背景だと認識していれば=1で最小化する
softmax誤差
• 分類・位置推定の誤差関数の和で定義(論文中では𝛼 = 1)
𝐿 𝑥, 𝑐, 𝑙, 𝑔 =
1
𝑁
{𝐿𝑐𝑜𝑛𝑓 𝑥, 𝑐 + 𝛼𝐿𝑙𝑜𝑐 𝑥, 𝑙, 𝑔 }
誤差関数
smoothL1誤差
𝑠𝑚𝑜𝑜𝑡ℎ𝐿1
𝑥 =
0.5𝑥2
( 𝑥 < 1)
𝑥 − 0.5 (𝑜𝑡ℎ𝑒𝑟𝑤𝑖𝑠𝑒)
𝑙: 予測結果B-Boxの
𝑔:正解B-BOXの
𝑑: default B-BOXの
{𝑥, 𝑦, 𝑤𝑖𝑑𝑡ℎ, ℎ𝑒𝑖𝑔ℎ𝑡}
スコアとカスタマイズ
VGG16を組み替えることで
目的に応じた物体検出モデルとして活用可能
MobileNet-SSDが有名かも
Faster R-CNNと同等の精度
YOLO(VGG16)より高速
Let’s 物体検出
https://github.com/urban-side/pytorch-ssd
参考文献
• 物体検出についての歴史まとめ(1)https://qiita.com/mshinoda88/items/9770ee671ea27f2c81a9
• 物体検出で使われる評価指標mAP について解説 https://qiita.com/mshinoda88/items/9770ee671ea27f2c81a9
• 【物体検出】mAP( mean Average Precision ) の算出方法 https://qiita.com/cv_carnavi/items/08e11426e2fac8433fed
• Histograms oforiented gradients for human detection https://ieeexplore.ieee.org/document/1467360
• 局所特徴量と統計学習手法による物体検出|中部大学 https://www.slideshare.net/MPRG_Chubu_University/ss-32258845
• Rich feature hierarchies for accurate object detection andsemantic segmentation https://arxiv.org/abs/1311.2524
• Segmentation as Selective Search for Object Recognition https://ivi.fnwi.uva.nl/isis/publications/2011/vandeSandeICCV2011/vandeSandeICCV2011.pdf
• Non-Maximum Suppressionを世界一わかりやすく解説する https://meideru.com/archives/3538
参考文献
• R-CNNの原理とここ数年の流れ https://www.slideshare.net/KazukiMotohashi2/rcnn
• Fast R-CNN https://arxiv.org/pdf/1504.08083.pdf
• Spatial PyramidPooling in Deep Convolutional Networks for Visual Recognition https://arxiv.org/pdf/1406.4729.pdf
• 概論&全体的な研究トレンドの概観②(FastRCNN、FasterRCNN、YOLO、SSD)|物体検出(Object Detection)の研究トレンドを
俯瞰する#2 https://lib-arts.hatenablog.com/entry/object_detection2
• 物体検知問題とFasterR-CNNのある種の進化論的な再記述について|FastR-CNNの誤差関数設計 https://accel-brain.co.jp/machine-learning/a-kind-
of-theory-of-evolution-for-object-detection-problem-and-faster-r-cnn/#Fast_R-CNN1
• Faster R-CNN: TowardsReal-Time Object Detection with Region Proposal Networks https://arxiv.org/pdf/1506.01497.pdf
• Faster R-CNNにおけるRPNの世界一分かりやすい解説 https://is.gd/qzboLi
参考文献
• [DL輪読会]YOLO9000:Better, Faster, Stronger https://www.slideshare.net/DeepLearningJP2016/dl-reading-paper20170804pdf
• You Only Look Once: Unified, Real-Time Object Detection https://arxiv.org/abs/1506.02640.pdf
• Introduction toYOLO detection model https://www.slideshare.net/ssuser07aa33/introduction-to-yolo-detection-model
• SSD:Single Shot MultiBox Detector https://arxiv.org/abs/1512.02325.pdf
• 物体検出アルゴリズムSSDを読解するpart2 https://qiita.com/hiroqik/items/2f602913a0363f2c9ee9

物体検出の歴史(R-CNNからSSD・YOLOまで)