1. 程式人生 > >目標檢測之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
在這裡插入圖片描述
2)region proposal 投影之後位置(左上角,右下角座標):(0,3),(7,8)。
在這裡插入圖片描述
(3)將其劃分為(22)個sections(因為輸出大小為22),我們可以得到:
在這裡插入圖片描述
(4)對每個section做max pooling,可以得到:
在這裡插入圖片描述

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

RPN簡介

• 在feature map上滑動視窗
  • 建一個神經網路用於物體分類(分類為兩種:“候選目標”,“不是目標”)+框位置的迴歸
  • 滑動視窗的位置提供了物體的大體位置資訊
  • 框的迴歸提供了框更精確的位置
在這裡插入圖片描述
一種網路,四個損失函式;
  • RPN calssification(anchor good.bad)
  • RPN regression(anchor->propoasal)
  • Fast R-CNN classification(over classes)
  • Fast R-CNN regression(proposal ->box)
  在這裡插入圖片描述

特徵提取器與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。