天天看點

目标檢測之RCNN、Fast RCNN 、Faster RCNN技術演進與對比

三者的處理步驟

先上三者的處理步驟:

目标檢測之RCNN、Fast RCNN 、Faster RCNN技術演進與對比
目标檢測之RCNN、Fast RCNN 、Faster RCNN技術演進與對比
目标檢測之RCNN、Fast RCNN 、Faster RCNN技術演進與對比
RCNN:
	1、提取1000-2000個(超參數)的候選框(采用selective search算法);
	2、将每個候選框中的圖像調整到相同的size;
	3、将調整size後的圖像(數量與候選框個數相同)輸入CNN提取feature;
	4、用SVM對每個候選框feature進行分類,判斷是否屬于某個特定的類(多個二分類器);
	5、對于屬于某一分類的候選框,用回歸器進一步調整其位置。	
fast RCNN:
	1、提取1000-2000個打候選框(采用selective saerch算法);
	2、将整張圖像輸入CNN提取feature;
	3、找到每個候選框在feature map上的映射patch,将此patch作為每個候選框的卷積特征(feature)
	4、将候選框卷積特征輸入到SPP layer(ROI pooling層)和之後的層;
	 (SPP:空間金字塔池化,其輸入是大小不一的各候選框特征圖的尺寸,輸出是相同的尺寸)
	5、用softmax對每個候選框feature進行分類,判斷是否屬于某個特定的類;
	6、對于屬于某一分類的候選框,用回歸器進一步調整其位置。
faster RCNN:
	1、将整張圖輸入CNN擷取feature map;
	2、将feature map輸入RPN(region proposal network),獲得候選框,以及各候選框的特征資訊
	(一步到位獲得了候選框,以及候選框的特征資訊);
	3、用softmat對每個候選框feature進行分類,判斷是否屬于某個特定的類;
	4、對于屬于某一分類打候選框,用回歸器進一步調整其位置。
           

涉及的幾個關鍵技術和概念

SPP Net

SPP:Spatial Pyramid Pooling(空間金字塔池化)

它的特點有兩個:

1.結合空間金字塔方法實作CNNs的對尺度輸入。

  一般CNN後接全連接配接層或者分類器,他們都需要固定的輸入尺寸,是以不得不對輸入資料進行crop或者warp,這些預處理會造成資料的丢失或幾何的失真。SPP Net的第一個貢獻就是将金字塔思想加入到CNN,實作了資料的多尺度輸入。一般CNN後接全連接配接層或者分類器,他們都需要固定的輸入尺寸,是以不得不對輸入資料進行crop或者warp,這些預處理會造成資料的丢失或幾何的失真。SPP Net的第一個貢獻就是将金字塔思想加入到CNN,實作了資料的多尺度輸入。

如下圖所示,在卷積層和全連接配接層之間加入了SPP layer。此時網絡的輸入可以是任意尺度的,在SPP layer中每一個pooling的filter會根據輸入調整大小,而SPP的輸出尺度始終是固定的。

2.隻對原圖提取一次卷積特征

  在R-CNN中,每個候選框先resize到統一大小,然後分别作為CNN的輸入,這樣是很低效的。在R-CNN中,每個候選框先resize到統一大小,然後分别作為CNN的輸入,這樣是很低效的。

是以SPP Net根據這個缺點做了優化:隻對原圖進行一次卷積得到整張圖的feature map,然後找到每個候選框zaifeature map上的映射patch,将此patch作為每個候選框的卷積特征輸入到SPP layer和之後的層。節省了大量的計算時間,比R-CNN有一百倍左右的提速。

ROI Pooling層詳解

大牛提出了一個可以看做單層sppnet的網絡層,叫做ROI Pooling,這個網絡層可以把不同大小的輸入映射到一個固定尺度的特征向量.

目标檢測typical architecture 通常可以分為兩個階段:

(1)region proposal:給定一張輸入image找出objects可能存在的所有位置。這一階段的輸出應該是一系列object可能位置的bounding box。這些通常稱之為region proposals或者 regions of interest(ROI)。

(bounding box、region proposals、 ROI 這幾個概念等同)

(2)final classification:确定上一階段的每個region proposal是否屬于目标一類或者背景。

這個architecture存在的一些問題是:

  • 産生大量的region proposals 會導緻performance problems,很難達到實時目标檢測。
  • 在處理速度方面
  • 是suboptimal。
  • 無法做到end-to-end training。

    這就是ROI pooling提出的根本原因。

ROI pooling層能實作training和testing的顯著加速,并提高檢測accuracy。該層有兩個輸入:

  1. 從具有多個卷積核池化的深度網絡中獲得的固定大小的feature maps;
  2. 個表示所有ROI的N*5的矩陣,其中N表示ROI的數目。第一清單示圖像index,其餘四清單示其餘的左上角和右下角坐标;

ROI pooling具體操作如下:

(1)根據輸入image,将ROI映射到feature map對應位置;

