天天看點

[Intensive Reading]目标檢測(object detection)系列(一) R-CNN:CNN目标檢測的開山之作簡介 :CNN目标檢測的開山之作R-CNN原理R-CNN性能評價補充

[Intensive Reading]目标檢測(object detection)系列(一) R-CNN:CNN目标檢測的開山之作簡介 :CNN目标檢測的開山之作R-CNN原理R-CNN性能評價補充

目标檢測系列:

目标檢測(object detection)系列(一) R-CNN:CNN目标檢測的開山之作

目标檢測(object detection)系列(二) SPP-Net:讓卷積計算可以共享

目标檢測(object detection)系列(三) Fast R-CNN:end-to-end的愉快訓練

目标檢測(object detection)系列(四) Faster R-CNN:有RPN的Fast R-CNN

目标檢測(object detection)系列(五) YOLO:目标檢測的另一種打開方式

目标檢測(object detection)系列(六) SSD:兼顧效率和準确性

目标檢測(object detection)系列(七) R-FCN:位置敏感的Faster R-CNN

目标檢測(object detection)系列(八) YOLOv2:更好,更快,更強

目标檢測(object detection)系列(九) YOLOv3:取百家所長成一家之言

目标檢測(object detection)系列(十) FPN:用特征金字塔引入多尺度

目标檢測(object detection)系列(十一) RetinaNet:one-stage檢測器巅峰之作

目标檢測(object detection)系列(十二) CornerNet:anchor free的開端

目标檢測(object detection)系列(十三) CenterNet:no Anchor,no NMS

目标檢測(object detection)系列(十四)FCOS:用圖像分割處理目标檢測

目标檢測擴充系列:

目标檢測(object detection)擴充系列(一) Selective Search:選擇性搜尋算法

目标檢測(object detection)擴充系列(二) OHEM:線上難例挖掘

目标檢測(object detection)擴充系列(三) Faster R-CNN,YOLO,SSD,YOLOv2,YOLOv3在損失函數上的差別

簡介 :CNN目标檢測的開山之作

R-CNN提出于2014年,應當算是卷積神經網絡在目标檢測任務中的開山之作了,當然同年間還有一個overfeat算法,在這裡暫不讨論。R-CNN的論文是《Rich feature hierarchies for accurate oject detection and semantic segmentation》,在之後的幾年中,目标檢測任務的CNN模型也越來越多,實時性與準确率也越來越好,但是最為經典的模型還是很值得學習的。

R-CNN原理

設計理念

對于R-CNN模型,它其實是将4個應用于不同任務的已有的算法很好的結合了起來,最終在目标檢測任務中取得了不錯的效果,這種結合更像是偏向于工程的方法,而不是在算法上的一種突破,當然在後續的Fast-RCNN與Faster-RCNN中模型逐漸完善并整合成為一個模型,但是在R-CNN中是沒有的。

是以R-CNN由4個部分構成,它們分别是:

  • 區域建議算法(ss)
  • 特征提取算法(AlexNet)
  • 線性分類器(線性SVM)
  • 邊界框修正回歸模型(Bounding box)

區域建議算法

首先是區域建議(Region Proposal)算法,這個東西在CNN之前就已經有了,而且算法不止一種,ss(selective search)算法是比較著名的一個,此外還有EdgeBox,MSER,MCG等等算法,CS231n中對這幾種算法做了一個簡單的介紹,感興趣的話可以移步到CS231n第16課時。

那麼ss算法在R-CNN中有什麼用呢?這要從目标檢測任務開始談起,在一副圖像中要實作目标檢測任務,一種最簡單的思路是如果建立滑動窗,對每次滑動窗提取出來的圖像做分類,如果分類結果恰好是目标的話,就實作了檢測啦,**目标的屬性由分類器給,目标的位置由滑動窗給。**但是考慮到一次滑動周遊産生的子圖像數量就不小了,同時還有不同步長和視窗尺寸的情況,此時産生的待分類圖像是非常多的,這種方式顯然沒什麼實用價值,于是就有了ss算法,一種根據圖像自身資訊産生推薦區域的算法,它大概會産生1000-2000個潛在目标區域,照比滑動周遊的方式,這個數量已經減少了很多了。

