Object detection是深度學習中一個重要的應用,如何將照片或是影片中重要的資訊擷取出來,例如識別物體並精確的標示物體位置
Paper Link
R-CNN :Ross Girshick, 2013 - UC Berkeley
Fast R-CNN : Ross Girshick, 2015 — Microsoft Reseach
Faster R-CNN : Shaoqing Ren, 2015 — Microsoft Reseach
Mask R-CNN : Kaiming He, 2017 — Facebook AI Research (FAIR)
RetinaNet : Tsung-Yi Lin, 2018 — Facebook AI Research (FAIR)
此篇文章為閱讀網路上各位大神的資訊經過筆者整理過後自認為比較好理解的筆記,因此部分內容有引用大神的文章,連結都附在文末,如有冒犯之處,請聯繫 ccshenyltw@gmail.com,或是在下方留言,我會盡快處理。
R-CNN (Region Convolution Neural Network)
R-CNN使用Selective Search找出2000–3000個region proposal,將取出的region proposal 壓縮成一樣大小之後再丟入CNN擷取特徵,利用SVM加以分類,並對bounding box做線性回歸。
演算法流程
- 使用Selective Search產生~2000可能區域 (Region proposal)
- 將每一個region proposal經過Crop/ Warp 後丟入已訓練完成的CNN得到固定維度的輸出(CNN feature)
- 利用SVM (Support Vector Machine)分類器區分屬於哪類
- 經由線性回歸模型校正bounding box position
Selective Search (強烈建議可以到這裡閱讀此文章)
Selective Search 的理論概念就是使用圖像分割(segmentation)後的結果,套用階層群聚演算法(hierarchical grouping algorithm),產生物體的候選區域(object proposal),最後再用 SVM 辨識物體。
物體在使用圖像分割時並沒有辦法使用單一尺度區分所有的情況,因此多尺度(Multi-scale)的區分方式就因此誕生。
以上兩圖為多尺度的範例
階層群聚演算法 (hierarchical grouping algorithm)
這裡比較需要注意的地方就是兩個區域的相似度 s(ri,rj)s(ri,rj) 該如何計算,由於計算效能的考量,我們在設計這個函數時最好可以讓 ri 與 rj 兩個區域在合併成 rt 之後,在後續計算相似度時,可以不需要重新以個別像素做計算。
相似度計算法分成四種特徵分別計算相似度最後已綜合相似度表示
1. 顏色相似度
2. 紋理相似度
3. 大小相似度
4. 形狀吻合相似度
R-CNN 問題
- R-CNN 一開始必須產生~2000個region proposal,每個區域都要放入CNN提取特徵,有很多重複運算的部分非常花時間 (總共有三個模型 )
a). 用於提取特徵的CNN
b). 辨識候選區域的SVM
c). 調整邊界的回歸模型 - 在將候選區域放入CNN前需要先將候選區域重新調整尺寸至227 x 227
- CNN提取特徵的層數較高,因此候選區域對於小區域較不敏感
- 需要對bounding box訓練線性回歸模型以便回歸物體精確的位置
最後再回想一下R-CNN整體的架構,下圖為筆者認為比較好理解的架構示意圖
Fast R-CNN
Fast R-CNN其實就是為了解決R-CNN運算效能的問題而優化的演算法,R-CNN計算2000個Region proposal 放入CNN需要個別運算很多重複的區域,而Fast R-CNN就只算了一次CNN,再將CNN擷取出來的特徵讓2000個Region proposal做運用,再利用RoIpooling (Region of Interest Pooling)的將取出的Region 對應到Feature map輸出後各自接上FC去做softmax分類及bbox regressor。
Fast R-CNN的細節
- Fast R-CNN一樣需要使用Selective Search選出~2000個Region proposal
- 只需要計算一次CNN ,利用RoIpooling對應到Feature map,因為region proposal的xyhw通常是小數,因此在對應Feature map之前會先取一次整數,整數化後的邊界平均分割成k x k個單元,對每一個單元的邊界做整數化如下圖,經過取整數之後,特徵位置和feature map 所對應的位置就會有所偏差,後來就演進了RoIAlign。
Faster R-CNN
強烈建議閱讀『一文读懂Faster RCNN』,這篇文章基本把所有Faster R-CNN的細節講解得淋漓盡致,以下為閱讀上述文章之後的筆記
上圖為Faster R-CNN的架構,Faster R-CNN基本上可以分為四個部分
- Conv layers:
將input image [P, Q]reshape 成 [M, N],並記錄rescale factor在im_info裡作為proposal layer 到RoIPooling對齊位置所需要的資訊,經過13 conv, 13 relu, 4 maxpooling 提取feature map - Region Proposal Network:
與Fast R-CNN最大的不同在於使用RPN生成region proposals,RPN使用softmax判別positive anchor及negative anchor,並使用bbox regression 修正anchor 的位置資訊得到更精準的位置 - RoIPooling:收集feature maps 與 RPN的結果,綜合資訊後送入FC進行訓練
- Classification:
利用RoIPooling輸入的數值進行分類以及對bbox regression以獲得最佳物體位置
Details
Conv layers:
- 所有的conv層都是: kernel size =3, pad=1, stride=1 -> 使得經過conv層後影像大小不變。
- 所有的pooling層都是: kernel size =2, pas=0, stride=2->濃縮影像資訊,在上圖中代表經過4次pooling過程,因此feature map的大小即為[M/(2⁴),N/(2⁴)]
Region Proposal Network:
- 過去R-CNN, Fast R-CNN都是使用Selective Search(SS)非常消耗時間,Faster R-CNN直接使用NN來尋找Positive anchor生成region proposal,相對SS是個極大的推進
上圖代表了RPN的架構,RPN需要了解的大致上分為兩個部分anchor的選擇以及anchor的定位,以下有較清楚的說明。
Anchor box
如文中所提,anchor box其實就是一個維度為[N, 4]的矩陣,舉例如下,若有九個種anchor box,四個值分別代表(x1,y1,x2,y2),代表box的左上和右下座標位置,anchor box 的尺寸設定會根據輸入影像大小做調整。
[[ -84. -40. 99. 55.]
[-176. -88. 191. 103.]
[-360. -184. 375. 199.]
[ -56. -56. 71. 71.]
[-120. -120. 135. 135.]
[-248. -248. 263. 263.]
[ -36. -80. 51. 95.]
[ -80. -168. 95. 183.]
[-168. -344. 183. 359.]]
Faster R-CNN原文中的圖如上,同一個點上有k個anchor box,每個點需要判斷是否為positive or negative,因此就有cls = 2k scores,每個anchor box座標也需要做回歸校正,因此就有了reg = 4k coordinates,
回到RPN,其實說白了RPN不過就是在原圖上布滿了anchor,再用CNN (VGG16 , ResNet50...etc)去分辨哪些anchor是positive在輸出,僅此而已。
在原文中提到了anochor的數量採樣方式方式就不再贅述,下面這張圖應該能夠清楚表達anchor box的取樣方式。
anchor classification(cls):
18這個數值是有意義的,在鑑別每一個anchor時會檢測9個anchor box,同時個別會有positive及negative的分數,合起來就是18個值,RPN很聰明的利用1x1 kernel 展開18個數值。
bounding box regression(reg)
如下圖所示,紅色為positive anchor,綠色為ground truth,即使紅色區域被辨識為飛機,但因為紅色框框的定位效果不佳,因此在IOU的表現不佳,等於並沒有正確的偵測出飛機,因此有了 bounding box regression
在Fast R-CNN的第一段bbox regression架構如下圖
和anchor classification一樣,在鑑別anchor box時有9個分別有4個位置,乘起來就是36。
Proposal Layer
Proposal layer 輸入值為(以文中為例)
- rpn_cls_prob_reshape : anchor positive negative result
- rpn_bbox_pre : dbbox regression
- im_inf : oinput image [P, Q]裁減之後 變為[M,N]的scale factor,以及總共做了幾次pooling
Proposal layer 所做的流程如下
- 生成anchors,並對所有的anchors做bbox regression
- 按照輸入的positive softmax scores 排序並挑出需要的anchors(修正位置過後)
- 限定超出圖像邊界的positive anchors為圖像邊界以防後續的RoIpooling超出範圍
- 除去邊界範圍極小的positive anchors
- 進行non-maximum suppression,將判別同一物體的anchors只取判斷機率最高的anchor
6. 輸出proposal = [x1, y1, x2, y2]
輸出的proposal 結果再作為RoIpooling的輸入
Classification
從RoIpooling後得到7x7 大小的feature map後送入FC分別計算 bbox_pred (regression)和 cls_prob。
後續有關訓練細節可以參見原文,這裡就不再贅述。
Note : 筆者尚在學習,如果內文有任何問題或錯誤歡迎多加指教。
參考資料