1. 程式人生 > >目標檢測演算法-rcnn

目標檢測演算法-rcnn

RCNN區域卷積神經網路

前言

在經歷了一段時間的胡碰亂撞之後,對基於深度學習的目標檢測有了初步的認識,決定開始系統地學習目標檢測演算法,品讀論文,研究演算法,程式設計實現。作為小白,還是從早期經典的RCNN開始入手。

RCNN詳解

1.摘要

RCNN(region with CNN features),區域卷積神經網路。主要有以下兩個創新點:
(1) 通過影象分割和選擇搜尋(selective search)得到候選框(region proposal),然後在候選框上使用CNN提取特徵,用於定位和識別物體。
在這裡插入圖片描述
在這裡插入圖片描述
(2) 當帶標籤的訓練資料不足時,對輔助任務的大訓練集進行有監督訓練,然後在小資料集上進行微調(fine-tune)。

2.訓練過程

(1) 預訓練卷積網路

  • 在ILSVRC2013訓練集上圖片resize到227x227,有監督預訓練alexnet。

(2) 卷積網路引數微調

  • 首先,根據特定任務修改alexnet最後幾層結構
  • 在小資料集中,對每張圖片通過選擇搜尋得到的約2000個候選框,與groundtruth的iou>=0.5的為正樣本,其他為負樣本,resize到227x227,迭代訓練alexnet 200~500步,微調alexnet引數。

(3) 訓練svm分類器

  • 在小資料集中,對每張圖片通過選擇搜尋得到的候選框,與groundtruth的iou>0.6
    的為正樣本、iou<0.1的為負樣本,resize後經過alexnet全連線層輸出的4096維特徵向量,放入訓練集(防止正負樣本數量相差太多,分類器偏向負分類),訓練svm分類器。剩下的resize後經過alexnet全連線層得到特徵向量,作為待定的測試樣本。
  • 由於這樣訓練集負樣本比較單一,沒有部分包含目標的候選框,所以用難負例挖掘(hard negative mining method)。用訓練好的svm分類器在測試樣本中預測,對於預測結果為正的測試樣本,將其中得分前百分之10的作為負樣本加入訓練集,重新訓練,直到svm分類器在訓練集上正確率不再提高,或者訓練集數量不足10個,停止迭代。

(4) 訓練boundingbox迴歸

  • 在小資料集中,對每張圖片通過選擇搜尋得到的候選框,與groundtruth的iou>0.6的resize後經過alexnet全連線層輸出的特徵向量加入訓練集,對應搜尋框的[x,y,w,h]與groundtruth的[gx,gy,gw,gh]變換得到[tx,ty,tw,th],作為輸出加入訓練集。
  • boundingbox迴歸作為線性迴歸問題,把訓練集中特徵向量作為輸入,[tx,ty,tw,th]作為輸出,訓練該線性迴歸模型。

3.測試過程

(1) 測試圖片選擇搜尋得到候選框,篩選,並且resize到227x227。
(2) 所有候選框經過alexnet,提取全連線層輸出的4096維特徵向量。
(3) 特徵向量通過svm分類,保留其中包含目標的。
(4) 包含目標的特徵向量,boundingbox迴歸後範圍處理得到精確位置。
(5) 剩下的特徵向量進行非極大抑制,得到最終結果。

參考

1.RCNN(regions with CNN features)論文

論文翻譯參考以下網址,第一個部落格更貼近原論文,第二個條理更清晰,更詳細,細節更到位:
https://blog.csdn.net/v1_vivian/article/details/78599229
https://blog.csdn.net/wopawn/article/details/52133338

2.知識點1:邊框迴歸(bounding box)

在論文第一章Introduction中,作者使用了邊框迴歸(boundingbox)的方法有效減少了定位偏差(mislocation)。邊框迴歸的介紹可以參見:https://blog.csdn.net/zijin0802034/article/details/77685438

3.知識點2:選擇搜尋(selective search)

論文第二章用RCNN目標檢測中,在產生候選框(region proposal)時採用了選擇搜尋(selective search)的方法,該方法的介紹,可以參考:https://blog.csdn.net/mao_kun/article/details/50576003

  • 知識點2.1:影象分割演算法(Effective graph-based image segmentation)

在選擇搜尋(selective search)產生候選框(region proposal)時,在影象分割部分採用了基於圖的影象分割演算法(Effective graph-based image segmentation),參考:https://blog.csdn.net/surgewong/article/details/39008861

4.知識點3:難負例挖掘(hard negative mining method)

論文在2.3訓練時採用了難負例挖掘演算法(hard negative mining method),主要是因為負例過多,正例只有ground-truth,所以在分類時容易把部分包含目標的候選框(region proposal)誤判為正例,此時把這些誤判的樣本作為負例加入負樣本集,重新訓練,直到成績不再提升為止。

程式設計實現

文中關於影象分割演算法(Effective graph-based image segmentation)的python實現,在我的另一篇部落格中有詳細描述:
https://blog.csdn.net/u014796085/article/details/83449972
關於選擇搜尋(selective search)的python實現:
https://blog.csdn.net/u014796085/article/details/83478583
RCNN訓練及測試過程的python實現,已經完成,部落格很快會寫,到時補充。

總結

暫時先寫這麼多,研究後會繼續補充,不對之處歡迎指正。