1. 程式人生 > >目標檢測之網路篇(3)【Faster R-CNN】

目標檢測之網路篇(3)【Faster R-CNN】

前言

1.有關VGG16結構,參見:VGG16圖形化描述 2.本週目標是看三篇網路類,讀到第三篇Faster R-CNN的時候我發現需要先弄懂R-CNN以及Fast R-CNN。引用@v_JULY_v的文章的總結R-CNN 1.在影象中確定約1000-2000個候選框 (使用選擇性搜尋Selective Search) 2.每個候選框內影象塊縮放至相同大小,並輸入到CNN內進行特徵提取 3.對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類 4.對於屬於某一類別的候選框,用迴歸器進一步調整其位置

Fast R-CNN 1.在影象中確定約1000-2000個候選框 (使用選擇性搜尋Selective Search) 2.對整張圖片輸進CNN,得到feature map 3.找到每個候選框在feature map上的對映patch,將此patch作為每個候選框的卷積特徵輸入到SPP layer和之後的層 4.對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類 5.對於屬於某一類別的候選框,用迴歸器進一步調整其位置

Faster R-CNN 1.對整張圖片輸進CNN,得到feature map 2.卷積特徵輸入到RPN,得到候選框的特徵資訊 3.對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類 4.對於屬於某一類別的候選框,用迴歸器進一步調整其位置

整理為表格:

專案 R-CNN Fast R-CNN Faster R-CNN
提取候選框 Seletive Search Seletive Search RCN網路
提取特徵 CNN CNN+ROI池化 CNN+ROI池化
特徵分類 SVM CNN+ROI池化 CNN+ROI池化

R-CNN

step1 訓練(或者下載)一個分類模型

step2 對該模型做fine-tuning

• 將分類數從1000改為20,比如20個物體類別 + 1個背景 • 去掉最後一個全連線層 在這裡插入圖片描述

step3 特徵提取

• 提取影象的所有候選框(選擇性搜尋Selective Search) • 對於每一個區域:修正區域大小以適合CNN的輸入,做一次前向運算,將第五個池化層的輸出(就是對候選框提取到的特徵)存到硬碟 在這裡插入圖片描述

step4 訓練一個SVM分類器(二分類)來判斷這個候選框裡物體的類別

每個類別對應一個SVM,判斷是不是屬於這個類別,是就是positive,反之nagative。 在這裡插入圖片描述

step5 使用迴歸器精細修正候選框位置:對於每一個類,訓練一個線性迴歸模型去判定這個框是否框得完美

在這裡插入圖片描述 由於每個原始圖片都要提取2000個左右的候選框,而且對每個候選框都要進行CNN特徵提取和SVM分類,因此計算量非常大,導致時間很長(47s一張圖)。

SPP Net

SPP-Net(空間金字塔池化網路)是出自2015年發表在IEEE上的論文-《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》。

R-CNN的操作:由於CNN的卷積層不需要固定尺寸的輸入影象,而全連線層需要,所以當全連線層面對各種尺寸的輸入資料時,就需要對輸入資料進行crop(crop就是從一個大圖扣出網路輸入大小的patch,比如227×227),或warp(把一個邊界框bounding box的內容resize成227×227)等一系列操作以統一圖片的尺寸大小,比如224×224(ImageNet)、32×32(LenNet)、96×96等。在這裡插入圖片描述

SPP則反其道而行之,在卷積層的最後加入某種結構,使得後面全連線層得到的輸入變成固定的。下圖為R-CNN與SPP的對比: 在這裡插入圖片描述 上面一行是R-CNN,下面一行是SPP,將空間金字塔池化加在卷積層和全連線層之間。SPP的兩大特點: 1.結合空間金字塔方法實現CNNs的多尺度輸入:加入ROI池化,即輸入可以為任意尺度,輸出固定維度的向量。 2.只對原圖提取一次卷積特徵:只對原圖進行一次卷積計算,便得到整張圖的卷積特徵feature map,然後找到每個候選框在feature map上的對映patch,將此patch作為每個候選框的卷積特徵輸入到SPP layer和之後的層,完成特徵提取工作。 正是因為只作一次卷積運算,SPP-Net相比R-CNN有著百倍左右的提速。 在這裡插入圖片描述

Fast R-CNN

與R-CNN框架圖對比,可以發現主要有兩處不同:一是最後一個卷積層後加了一個ROI池化層,二是損失函式使用了多工損失函式(multi-task loss),將邊框迴歸Bounding Box Regression直接加入到CNN網路中訓練。 在這裡插入圖片描述 (1) ROI pooling layer實際上是SPP-NET的一個精簡版,SPP-NET對每個proposal使用了不同大小的金字塔對映,而ROI pooling layer只需要下采樣到一個7x7的特徵圖。對於VGG16網路conv5_3有512個特徵圖,這樣所有region proposal對應了一個7x7x512維度的特徵向量作為全連線層的輸入。 (2) R-CNN訓練過程分為了三個階段,而Fast R-CNN直接使用softmax替代SVM分類,同時利用多工損失函式邊框迴歸也加入到了網路中,這樣整個的訓練過程是端到端的(除去Region Proposal提取階段)。在這裡插入圖片描述

R-CNN有一些相當大的缺點(把這些缺點都改掉了,就成了Fast R-CNN)。 大缺點:由於每一個候選框都要獨自經過CNN,這使得花費的時間非常多。 解決:共享卷積層,現在不是每一個候選框都當做輸入進入CNN了,而是輸入一張完整的圖片,在第五個卷積層再得到每個候選框的特徵。 原來的方法:許多候選框(比如兩千個)–>CNN–>得到每個候選框的特徵–>分類+迴歸 現在的方法:一張完整圖片–>CNN–>得到每張候選框的特徵–>分類+迴歸 所以容易看見,Fast R-CNN相對於R-CNN的提速原因就在於:不過不像R-CNN把每個候選區域給深度網路提特徵,而是整張圖提一次特徵,再把候選框對映到conv5上,而SPP只需要計算一次特徵,剩下的只需要在conv5層上操作就可以了。

提速效率肉眼可見: 在這裡插入圖片描述

Faster R-CNN

Fast R-CNN存在的問題: 存在瓶頸:選擇性搜尋,找出所有的候選框,這個也非常耗時。那我們能不能找出一個更加高效的方法來求出這些候選框呢? 解決:加入一個提取邊緣的神經網路,也就說找到候選框的工作也交給神經網路來做了。 所以,rgbd在Fast R-CNN中引入Region Proposal Network(RPN)替代Selective Search,同時引入anchor box應對目標形狀的變化問題(anchor就是位置和大小固定的box,可以理解成事先設定好的固定的proposal)。 具體做法:   • 將RPN放在最後一個卷積層的後面   • RPN直接訓練得到候選區域 在這裡插入圖片描述 RPN(Region Proposal Network)簡介:   • 在feature map上滑動視窗   • 建一個神經網路用於物體分類+框位置的迴歸   • 滑動視窗的位置提供了物體的大體位置資訊   • 框的迴歸提供了框更精確的位置 在這裡插入圖片描述 三種速度對比:Faster R-CNN又提速十倍 在這裡插入圖片描述

總結

總的來說,從R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走來,基於深度學習目標檢測的流程變得越來越精簡,精度越來越高,速度也越來越快。可以說基於Region Proposal的R-CNN系列目標檢測方法是當前目標檢測技術領域最主要的一個分支。

參考文獻