3788字13圖,預計閱讀需要23分鐘
紅色華誕68周年 Day of the 's of China
作 者:張 旭
編 輯:李文臣
R-CNN提出于2014年,應當算是卷積神經網絡在目標檢測任務中的開山之作了,當然同年間還有一個算法,在這里暫不討論。在之后的幾年中,目標檢測任務的CNN模型也越來越多,實時性與準確率也越來越好,但是最為經典的模型還是很值得學習的。
那么下面就正式開始吧
對于R-CNN模型,個人是這樣理解,它其實是將4個應用于不同任務的已有的算法很好的結合了起來,最終在目標檢測任務中取得了不錯的效果,這種結合更像是偏向于工程的方法,而不是在算法上的一種突破,當然在后續的Fast-RCNN與-RCNN中模型逐步完善并整合成為一個模型,但是在R-CNN中是沒有的。所以R-CNN由4個部分構成,它們分別是:
1.區域建議算法(ss)
2.特征提取算法()
3.線性分類器(線性SVM)
4.邊界框修正回歸模型( box)
區域建議算法
首先是區域建議( )算法,這個東西在CNN之前就已經有了,而且算法不止一種,ss( )算法是比較著名的一個,此外還有,MSER,MCG等等算法,中對這幾種算法做了一個簡單的介紹,感興趣的話可以移步到第16課時。
那么ss算法在R-CNN中有什么用呢?這要從目標檢測任務開始談起,在一副圖像中要實現目標檢測任務,一種最簡單的思路是如果建立滑動窗,對每次滑動窗提取出來的圖像做分類svm cnn 行人檢測 比較,如果分類結果恰好是目標的話,就實現了檢測啦,目標的屬性由分類器給,目標的位置由滑動窗給。但是考慮到一次滑動遍歷產生的子圖像數量就不小了,同時還有不同步長和窗口尺寸的情況,此時產生的待分類圖像是非常多的,這種方式顯然沒什么實用價值,于是就有了ss算法,一種根據圖像自身信息產生推薦區域的算法,它大概會產生1000-2000個潛在目標區域,照比滑動遍歷的方式,這個數量已經減少了很多了。
特征提取算法
這里的特征提取算法其實就是卷積神經網絡,R-CNN中使用的是,但是作者(Ross)并沒有把當做分類器來使用,而是只用了網絡的特征層做ss算法輸出的圖像的特征提取工作,如果想要了解的話,可以參考從理解卷積神經網絡的一般結構,然后第7層特征給了SVM分類器,第五次特征給了 Box回歸模型。
線性分類器
R-CNN使用了線性SVM分類器,這個沒啥好說的,機器學習中很牛的算法了,如果想要了解請移步如何理解支持向量機的最大分類間隔,需要說明的是,目標檢測任務是有分類的功能的,比如一個任務是檢測貓和狗,那么除了要框出貓和狗的位置之外,也需要判斷是貓還是狗,這也是SVM在R-CNN中的作用。所以待檢測物體有幾類,那么就應該有幾個二分類的SVM分類器,在上面的例子中,就需要兩個二分類分類器了,分別是“貓-非貓”模型和“狗-非狗”模型,在R-CNN中,分類器有20個,它的輸入特征是提取到的fc7層特征。
邊界框修正回歸模型
box也是個古老的話題了,計算機視覺常見任務中,在分類與檢測之間還有一個定位任務,在一副圖像中只有一個目標,然后把這個目標框出來,用到的就是 box回歸模型。在R-CNN中, box的作用是修正ss推薦的區域的邊界,輸入的特征是的第五層特征,與SVM分類器一樣,它也是每一個類別都有一個模型,一共20個。上文,我們分別介紹了R-CNN的四個部分和他們的作用,可以看到,其實都是之前的東西,但是R-CNN的成功之處在于找到一種訓練與測試的方法,把這四個部分結合了起來,而準確率大幅提升的原因在于CNN的引入。我們參考下HOG+SVM做行人檢測的方法,HOG就是一種手工特征,而在R-CNN中換成了CNN提取特征。
所以個人的看法是理解R-CNN的關鍵不在于上面提到的四個算法本身,而是它們在R-CNN到底是怎么訓練和測試的!
R-CNN的訓練
R-CNN訓練了CNN,SVM與 box三個模型svm cnn 行人檢測 比較,因為ss算法用不著訓練,哈哈~^.^~。ss在生成了1000-2000個推薦區域之后,就和訓練任務沒啥關系了,訓練樣本是由ss區域生成出來的子圖構建起來的。而且三個部分的訓練時獨立的,并沒有整合在一起。
1.訓練CNN
CNN是在上pre-train的模型,在R-CNN中進行fine-tune,fine-tune的過程是將的改為任務需要的類別數,然后還是當做一個分類模型來訓練,訓練樣本的構建使用ss生成的子圖,當這些圖與實際樣本的框(-truth)的IoU大于等于0.5時,認為是某一個類的正樣本,這樣的類一共有20個;IoU小于0.5時,認為是負樣本。然后就可以做pre-train了,pre-train之后的層就被扔掉了,只剩下訓練后的參數,這套參數就用來做特征提取。
2.訓練SVM
之前提到了,SVM的輸入特征是 fc7的輸出,然后SVM做二分類,一個有20個SVM模型。那么對于其中某一個分類器來說,它的正樣本是所有-truth區域經過后輸出的特征,負樣本是與-truth區域重合IoU小于0.3的區域經過后輸出的特征,特征和標簽確定了,就可以訓練SVM了。
3.訓練 box回歸模型
box回歸模型也是20個,還是拿其中一個來說,它的輸入是 conv5的特征,注意這里的20指的是類的個數,但是對一個 box來說,它有4套參數,因為一個 box回歸模型分別對4個數做回歸,這4個數是表征邊界框的四個值,模型的損失函數如下:
其中i是樣本個數,*就是4個數,他們分別是x,y,w,h,其中(x,y)是中心位置,(w,h)是寬和高;P是ss給出來的區域,它由Px,Py,Pw,Ph四個數決定,這個區域經過后再第五層輸出特征,然后在特征每一個維度前都訓練一個參數w,一組特征就有一組w,隨4組做回歸就有4組w;最后一個數就是t,它同樣有4個數tx,ty,tw,th,是這樣計算出來的:
而G就是經過修正后的邊界框,它還是4個數Gx,Gy,Gw,Gh。通過上面的公式可以看到,t是邊界框的偏差。最后就是到底什么樣的ss區域能夠作為輸入,在這里是IoU大于0.6的。用一句話總結 box回歸模型就是:對于某一個類的回歸模型而言,用IoU>0.6的ss區域經過卷積后作為輸入特征,用同一組特征分別訓練4組權值與之對應,對邊界框四個屬性值分別做回歸。
經過上面三個獨立的部分,R-CNN的訓練就完成了,可以看到,確實是非常麻煩,這不僅僅體現在速度慢上,過程也及其繁瑣,因為每一步都需要重新構建樣本。
R-CNN的測試
經過訓練的R-CNN就可以拿來做測試了,相比于R-CNN的訓練過程,測試過程還是很簡單的,因為對于一張圖片而言它可以一次性完成的,它有下面幾步:
1.ss算法提取1000-2000個區域;
2.對所有的區域做尺寸統一,為了CNN網絡能接受;
3.用網絡提出兩套特征,一個是fc7層的,一個是con5層的;
4.對于一個fc7區域的特征,分別過20個分類器,看看哪個分類器給的分數最高,以確定區域的類別,并把所有的區域一次操作;
5.對上述所有打好label的區域使用非極大值抑制操作,以獲取沒有冗余(重疊)的區域子集,經過非極大值抑制之后,就認為剩下的所有的區域都是最后要框出來的;
6.重新拿回第5步剩下的區域con5層的特征,送入 box模型,根據模型的輸出做出一次修正;
7.根據SVM的結果打標簽,根據修正的結果畫框;
8.結束!!!!!!
PS
1.非極大值抑制在這里不介紹了;
2.如何根據 box模型的輸出做出修正:
模型輸出是四個值的偏差(比例),那么根據如下公式就能夠得到最后的位置:
(第五個公式就是 box模型)