特征提取算法

這裡的特征提取算法其實就是卷積神經網絡,R-CNN中使用的是AlexNet,但是作者(Ross)并沒有把AlexNet當做分類器來使用,而是隻用了網絡的特征層做ss算法輸出的圖像的特征提取工作,如果想要了解AlexNet的話,可以參考從AlexNet了解卷積神經網絡的一般結構,然後第7層特征給了SVM分類器,第五次特征給了Bounding Box回歸模型。

線性分類器

R-CNN使用了線性SVM分類器,這個沒啥好說的,機器學習中很牛的算法了,如果想要了解請移步如何了解支援向量機的最大分類間隔,需要說明的是,目标檢測任務是有分類的功能的,比如一個任務是檢測貓和狗,那麼除了要框出貓和狗的位置之外,也需要判斷是貓還是狗,這也是SVM在R-CNN中的作用。是以待檢測物體有幾類,那麼就應該有幾個二分類的SVM分類器,在上面的例子中,就需要兩個二分類分類器了,分别是“貓-非貓”模型和“狗-非狗”模型,在R-CNN中,分類器有20個,它的輸入特征是AlexNet提取到的fc7層特征。

邊界框修正回歸模型

Bounding box也是個古老的話題了,計算機視覺常見任務中,在分類與檢測之間還有一個定位任務,在一副圖像中隻有一個目标,然後把這個目标框出來,用到的就是Bounding box回歸模型。

[Intensive Reading]目标檢測(object detection)系列(一) R-CNN:CNN目标檢測的開山之作簡介 :CNN目标檢測的開山之作R-CNN原理R-CNN性能評價補充

在R-CNN中,Bounding box的作用是修正ss推薦的區域的邊界,輸入的特征是AlexNet的第五層特征,與SVM分類器一樣,它也是每一個類别都有一個模型,一共20個。

在上面,我們分别介紹了R-CNN的四個部分和他們的作用,可以看到,其實都是之前的東西,但是R-CNN的成功之處在于找到一種訓練與測試的方法,把這四個部分結合了起來,而準确率大幅提升的原因在于CNN的引入。我們參考下HOG+SVM做行人檢測的方法,HOG就是一種手工特征,而在R-CNN中換成了CNN提取特征。

[Intensive Reading]目标檢測(object detection)系列(一) R-CNN:CNN目标檢測的開山之作簡介 :CNN目标檢測的開山之作R-CNN原理R-CNN性能評價補充

是以個人的看法是了解R-CNN的關鍵不在于上面提到的四個算法本身,而是它們在R-CNN到底是怎麼訓練和測試的!

R-CNN的訓練

R-CNN訓練了CNN,SVM與Bounding box三個模型,因為ss算法用不着訓練,哈哈~~

ss在生成了1000-2000個推薦區域之後,就和訓練任務沒啥關系了,訓練樣本是由ss區域生成出來的子圖建構起來的。

而且三個部分的訓練時獨立的,并沒有整合在一起。

1.訓練CNN

CNN是在ImageNet上pre-train的AlexNet模型,在R-CNN中進行fine-tune,fine-tune的過程是将AlexNet的Softmax改為任務需要的類别數,然後還是當做一個分類模型來訓練,訓練樣本的建構使用ss生成的子圖,當這些圖與實際樣本的框(Ground-truth)的IoU大于等于0.5時,認為是某一個類的正樣本,這樣的類一共有20個;IoU小于0.5時,認為是負樣本。然後就可以AlexNet做pre-train了,pre-train之後AlexNet的Softmax層就被扔掉了,隻剩下訓練後的參數,這套參數就用來做特征提取。

2.訓練SVM

之前提到了,SVM的輸入特征是AlexNet fc7的輸出,然後SVM做二分類,一個有20個SVM模型。那麼對于其中某一個分類器來說,它的正樣本是所有Ground-truth區域經過AlexNet後輸出的特征,負樣本是與Ground-truth區域重合IoU小于0.3的區域經過AlexNet後輸出的特征,特征和标簽确定了,就可以訓練SVM了。