(2)将映射後的區域劃分為相同大小的sections

(sections數量與輸出的次元相同;當不能均分時,區域大小可以略有不同,見後文示例);

(3)對每個sections進行max pooling操作;

這樣我們就可以從不同大小的方框得到固定大小的相應 的feature maps。值得一提的是,輸出的feature maps的大小不取決于ROI和卷積feature maps大小。ROI pooling 最大的好處就在于極大地提高了處理速度。

ROI pooling example

考慮一個88大小的feature map,一個ROI,以及輸出大小為22.

(1)輸入的固定大小的feature map

目标檢測之RCNN、Fast RCNN 、Faster RCNN技術演進與對比

2)region proposal 投影之後位置(左上角,右下角坐标):(0,3),(7,8)。

目标檢測之RCNN、Fast RCNN 、Faster RCNN技術演進與對比

(3)将其劃分為(22)個sections(因為輸出大小為22),我們可以得到:

目标檢測之RCNN、Fast RCNN 、Faster RCNN技術演進與對比

(4)對每個section做max pooling,可以得到:

目标檢測之RCNN、Fast RCNN 、Faster RCNN技術演進與對比

ROI pooling總結: (1)用于目标檢測任務; (2)允許我們對CNN中的feature map進行reuse; (3)可以顯著加速training和testing速度; (4)允許end-to-end的形式訓練目标檢測系統。

RPN簡介

• 在feature map上滑動視窗

  • 建一個神經網絡用于物體分類(分類為兩種:“候選目标”,“不是目标”)+框位置的回歸

  • 滑動視窗的位置提供了物體的大體位置資訊

  • 框的回歸提供了框更精确的位置

目标檢測之RCNN、Fast RCNN 、Faster RCNN技術演進與對比

一種網絡,四個損失函數;

  • RPN calssification(anchor good.bad)

  • RPN regression(anchor->propoasal)

  • Fast R-CNN classification(over classes)

  • Fast R-CNN regression(proposal ->box)

  

目标檢測之RCNN、Fast RCNN 、Faster RCNN技術演進與對比

特征提取器與fine tuning

  在目标檢測中,會使用VGG、Resnet、zf、Alexnet等基礎網絡作為特征提取器。然後調用預訓練好的網絡(輸出pool5的feature map,詳情參考這篇部落格),根據特定任務進行fine-tuning。

  (有實驗證明:如果不進行fine-tuning,也就是你直接把預訓練模型當做萬金油使用,類似于HOG、SIFT一樣做特征提取,不針對特定的任務。然後把提取的特征用于分類,結果發現p5(pooling layer 5)的精度竟然跟f6(fullconnect layer 6)、f7差不多,而且f6提取到的特征還比f7的精度略高;如果你進行fine-tuning了,那麼在rcnn中f7、f6的提取到的特征最後訓練的svm分類器的精度就會飙漲)

  據此我們明白了一個道理,如果不針對特定任務進行fine-tuning,而是把CNN當做特征提取器,卷積層所學到的特征其實就是基礎的共享特征提取層,就類似于SIFT算法一樣,可以用于提取各種圖檔的特征,而f6、f7所學習到的特征是用于針對特定任務的特征。打個比方:對于人臉性别識别來說,一個CNN模型前面的卷積層所學習到的特征就類似于學習人臉共性特征,然後全連接配接層所學習的特征就是針對性别分類的特征了。

為啥要用SVM分類器

  在RCNN中,有一個疑問:CNN訓練的時候,本來就是對bounding box的物體進行識别分類訓練,是一個端到端的任務,在訓練的時候最後一層softmax就是分類層,那麼為什麼作者閑着沒事幹要先用CNN做特征提取(提取fc7層資料),然後再把提取的特征用于訓練svm分類器?

  這個是因為svm訓練和cnn訓練過程的正負樣本定義方式各有不同,導緻最後采用CNN softmax輸出比采用svm精度還低。

  事情是這樣的,cnn在訓練的時候,對訓練資料做了比較寬松的标注,比如一個bounding box可能隻包含物體的一部分,那麼我也把它标注為正樣本,用于訓練cnn;采用這個方法的主要原因在于因為CNN容易過拟合,是以需要大量的訓練資料,是以在CNN訓練階段我們是對Bounding box的位置限制條件限制的比較松(IOU隻要大于0.5都被标注為正樣本了);

  然而svm訓練的時候,因為svm适用于少樣本訓練,是以對于訓練樣本資料的IOU要求比較嚴格:IOU<0.7的都當成負樣本(rcnn訓練的是svm二分類這裡會存在正負樣本不均衡情況,要對負樣本下采樣或者對正樣本上采樣)。我們隻有當bounding box把整個物體都包含進去了,我們才把它标注為物體類别,然後訓練svm。

##faster RCNN 詳解

https://blog.csdn.net/WZZ18191171661/article/details/79439212

繼續閱讀