深度學習目標檢測(object detection)系列(一) R-CNN

R-CNN簡介html

R-CNN提出於2014年,應當算是卷積神經網絡在目標檢測任務中的開山之做了,固然同年間還有一個overfeat算法,在這裏暫不討論。算法

在以後的幾年中,目標檢測任務的CNN模型也愈來愈多,實時性與準確率也愈來愈好,可是最爲經典的模型仍是很值得學習的。網絡

那麼下面就正式開始吧:機器學習

對於R-CNN模型,我的是這樣理解,它實際上是將4個應用於不一樣任務的已有的算法很好的結合了起來,最終在目標檢測任務中取得了不錯的效果,這種結合更像是偏向於工程的方法,而不是在算法上的一種突破,固然在後續的Fast-RCNN與Faster-RCNN中模型逐步完善並整合成爲一個模型,可是在R-CNN中是沒有的。函數

因此R-CNN由4個部分構成,它們分別是:性能

1.區域建議算法(ss)學習

2.特徵提取算法(AlexNet)測試

3.線性分類器(線性SVM)3d

4.邊界框修正迴歸模型(Bounding box)cdn

區域建議算法:

首先是區域建議(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…

相關文章
相關標籤/搜索