3.訓練Bounding box回歸模型

Bounding box回歸模型也是20個,還是拿其中一個來說,它的輸入是AlexNet conv5的特征,注意這裡的20指的是類的個數,但是對一個Bounding box來說,它有4套參數,因為一個Bounding box回歸模型分别對4個數做回歸,這4個數是表征邊界框的四個值,模型的損失函數如下:

[Intensive Reading]目标檢測(object detection)系列(一) R-CNN:CNN目标檢測的開山之作簡介 :CNN目标檢測的開山之作R-CNN原理R-CNN性能評價補充

其中i是樣本個數,*就是4個數,他們分别是x,y,w,h,其中(x,y)是中心位置,(w,h)是寬和高;P是ss給出來的區域,它由Px,Py,Pw,Ph四個數決定,這個區域經過AlexNet後再第五層輸出特征,然後在特征每一個次元前都訓練一個參數w,一組特征就有一組w,随4組做回歸就有4組w;最後一個數就是t,它同樣有4個數tx,ty,tw,th,是這樣計算出來的:

[Intensive Reading]目标檢測(object detection)系列(一) R-CNN:CNN目标檢測的開山之作簡介 :CNN目标檢測的開山之作R-CNN原理R-CNN性能評價補充

而G就是經過修正後的邊界框,它還是4個數Gx,Gy,Gw,Gh。通過上面的公式可以看到,t是邊界框的偏差。

最後就是到底什麼樣的ss區域能夠作為輸入,在這裡是IoU大于0.6的。

用一句話總結Bounding box回歸模型就是:對于某一個類的回歸模型而言,用IoU>0.6的ss區域經過卷積後作為輸入特征,用同一組特征分别訓練4組權值與之對應,對邊界框四個屬性值分别做回歸。

經過上面三個獨立的部分,R-CNN的訓練就完成了,可以看到,确實是非常麻煩,這不僅僅展現在速度慢上,過程也及其繁瑣,因為每一步都需要重新建構樣本。

R-CNN的測試

經過訓練的R-CNN就可以拿來做測試了,測試過程還是可以一次完成的,它有下面幾步:

1.ss算法提取1000-2000個區域;

2.對所有的區域做歸一化,為了CNN網絡能接受;

3.用AlexNet網絡提出兩套特征,一個是fc7層的,一個是con5層的;

4.對于一個fc7區域的特征,分别過20個分類器,看看哪個分類器給的分數最高,以确定區域的類别,并把所有的區域一次操作;

5.對上述所有打好label的區域使用非極大值抑制操作,以擷取沒有備援(重疊)的區域子集,經過非極大值抑制之後,就認為剩下的所有的區域都是最後要框出來的;

6.重新拿回第5步剩下的區域con5層的特征,送入Bounding box模型,根據模型的輸出做出一次修正;

7.根據SVM的結果打标簽,根據修正的結果畫框;

8.結束!!!!!!

R-CNN性能評價

R-CNN的出現使計算機視覺中的目标檢測任務的性能評價map出現了質的飛躍:

[Intensive Reading]目标檢測(object detection)系列(一) R-CNN:CNN目标檢測的開山之作簡介 :CNN目标檢測的開山之作R-CNN原理R-CNN性能評價補充

但是R-CNN也有一個很緻命的缺陷,超長的訓練時間和測試時間:

訓練時間需要84個小時,如果說訓練時間還不是那麼重要的話,那麼單張圖檔的測試時間長達47s,這個缺陷使R-CNN失去了實用性,好在後續的各種算法對其進行了改進,這個我們後面在提。

補充

1.非極大值抑制在這裡不介紹了;

2.如何根據Bounding box模型的輸出做出修正:

模型輸出是四個值的偏差(比例),那麼根據如下公式就能夠得到最後的位置

[Intensive Reading]目标檢測(object detection)系列(一) R-CNN:CNN目标檢測的開山之作簡介 :CNN目标檢測的開山之作R-CNN原理R-CNN性能評價補充

第五個公式就是Bounding box模型。