RCNN(Regions with CNN features)演演算法由Ross Girshick在2014年的論文「Rich feature hierarchies for accurate object detection and semantic segmentation」提出,是深度學習目標檢測的開山之作。RCNN將CNN應用到目標檢測問題上,它使用選擇性搜尋從影象中提取候選區域,利用折積層提取後去區域的特徵,最後對這些候選區域進行分類和迴歸 。RCNN的出現大大提高了目標檢測的效果,同時也改變了目標檢測領域的主要研究思路。它的出現使得人們開始意識到深度學習在計算機視覺領域中的廣泛應用前景。雖然RCNN難以滿足實時檢測需求,但能幫助我們較好的理解併入門目標檢測演演算法。
RCNN演演算法實現主要包括以下步驟:候選區域生成→特徵提取→影象分類→候選框位置修正→預測。和論文中實現方式不同的是,本文不採用SVM訓練分類器,而是直接使用CNN分類模型完成影象分類和特徵提取任務。
本文演演算法基於python3.7 + pytorch框架 + 17flowers資料集實現。
RCNN採用選擇性搜尋(selective search,後面簡稱為ss)的辦法產生候選區域,參考論文:J. Uijlings, K. van de Sande, T. Gevers, and A. Smeulders. Selective search for object recognition. IJCV, 2013.
1.1.1 採用某種手段(如Felzenszwalb方法)將影象分割成許多小區域 R = {r1, ... , rn}
1.1.2 初始化一個集合 S = Ø,用於存放臨近區域的相似度結果
1.1.3 遍歷R中的相鄰區域對 (rm, rn),計算他們之間的相似度 s( rm, rn),將相似度結果放入集合 S 中:
1.1.4 如果S不為空集:
a. 根據 s(ri, rj)=max(S) 尋找 S 中相似度最高的區域對 (ri, rj)
b. 將區域 ri 和 rj 合併,得到新的區域 rt = ri U rj
c. 移除S中區域 ri 和 rj 相關的所有相似度結果 S = S \ s(rp, r*),p = {i, j}
d. 計算新區域 rt 與周圍區域的相似度集合 St,並將 St 放入集合 S 中,將新區域 rt 放入集合 R 中,即 S = S U St, R = R U rt
1.1.5 提取 R 中所有區域的邊界框,即為可能存在物體的區域
1.2.1 速度快:利用分割演演算法而非暴力窮舉的方式生成候選區域,同時採用自底向上合併重疊區域的方法,減少區域冗餘
1.2.2 多樣化:並非從單一特徵定位物體,而是從顏色、紋理、大小等多個方向對分割區域進行合併定位
ss方法的python程式碼如下:
RCNN採用CNN作為特徵提取器,本文使用Alexnet作為特徵提取backbone。
2.1.1 資料集準備:
a. 基於2flowers資料(帶真實邊界框標記資訊)資料,利用ss方法生成候選區域proposals
b. 根據候選區域與真實邊界框的IoU結果,將候選區域分為3類(0為背景label,1和2為物體label)
c. 儲存3類候選區影象,並記錄label為1和2的物體的邊界框資訊便於後續迴歸模型使用
2.1.2 預訓練:在17-flowers資料集上對Alexnet模型進行分類訓練,獲得pretrain模型,使之適應當前的任務
2.1.3 分類模型訓練:基於3類候選區域影象,對pretrain模型進行微調,生成微調後的classify模型
2.1.4 特徵提取:上面生成的classify模型也是Alexnet結構,去除所有全連線層,classify.features(img)的輸出結果即所需特徵
2.2.1 預訓練模型結果範例:
2.2.2 分類模型結果範例:
使用線性迴歸模型對候選框位置進行修正,流程如下:
a. 將2.1.1中生成的label為1和2的影象輸入classify模型,獲得對應的影象特徵作為迴歸模型輸入
b. 將上述影象對應的邊界框與真實邊界框的偏移值作為迴歸模型的label
c. 基於特徵和偏移值訓練regress模型
如上我們獲得了classify模型用於提取影象特徵和分類,regress模型用於計算邊界框偏移值,接下來可以進行目標預測。
a. 利用ss方法生成候選區域proposals,記錄對應的邊界框資訊
b. 將proposals輸入classify模型獲取分類標籤,分類標籤為0則該區域為背景,否則為物體
c. 提取標籤不為0的區域的影象特徵,並將其送入regress模型,獲取預測的邊界框偏移值
d. 選取L1範數最小的偏移值,將最小偏移值與其對應的邊界框位置相加,作為最終的預測結果
本文中資料和詳細程式碼實現請移步:https://github.com/jchsun1/RCNN
Reference:
本文至此結束,祝君好運。