深度学习(十五)——SPPNet, Fast R-CNN
https://antkillerfarm.github.io/
RCNN(續(xù))
RCNN算法的基本流程
RCNN算法分為4個步驟:
Step 1:候選區(qū)域生成。一張圖像生成1K~2K個候選區(qū)域(采用Selective Search方法)。
Step 2:特征提取。對每個候選區(qū)域,使用深度卷積網(wǎng)絡提取特征(CNN)。
Step 3:類別判斷。特征送入每一類的SVM分類器,判別是否屬于該類。
Step 4:位置精修。使用回歸器精細修正候選框位置。
Selective Search
論文:
https://www.koen.me/research/pub/uijlings-ijcv2013-draft.pdf
Selective Search for Object Recognition
Selective Search的主要思想:
Step 1:使用一種過分割手段,將圖像分割成小區(qū)域 (1k~2k個)。
這里的步驟實際上并不簡單,可參考論文:
《Efficient Graph-Based Image Segmentation》
中文版:
http://blog.csdn.net/surgewong/article/details/39008861
Step 2:查看現(xiàn)有小區(qū)域,按照合并規(guī)則合并可能性最高的相鄰兩個區(qū)域。重復直到整張圖像合并成一個區(qū)域位置。
Step 3:輸出所有曾經(jīng)存在過的區(qū)域,所謂候選區(qū)域。
其中合并規(guī)則如下:優(yōu)先合并以下四種區(qū)域:
1.顏色(顏色直方圖)相近的。
2.紋理(梯度直方圖)相近的。
3.合并后總面積小的:保證合并操作的尺度較為均勻,避免一個大區(qū)域陸續(xù)“吃掉”其他小區(qū)域(例:設(shè)有區(qū)域a-b-c-d-e-f-g-h。較好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh)
4.合并后,總面積在其bounding box中所占比例大的:保證合并后形狀規(guī)則。
Step2和Step3可參考論文:
《Selective Search for Object Recognition》
中文版:
http://blog.csdn.net/surgewong/article/details/39316931
http://blog.csdn.net/charwing/article/details/27180421
Selective Search的效果類似下圖:
上圖中的那些方框,就是bounding box。
一般使用IOU(Intersection over Union,交并比)指標,來衡量兩個bounding box的重疊度:
IOU(A,B)=A∩BA∪B
非極大值抑制(NMS)
RCNN會從一張圖片中找出n個可能是物體的矩形框,然后為每個矩形框為做類別分類概率(如上圖所示)。我們需要判別哪些矩形框是沒用的。
Non-Maximum Suppression顧名思義就是抑制不是極大值的元素,搜索局部的極大值。這個局部代表的是一個鄰域,鄰域有兩個參數(shù)可變,一是鄰域的維數(shù),二是鄰域的大小。
下面舉例說明NMS的做法:
假設(shè)有6個矩形框,根據(jù)分類器的類別和分類概率做排序,假設(shè)從小到大屬于車輛的概率分別為A、B、C、D、E、F。
Step 1:從最大概率矩形框F開始,分別判斷A~E與F的重疊度IOU是否大于某個設(shè)定的閾值。(確定領(lǐng)域)
Step 2:假設(shè)B、D與F的重疊度超過閾值,那么就扔掉B、D;并標記第一個矩形框F,是我們保留下來的。(抑制領(lǐng)域內(nèi)的非極大值)
Step 3:從剩下的矩形框A、C、E中,選擇概率最大的E,然后判斷E與A、C的重疊度,重疊度大于一定的閾值,那么就扔掉;并標記E是我們保留下來的第二個矩形框。(確定下一個領(lǐng)域,并抑制該領(lǐng)域內(nèi)的非極大值)
參考:
http://mp.weixin.qq.com/s/Cg9tHG1YgDCdI3NPYl5-vQ
如何用Soft-NMS實現(xiàn)目標檢測并提升準確率
ground truth
在有監(jiān)督學習中,數(shù)據(jù)是有標注的,以(x,t)的形式出現(xiàn),其中x是輸入數(shù)據(jù),t是標注。正確的t標注是ground truth,錯誤的標記則不是。(也有人將所有標注數(shù)據(jù)都叫做ground truth)
在目標檢測任務中,ground truth主要包括box和category兩類信息。
正負樣本問題
一張照片我們得到了2000個候選框。然而人工標注的數(shù)據(jù)一張圖片中就只標注了正確的bounding box,我們搜索出來的2000個矩形框也不可能會出現(xiàn)一個與人工標注完全匹配的候選框。因此在CNN階段我們需要用IOU為2000個bounding box打標簽。
如果用selective search挑選出來的候選框與物體的人工標注矩形框的重疊區(qū)域IoU大于0.5,那么我們就把這個候選框標注成物體類別(正樣本),否則我們就把它當做背景類別(負樣本)。
使用SVM的問題
CNN訓練的時候,本來就是對bounding box的物體進行識別分類訓練,在訓練的時候,最后一層softmax就是分類層。那么為什么作者閑著沒事干要先用CNN做特征提取(提取fc7層數(shù)據(jù)),然后再把提取的特征用于訓練SVM分類器?
這個是因為SVM訓練和cnn訓練過程的正負樣本定義方式各有不同,導致最后采用CNN softmax輸出比采用SVM精度還低。
事情是這樣的,cnn在訓練的時候,對訓練數(shù)據(jù)做了比較寬松的標注,比如一個bounding box可能只包含物體的一部分,那么我也把它標注為正樣本,用于訓練cnn;采用這個方法的主要原因在于因為CNN容易過擬合,所以需要大量的訓練數(shù)據(jù),所以在CNN訓練階段我們是對Bounding box的位置限制條件限制的比較松(IOU只要大于0.5都被標注為正樣本了);
然而SVM訓練的時候,因為SVM適用于少樣本訓練,所以對于訓練樣本數(shù)據(jù)的IOU要求比較嚴格,我們只有當bounding box把整個物體都包含進去了,我們才把它標注為物體類別,然后訓練SVM。
CNN base
目標檢測任務不是一個獨立的任務,而是在目標分類基礎(chǔ)之上的進一步衍生。因此,無論何種目標檢測框架都需要一個目標分類的CNN作為base,僅對其最上層的FC層做一定的修改。
VGG、AlexNet都是常見的CNN base。
評價標準
目標檢測一般采用mAP(mean Average Precision)作為評價標準。AP的含義參見《機器學習(二十一)》。
對于多分類任務來說,每個分類都有一個AP,將這些AP平均(或加權(quán)平均)之后,就得到了mAP。
目前,目標檢測領(lǐng)域的mAP,一般以PASCAL VOC 2012的標準為準。文檔參見:
http://host.robots.ox.ac.uk/pascal/VOC/voc2012/devkit_doc.pdf
對于目標檢測任務來說,除了分類之外,還有box準確度的問題。一般IOU大于0.5的被認為是正樣本,反之則是負樣本。
PASCAL VOC還對P-R曲線的采樣做出規(guī)定。2012之前的標準中,P-R曲線只需要對recall值進行10等分采樣即可。而2012標準規(guī)定,對每個recall值都要進行采樣。
參考:
http://blog.sina.com.cn/s/blog_9db078090102whzw.html
多標簽圖像分類任務的評價方法-mAP
https://www.zhihu.com/question/41540197
mean average precision(MAP)在計算機視覺中是如何計算和應用的?
總結(jié)
參考
https://zhuanlan.zhihu.com/p/23006190
RCNN-將CNN引入目標檢測的開山之作
http://www.cnblogs.com/edwardbi/p/5647522.html
Tensorflow tflearn編寫RCNN
http://blog.csdn.net/u011534057/article/category/6178027
RCNN系列blog
http://blog.csdn.net/shenxiaolu1984/article/details/51066975
RCNN算法詳解
http://mp.weixin.qq.com/s/_U6EJBP_qmx68ih00IhGjQ
Object Detection R-CNN
SPPNet
SPPNet是何愷明2014年的作品。
論文:
《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》
在RCNN算法中,一張圖片會有1~2k個候選框,每一個都要單獨輸入CNN做卷積等操作很費時。而且這些候選框可能很多都是重合的,重復的CNN操作從信息論的角度,也是相當冗余的。
SPPNet的核心思想如上圖所示:在feature map上提取ROI特征,這樣就只需要在整幅圖像上做一次卷積。
這個想法說起來簡單,但落到實地,還有如下問題需要解決:
Problem 1:原始圖像的ROI如何映射到特征圖(一系列卷積層的最后輸出)。
這里的計算比較復雜,要點在于:選擇原始圖像ROI的左上角和右下角,將之映射到feature map上的兩個對應點,從而得到feature map上的ROI。
參見:
https://zhuanlan.zhihu.com/p/24780433
原始圖片中的ROI如何映射到到feature map?
http://www.cnblogs.com/objectDetect/p/5947169.html
卷積神經(jīng)網(wǎng)絡物體檢測之感受野大小計算
Problem 2:ROI的在特征圖上的對應的特征區(qū)域的維度不滿足全連接層的輸入要求怎么辦(又不可能像在原始ROI圖像上那樣進行截取和縮放)?
對于Problem 2我們分析一下:
這個問題涉及的流程主要有: 圖像輸入->卷積層1->池化1->…->卷積層n->池化n->全連接層。
引發(fā)問題的原因主要有:全連接層的輸入維度是固定死的,導致池化n的輸出必須與之匹配,繼而導致圖像輸入的尺寸必須固定。
解決辦法可能有:
1.想辦法讓不同尺寸的圖像也可以使池化n產(chǎn)生固定的輸出維度。(打破圖像輸入的固定性)
2.想辦法讓全連接層(罪魁禍首)可以接受非固定的輸入維度。(打破全連接層的固定性,繼而也打破了圖像輸入的固定性)
以上的方法1就是SPPnet的思想。
Step 1:為圖像建立不同尺度的圖像金字塔。上圖為3層。
Step 2:將圖像金字塔中包含的feature映射到固定尺寸的向量中。上圖為
(16+4+1)×256 維向量。總結(jié):
從上圖可以看出,由于卷積策略的不同,SPPnet的流程和RCNN也有一點微小的差異:
1.RCNN是先選擇區(qū)域,然后對區(qū)域進行卷積,并檢測。
2.SPPnet是先統(tǒng)一卷積,然后應用選擇區(qū)域,做區(qū)域檢測。
參考:
https://zhuanlan.zhihu.com/p/24774302
SPPNet-引入空間金字塔池化改進RCNN
http://kaiminghe.com/iccv15tutorial/iccv2015_tutorial_convolutional_feature_maps_kaiminghe.pdf
何愷明:Convolutional Feature Maps
Fast R-CNN
Fast R-CNN是Ross Girshick于2015年祭出的又一大招。
論文:
《Fast R-CNN》
代碼:
https://github.com/rbgirshick/fast-rcnn
上圖是Fast R-CNN的結(jié)構(gòu)圖。從該圖可以看出Fast R-CNN和SPPnet的主要差異在于:
1.使用ROI(Region of interest) Pooling,替換SPP。
2.去掉了SVM分類。
以下將對這兩個方面,做一個簡述。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的深度学习(十五)——SPPNet, Fast R-CNN的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习(十四)——Softmax详解,
- 下一篇: 深度学习(十六)——Faster R-C