R-CNN簡介
R-CNN提出於2014年,應當算是卷積神經網路在目標檢測任務中的開山之作了,當然同年間還有一個overfeat演算法,在這裡暫不討論。
在之後的幾年中,目標檢測任務的CNN模型也越來越多,實時性與準確率也越來越好,但是最為經典的模型還是很值得學習的。
那麼下面就正式開始吧:
對於R-CNN模型,個人是這樣理解,它其實是將4個應用於不同任務的已有的演算法很好的結合了起來,最終在目標檢測任務中取得了不錯的效果,這種結合更像是偏向於工程的方法,而不是在演算法上的一種突破,當然在後續的Fast-RCNN與Faster-RCNN中模型逐步完善並整合成為一個模型,但是在R-CNN中是沒有的。
所以R-CNN由4個部分構成,它們分別是:
1.區域建議演算法(ss)
2.特徵提取演算法(AlexNet)
3.線性分類器(線性SVM)
4.邊界框修正迴歸模型(Bounding box)
區域建議演算法:
首先是區域建議(Region Proposal)演算法,這個東西在CNN之前就已經有了,而且演算法不止一種,ss(selective search)演算法是比較著名的一個,此外還有EdgeBox,MSER,MCG等等演算法。
那麼ss演算法在R-CNN中有什麼用呢?這要從目標檢測任務開始談起,在一副影像中要實現目標檢測任務,一種最簡單的思路是如果建立滑動窗,對每次滑動窗提取出來的影像做分類,如果分類結果恰好是目標的話,就實現了檢測啦,目標的屬性由分類器給,目標的位置由滑動窗給。但是考慮到一次滑動遍歷產生的子影像數量就不小了,同時還有不同步長和視窗尺寸的情況,此時產生的待分類影像是非常多的,這種方式顯然沒什麼實用價值,於是就有了ss演算法,一種根據影像自身資訊產生推薦區域的演算法,它大概會產生1000-2000個潛在目標區域,照比滑動遍歷的方式,這個數量已經減少了很多了。
特徵提取演算法:
這裡的特徵提取演算法其實就是卷積神經網路,R-CNN中使用的是AlexNet,但是作者(Ross)並沒有把AlexNet當做分類器來使用,而是隻用了網路的特徵層做ss演算法輸出的影像的特徵提取工作,然後第7層特徵給了SVM分類器,第五次特徵給了Bounding Box迴歸模型。
線性分類器:
R-CNN使用了線性SVM分類器,這個沒啥好說的,機器學習中很牛的演算法了,需要說明的是,目標檢測任務是有分類的功能的,比如一個任務是檢測貓和狗,那麼除了要框出貓和狗的位置之外,也需要判斷是貓還是狗,這也是SVM在R-CNN中的作用。所以待檢測物體有幾類,那麼就應該有幾個二分類的SVM分類器,在上面的例子中,就需要兩個二分類分類器了,分別是“貓-非貓”模型和“狗-非狗”模型,在R-CNN中,分類器有20個,它的輸入特徵是AlexNet提取到的fc7層特徵。
邊界框修正迴歸模型:
Bounding box也是個古老的話題了,計算機視覺常見任務中,在分類與檢測之間還有一個定位任務,在一副影像中只有一個目標,然後把這個目標框出來,用到的就是Bounding box迴歸模型。
在R-CNN中,Bounding box的作用是修正ss推薦的區域的邊界,輸入的特徵是AlexNet的第五層特徵,與SVM分類器一樣,它也是每一個類別都有一個模型,一共20個。
在上面,我們分別介紹了R-CNN的四個部分和他們的作用,可以看到,其實都是之前的東西,但是R-CNN的成功之處在於找到一種訓練與測試的方法,把這四個部分結合了起來,而準確率大幅提升的原因在於CNN的引入。我們參考下HOG+SVM做行人檢測的方法,HOG就是一種手工特徵,而在R-CNN中換成了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個數是表徵邊界框的四個值,模型的損失函式如下:
其中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,是這樣計算出來的:
而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出現了質的飛躍:
但是R-CNN也有一個很致命的缺陷,超長的訓練時間和測試時間:
訓練時間需要84個小時,如果說訓練時間還不是那麼重要的話,那麼單張圖片的測試時間長達47s,這個缺陷使R-CNN失去了實用性,好在後續的各種演算法對其進行了改進,這個我們後面在提。
補充
1.非極大值抑制在這裡不介紹了;
2.如何根據Bounding box模型的輸出做出修正:
模型輸出是四個值的偏差(比例),那麼根據如下公式就能夠得到最後的位置
第五個公式就是Bounding box模型。
深度學習目標檢測(object detection)系列(二):quant.la/Article/Vie…