RCNN相比傳統的物體檢測,仍是引入傳統的物體檢測的基本流程,先找出候選目標物體,逐個的提取特徵,不過rbg大神引入了當時煊赫一時的CNN卷積網絡取代傳統上的HOG,DPM,LBP,SIFT等算法來對圖像的特徵進行提取,值得說道的是CNN因爲能夠放到GPU上,因此也大幅度的減小了了物體檢測須要的時間,而後在使用svm/softmax分類器進行分類識別.算法
候選區域目標(RP) | 特徵提取 | 分類 | |
RCNN | selective search | CNN | SVM |
傳統的算法 | objectness,網絡 constrainedparametric min-cuts,函數 sliding window,edge boxes,....學習 |
HOG , SIFT,測試 LBP, BoW,優化 DPM,...spa |
SVM |
1. 先使用ILSVRC2012數據集訓練一個1000類的分類器模型,並將這個模型保存下來.3d
2. 加載1步驟中的模型,使用這個模型中特徵提取參數來初始化咱們這裏的CNN中的參數,並使用那些通過變形的區域目標來訓練模型,這裏獲取到的區域目標指的是blog
和通過SS算法提取到的區域目標和咱們標註的目標區域的IOU【兩張圖片的交集/兩張圖片的並集】>0.5時,咱們將這個SS算法提取的區域目標做爲咱們標註的類(及該類的正樣本)進行訓練,不然做爲負樣本進行訓練,而且值得注意的是對於每個SGD(隨機梯度)迭代,咱們使用一個128的小批次,其中使用32個當前類的樣本,和96個背景樣本做爲負樣本。圖片
3. 訓練二分類目標分類器,做者列舉檢測車的例子,「對於那種沿着車邊緣分割出的車的區域,咱們能夠很清楚的知道這是一個正樣本,而對於那種不包含任何車信息的區域,咱們也容易直到這是一個負樣本,可是對於那種包含了部分車的區域,咱們切沒有明確的界限來定義」,這裏做者通過一系列的實驗【0,0.1,0.2,0.3,0.4,0.5】,當爲0.5時,MAP(平均APA)會降低5%,當爲0時,會降低4%,只有當SS算法分割出的區域和咱們打樣本時標註的區域的IOU大於0.3時,咱們的MAP最高.對於每個類,候選的正樣本使用ground-truth bounding boexs來定義,也就是大於IOU大於0.7認爲是正樣本,小於0.3認爲是負樣本,鑑於0.3~0.7之間的丟掉不用來訓練.並且對每個類使用線性SVM進行分類,可是由於訓練數據有時會很是大,爲了避免爆內存,做者使用了[背景bg/前景fg(即樣本)]=3:1的比例進行.
2.1 關於圖片的轉換(warp):
圖片在通過CNN卷積網絡須要將圖片統一成固定大小,論文中給出了三種方法的對比A爲原始圖片
一方法: 在原始區域目標周圍去一塊區域進行等比縮放到CNN須要的圖片大小,結果圖B
二方法: 去除原始目標區域而後對目標區域進行填充,在等比縮放到CNN須要的圖片大小,結果C
三方法: 直接將原始目標區域非等比縮放到CNN須要的圖片大小,圖D
在測試時,咱們使用ss算法在每一張測試圖片上提取大約2000個區域目標,對每個區域目標
進行變形放入到CNN提取特徵向量.而後對每個類,咱們使用對這個訓練好的SVM來對每個區域目標打分.
對一張圖片中的全部打分的區域目標,咱們使用一種非極大值抑制算法(NMS)來去掉兩個區域目標中交集/並集大於閾值時,區中評分較低的那個區域.
1. 對CNN網絡進行微調.
先使用ILSVRC2012數據集訓練一個1000類的分類器模型,而後使用該模型來初始化咱們的CNN模型參數,使用咱們的train和val數據集合進行微調.
2. 對每個樣本進行線性SVM分類模型訓練.
來自於驗證集(val)和訓練集(train)中的全部目標區域被充當對應類的正樣本,而每個的負樣本使用的是隨機取自驗證集val
3. 邊框迴歸訓練
邊框迴歸使用的也是val集合
關於正負樣本選取,在CNN訓練階段和SVM階段爲何或出現閾值不一樣[0.5和0.3],通過做者屢次測試後獲得的結果.至於爲何使用SVM而不是用softmax進行分類.
做者說若是使用softmax進行分類mAP會從54.2%掉到50.9%,做者給出的是sofxmax在取任意的樣本的負樣本,也就是是全部的負樣本共享,而SVM是隻專門取對應類的負樣本.
6.1 當使用SVM分類器對SS提供的候選區域目標[通過篩選後的]進行打分以後,模型會使用一個邊框迴歸器會對這區域給出一個預測的區域座標【咱們稱之爲bounding box】,並在通過CNN提取的特徵圖上進行迴歸.
6.2 具體流程以下:
6.2.1 輸入N(咱們的類別爲N) 對{Pi,Gi} i=1,....,N 其中P是預測區域,G爲咱們標註的區域 且P={Pix,Piy,Piw,Pih}表示的(x,y,w,h)分別是中心座標:x,y座標w,h寬高
G和P擁有一樣的結構,咱們的目的是學習一種變換可以將預測的P映射到實際的G上.
四個參數使用四個函數來表示dx(P),dy(P),dw(p),dh(p),其中前兩個使用x,y平移變換,w,h作縮放變換
--------------------------推導部分--------------------------
強調: P,G對應的點是原圖上的值,或者說對應的區域目標是未通過CNN處理過的.
那麼將這些點映射到feature map 上如何計算呢?
咱們先計算出咱們打的標籤位置G映射回feature map是(x,y,w,h)的變化量:
tx = (Gx - Px)/Pw ; (1)
注: Gx 表示的是在原圖上的左上角x的座標,Px表示的是SS算法等處理事後的區域目標在原圖上的中心座標x. Pw表示SS算法等處理事後的區域目標在原圖上的寬度. tx 表示x的變化量
ty = (Gy - Py)/Ph ; (2)
注: Gy 表示的是在原圖上的左上角y的座標,Py表示是SS算法等處理事後的區域目標在原圖上的中心座標y. Ph表示是SS算法等處理事後的區域目標在原圖上的高度. ty 表示y的變化量
tw = log(Gw/Pw); (3)
注: Gw 表示的是在原圖上的寬度,Pw表示是SS算法等處理事後的區域目標在原圖上的寬度. tw 表示w的變化量
th = log(Gh/Ph); (4)
注: Gh 表示的是在原圖上的高度,Ph表示是SS算法等處理事後的區域目標在原圖上的高度. th 表示h的變化量
綜上,咱們就獲得了G'(tx,ty,tw,th)這一組,咱們標註的標籤,從原圖映射回特徵圖上的映射關係. 那麼咱們的預測值呢?
咱們的預測值就是上圖公式中的P'(dx(P),dy(P),dw(P),dh(P))這一組,咱們通過SS算法以及非極大抑制算法以後獲得的區域目標從原圖映射回特徵圖上的映射關係. 也就是說若是咱們的預測值要和實際標註值趨近,那就須要G‘和P'兩個近似相等.
也就是使得:
dx(P) ~ tx (1)
dy(P) ~ ty (2)
dw(P) ~ tw (3)
dh(P) ~ th (4)
那麼咱們的dx(P),dy(P),dw(P),dh(P)是如何獲得的呢? 咱們用d*(P)通用變量來表明這四個具體變量.
而後咱們使用表示通過CNN提取以後的區域目標向量(即咱們圖片抽象數據),咱們設置一個學習模型參數W* 咱們用使用目標向量和學習模型參數矩陣相乘,來獲得咱們的目標函數:
這樣的話,咱們的損失函數也就能夠獲得了,這裏咱們使用一個通用的公式來表示:
LOSS = , 包含了(x,y,w,h)的損失函數,
知道了損失函數,咱們就不可貴到咱們優化目標函數: 對於N個類,咱們每次去損失值最小的那一組進行學習:
,而且咱們設定入=1000.
有了優化目標,就可使用SGD函數來的到最優的W參數了.
特別強調的是,模型在選取訓練樣本的時候,選擇的是離Ground Truth(咱們標註的目標)較近的目標,要達到選擇的目標和GT目標的IOU值>0.6.
參考:
Rich feature hierarchies for accurate object detection and semantic segmentation Tech report [1]
R-CNN for Object Detection [2]