R-CNN 是第一個成功將深度學習應用到目標檢測上的算法,也是後續Fast R-CNN , Faster R-CNN等系列算法的鼻祖算法
R-CNN的全貌以下圖所示 網絡
它主要分爲4個模塊
架構
候選區域(region proposal)提取機器學習
一個大型的CNN網絡用來特徵提取函數
使用SVM分類模型進行類別分類學習
使用迴歸(Regression)模型進行具體定位測試
具體RCNN的訓練流程以下:優化
先使用ImageNet數據集訓練一個CNN網絡(論文中使用的是AlexNet)設計
使用選擇性搜索(selective search)算法提取出2000個候選框3d
將提取出來的候選框統一resize到 CNN網絡所須要的尺寸
使用本身的數據集對CNN網絡進行fine-tuning(微調)
利用fine-tuning後的CNN網絡對候選框進行特徵提取
訓練多個二元SVM分類模型
Bounding-box迴歸來減小候選區域偏差
論文中提到,由於實際標籤數據太少,遠遠不夠去訓練一個大型的CNN網絡模型,因此須要先借助ImageNet數據集進行訓練CNN網絡,也就是預訓練過程,而後再在本身的數據集上針對特定任務進行微調,也就是調優。這是在訓練數據稀少的狀況下一個很是有效的訓練大型卷積神經網絡的方法
R-CNN算法使用的 選擇性搜索(selective search)算法提取出了2000個候選框,Selective search綜合考慮圖像的顏色、紋理、尺寸類似性和空間重合度來劃分區域,並將小區域按照類似性合併爲大區域。
具體選擇SS算法的大概思路以下:
1. 使用圖像分割算法建立候選區域
2. 使用貪心算法來進行候選區域合併:
計算全部候選區域的類似度
將最類似的兩個候選區域合併爲一個區域
3. 重複迭代2過程,直到知足條件
由於CNN網絡輸入的圖像尺寸是固定(論文中爲224*224),因此須要將不一樣大小的候選框resize到CNN網絡所須要的尺寸,
候選區域大小調整選擇最簡單的各向異性縮放,同時論文中在縮放以前,還對原候選區域增長了一個邊緣(padding),大小爲16個像素,用原始圖像中的點進行填充,這樣使候選區域邊緣有必定的緩衝
經過ImageNet數據集訓練來的CNN網絡是用來進行1000種類別分類,須要替換掉最後的分類層,改成一個隨機初始化的K+1類分類層,K即爲本身數據集上針對特定任務的目標分類數,後面+1是由於還須要加上背景類別。論文中做者是在VOC數據集上進行目標檢測的,因此爲20+1,即21個類別的分類任務。
CNN網絡中的卷積層則保持不變。關於進行fine-tuning時的正負樣本,若是候選框與真實標註框的IOU>=0.5,就認爲此候選框爲正樣例,不然爲負樣例,另外,因爲對於一張圖片的多有候選區域來講,負樣本是遠遠大於正樣本數,因此須要將正樣本進行上採樣來保證樣本分佈均衡
在進行fine-tuning 時,須要選用比較小的學習率,以保證不會破壞初始化的成果,論文中所採用的learn_rate爲0.001。每輪迭代,統一使用32個正例窗口(跨全部類別)和96個負例窗口(背景),即每一個mini-batch的大小是128
R-CNN算法是用CNN網絡來進行特徵提取,而後用提取出來的特徵進行後續的SVM分類。
全部須要將fine-tuning 後的CNN網絡去掉最後的softmax層,而後用來對候選框進行特徵提取
R-CNN算法,對於每一個類別單獨訓練一個二元SVM分類。這塊有個問題,爲何不用上面CNN網絡的softmax直接進行分類,而要把CNN網絡提取出來的特徵,從新用SVM進行分類?做者給出的答案是通過測試發現,從新使用SVM單獨進行分類效果更好。另外,在訓練每一個SVM分類模型時,正負樣本的構建和上面fine-tuning CNN網絡 時有所不一樣。在訓練對應某個類別的SVM分類模型時,ground-truth(即對應類別的真實標註框)爲正樣本,負樣本爲與ground-truth(真實標註框)的IOU小於0.3的候選框,也就是說IOU<0.3被做爲負例,ground-truth是正例,其他的所有丟棄
爲了減小Selective search 候選框的偏差,最後須要進行 Bounding-box Regression(BBR)來對候選框進行精修
這塊須要注意,只有IOU值大於0.6的候選框,纔會進行Bounding-box Regression
首先,來具體看下,Bounding-box Regression是什麼,以下綠色框P爲輸入進來的候選框,紅色框G爲ground-truth,也就是真實標註框。咱們的目標就是經過線性迴歸,訓練一種關係,使得輸入原始的窗口 P 通過映射獲得一個迴歸窗口G'(藍色框),須要儘量的讓迴歸窗口G'(藍色框)跟真實窗口 G 更接近。
Bounding-box Regression的目的就是:給定(Px,Py,Pw,Ph),尋找一種映射f, 使得 f(Px,Py,Pw,Ph)=(Gx',Gy',Gw',Gh') 而且(Gx',Gy',Gw',Gh')≈(Gx,Gy,Gw,Gh)
因此咱們須要通過平移和尺度縮放,將窗口P變爲窗口G'。
首先看下平移變化,假設
爲對應平移轉換,因此有:
因爲候選框的大小各不相同,因此這塊須要使用相對位移來進行統一,因此
即
接下來看下尺度縮放:
,這塊統一進行對數變換,是爲了確保縮放比例大於0
因此:
因此,Bounding-box Regression 最終是爲了得到
這四個變化。
Bounding-box Regression 的輸入是一組N個訓練對(P,G), 輸出爲
咱們設從P到G實際的轉換爲:
,因此有
因此最終的損失函數爲:
訓練結束後,能夠得到最終的
,進而得到
到此,R-CNN的訓練就結束了
R-CNN做爲目標檢測算法中的一個里程碑之做,自己也就有許多缺點
首先,最大的一個缺點就是不論是預測仍是訓練,速度都很慢,
由於
1.候選框選擇算法嚴重耗時
2.每張圖片2000個候選框中會有不少重複的部分,從而致使後面在使用CNN時有不少重複計算
3.在進行候選區域的特徵提取時,爲了適應CNN網絡的輸入,須要對候選區域進行扭曲,縮放等操做,這會致使一些圖片特徵信息的丟失和變形,從而下降了檢測的準確性
另外,RCNN是分步驟進行,過程比較繁瑣
全部後面在此基礎上,衍生出來其餘一些目標檢測算法,來對相關問題進行改進優化,具體咱們後面再介紹
歡迎關注個人我的公衆號 AI計算機視覺工坊,本公衆號不按期推送機器學習,深度學習,計算機視覺等相關文章,歡迎你們和我一塊兒學習,交流。