44 物體檢測算法:R-CNN,SSD,YOLO【動手學(xué)深度學(xué)習(xí)v2】

目標(biāo)檢測中的常用算法
1、區(qū)域卷積神經(jīng)網(wǎng)絡(luò)(region-based CNN or regions with CNN features)
- 除了 SSD 之外,區(qū)域卷積神經(jīng)網(wǎng)絡(luò)也是深度模型應(yīng)用于目標(biāo)檢測的開創(chuàng)性工作之一
R-CNN(基于區(qū)域的卷積神經(jīng)網(wǎng)絡(luò))
- R-CNN系列中最早的模型

- 首先從輸入圖像中選取若干個(gè)提議區(qū)域(錨框是選取方式的一種),并標(biāo)注它們的類別和邊界框(如偏移量)。然后用卷積神經(jīng)網(wǎng)絡(luò)來對每個(gè)提議區(qū)域(錨框)進(jìn)行前向傳播以抽取特征。最后用每個(gè)提議區(qū)域的特征來預(yù)測類別和邊界框。
R-CNN 模型的四個(gè)步驟:
- 對輸入圖像使用選擇性搜索來選取多個(gè)高質(zhì)量的提議區(qū)域。這些提議區(qū)域通常是在多個(gè)尺度下選取的,并具有不同的形狀和大小;每個(gè)提議區(qū)域都將被標(biāo)注類別和真實(shí)邊框
- 選擇一個(gè)預(yù)訓(xùn)練的卷積神經(jīng)網(wǎng)絡(luò),并將其在輸出層之前截?cái)唷⒚總€(gè)提議區(qū)域變形為網(wǎng)絡(luò)需要的輸入尺寸,并通過前向傳播輸出抽取的提議區(qū)域特征
- 將每個(gè)提議區(qū)域的特征連同其標(biāo)注的類別作為一個(gè)樣本。訓(xùn)練多個(gè)支持向量機(jī)對目標(biāo)分類,其中每個(gè)支持向量機(jī)用來判斷樣本是否屬于某一個(gè)類別
- 將每個(gè)提議區(qū)域的特征連同其標(biāo)注的邊界框作為一個(gè)樣本,訓(xùn)練線性回歸模型來預(yù)測真實(shí)邊界框
每次選擇的錨框的大小是不同的,在這種情況下,怎樣使這些大小不一的錨框變成一個(gè)batch?
RoI pooling(興趣區(qū)域池化層)
- R-CNN 中比較關(guān)鍵的層,作用是將大小不一的錨框變成統(tǒng)一的形狀
- 給定一個(gè)錨框,先將其均勻地分割成 n * m 塊,然后輸出每塊里的最大值,這樣的話,不管錨框有多大,只要給定了 n 和 m 的值,總是輸出 nm 個(gè)值,這樣的話,不同大小的錨框就都可以變成同樣的大小,然后作為一個(gè)小批量,之后的處理就比較方便了

- 上圖中對 3 * 3 的黑色方框中的區(qū)域進(jìn)行 2 * 2 的興趣區(qū)域池化,由于 3 * 3 的區(qū)域不能均勻地進(jìn)行切割成 4 塊,所以會進(jìn)行取整(最終將其分割成為 2 * 2、1 * 2、2 * 1、1 * 1 四塊),在做池化操作的時(shí)候分別對四塊中每一塊取最大值,然后分別填入 2 * 2 的矩陣中相應(yīng)的位置
興趣區(qū)域匯聚層(RoI Pooing)與一般的匯聚層有什么不同?
- 在一般的匯聚層中,通過設(shè)置匯聚窗口、填充和步幅的大小來間接控制輸出形狀
- 在興趣區(qū)域匯聚層中,對每個(gè)區(qū)域的輸出形狀是可以直接指定的
小結(jié)
- 盡管 R-CNN 模型通過預(yù)訓(xùn)練的卷積神經(jīng)網(wǎng)絡(luò)有效地抽取了圖像特征,但是速度非常慢(如果從一張圖片中選取了上千個(gè)提議區(qū)域,就需要上千次的卷積神經(jīng)網(wǎng)絡(luò)的前向傳播來執(zhí)行目標(biāo)檢測,計(jì)算量非常大)
Fast R-CNN
- R-CNN 每次拿到一張圖片都需要抽取特征,如果說一張圖片中生成的錨框數(shù)量較大,抽取特征的次數(shù)也會相應(yīng)的增加,大大增加了計(jì)算量
- 因此,R-CNN 的主要性能瓶頸在于,對于每個(gè)提議區(qū)域,卷積神經(jīng)網(wǎng)絡(luò)的前向傳播是獨(dú)立的,沒有共享計(jì)算(這些提議區(qū)域通常有重疊,獨(dú)立的特征提取會導(dǎo)致重復(fù)計(jì)算)

- Faste R-CNN 的改進(jìn)是:在拿到一張圖片之后,首先使用 CNN 對圖片進(jìn)行特征提取(不是對圖片中的錨框進(jìn)行特征提取,而是對整張圖片進(jìn)行特征提取,僅在整張圖像上執(zhí)行卷積神經(jīng)網(wǎng)絡(luò)的前向傳播),最終會得到一個(gè) 7 * 7 或者 14 * 14 的 feature map
- 抽取完特征之后,再對圖片進(jìn)行錨框的選擇(selective search),搜索到原始圖片上的錨框之后將其(按照一定的比例)映射到 CNN 的輸出上
- 映射完錨框之后,再使用 RoI pooling 對 CNN 輸出的 feature map 上的錨框進(jìn)行特征抽取,生成固定長度的特征(將 n * m 的矩陣?yán)斐蔀?nm 維的向量),之后再通過一個(gè)全連接層(這樣就不需要使用SVM一個(gè)一個(gè)的操作,而是一次性操作了)對每個(gè)錨框進(jìn)行預(yù)測:物體的類別和真實(shí)的邊緣框的偏移
- 上圖中黃色方框的作用就是將原圖中生成的錨框變成對應(yīng)的向量
- Fast R-CNN 相對于 R-CNN 更快的原因是:Fast R-CNN 中的 CNN 不再對每個(gè)錨框抽取特征,而是對整個(gè)圖片進(jìn)行特征的提?。ㄟ@樣做的好處是:不同的錨框之間可能會有重疊的部分,如果對每個(gè)錨框都進(jìn)行特征提取的話,可能會對重疊的區(qū)域進(jìn)行多次重復(fù)的特征提取操作),然后再在整張圖片的feature中找出原圖中錨框?qū)?yīng)的特征,最后一起做預(yù)測
Fast R-CNN 中的主要計(jì)算:

Faster R-CNN
- 為了精確地檢測目標(biāo)結(jié)果,F(xiàn)ast R-CNN 模型通常需要在選擇性搜索中生成大量的提議區(qū)域
- 因此,F(xiàn)aster R-CNN 提出將選擇性搜索替換為區(qū)域提議網(wǎng)絡(luò)(region proposal network,RPN),模型的其余部分保持不變,從而減少區(qū)域的生成數(shù)量,并保證目標(biāo)檢測的精度

- Faster R-CNN 的改進(jìn):使用 RPN 神經(jīng)網(wǎng)絡(luò)來替代 selective search
- RoI 的輸入是CNN 輸出的 feature map 和生成的錨框
- RPN 的輸入是 CNN 輸出的 feature map,輸出是一些比較高質(zhì)量的錨框(可以理解為一個(gè)比較小而且比較粗糙的目標(biāo)檢測算法: CNN 的輸出進(jìn)入到 RPN 之后再做一次卷積,然后生成一些錨框(可以是 selective search 或者其他方法來生成初始的錨框),再訓(xùn)練一個(gè)二分類問題:預(yù)測錨框是否框住了真實(shí)的物體以及錨框到真實(shí)的邊緣框的偏移,最后使用 NMS 進(jìn)行去重,使得錨框的數(shù)量變少)
- RPN 的作用是生成大量結(jié)果很差的錨框,然后進(jìn)行預(yù)測,最終輸出比較好的錨框供后面的網(wǎng)絡(luò)使用(預(yù)測出來的比較好的錨框會進(jìn)入 RoI pooling,后面的操作與 Fast R-CNN 類似)
- 通常被稱為兩階段的目標(biāo)檢測算法:RPN 做小的目標(biāo)檢測(粗糙),整個(gè)網(wǎng)絡(luò)再做一次大的目標(biāo)檢測(精準(zhǔn))
- Faster R-CNN 目前來說是用的比較多的算法,準(zhǔn)確率比較高,但是速度比較慢
區(qū)域提議網(wǎng)絡(luò)的計(jì)算步驟:

- 區(qū)域提議網(wǎng)絡(luò)作為Faster R-CNN 模型的一部分,是和整個(gè)模型一起訓(xùn)練得到的(Faster R-CNN 的目標(biāo)函數(shù)不僅包括目標(biāo)檢測中的類別和邊界框預(yù)測,還包括區(qū)域提議網(wǎng)絡(luò)中錨框的二元類別和邊界框預(yù)測)
- 作為端到端訓(xùn)練的結(jié)果,區(qū)域提議網(wǎng)絡(luò)能夠?qū)W習(xí)到如何生成高質(zhì)量的提議區(qū)域,從而在減少了從數(shù)據(jù)中學(xué)習(xí)的提議區(qū)域的數(shù)量的情況下,仍然保持了目標(biāo)檢測的精度
Mask R-CNN
- 如果在訓(xùn)練集中還標(biāo)注了每個(gè)目標(biāo)在圖像上的像素級位置,Mask R-CNN 能夠有效地利用這些相近地標(biāo)注信息進(jìn)一步提升目標(biāo)檢測地精度

Mask R-CNN 是基于 Faster R-CNN 修改而來的,改進(jìn)在于
- 假設(shè)有每個(gè)像素的標(biāo)號的話,就可以對每個(gè)像素做預(yù)測(FCN)
- 將興趣區(qū)域匯聚層替換成了興趣區(qū)域?qū)R層(RoI pooling -> RoI align),使用雙線性插值(bilinear interpolation)保留特征圖上的空間信息,進(jìn)而更適于像素級預(yù)測:對于pooling來說,假如有一個(gè)3 * 3的區(qū)域,需要對它進(jìn)行2 * 2的RoI pooling操作,那么會進(jìn)行取整從而切割成為不均勻的四個(gè)部分,然后進(jìn)行 pooling 操作,這樣切割成為不均勻的四部分的做法對于目標(biāo)檢測來說沒有太大的問題,因?yàn)槟繕?biāo)檢測不是像素級別的,偏移幾個(gè)像素對結(jié)果沒有太大的影響。但是對于像素級別的標(biāo)號來說,會產(chǎn)生極大的誤差;RoI align 不管能不能整除,如果不能整除的話,會直接將像素切開,切開后的每一部分是原像素的加權(quán)(它的值是原像素的一部分)
- 興趣區(qū)域?qū)R層的輸出包含了所有與興趣區(qū)域的形狀相同的特征圖,它們不僅被用于預(yù)測每個(gè)興趣區(qū)域的類別和邊界框,還通過額外的全卷積網(wǎng)絡(luò)預(yù)測目標(biāo)的像素級位置
模型精度的比較

- x 軸表示模型的運(yùn)行速度,越往右表示模型的速度越快,越往左越慢
- y 軸表示 mAP(可以簡單認(rèn)為是邊界框的預(yù)測精度),越往上表示精度越高
- 圖中圓圈的大小表示內(nèi)存的使用
- Faster RCNN 相對來說精度比較高,但是它在精度提升的同時(shí),樣本的處理速度也在變慢(所以只有在對精度要求特別高的場景下會采用 Faster RCNN,但是在工業(yè)上使用較少)
總結(jié)
- R-CNN 是最早、也是最有名的一類基于錨框和 CNN 的目標(biāo)檢測算法(R-CNN 可以認(rèn)為是使用神經(jīng)網(wǎng)絡(luò)來做目標(biāo)檢測工作的奠基工作之一),它對圖像選取若干提議區(qū)域,使用卷積神經(jīng)網(wǎng)絡(luò)對每個(gè)提議區(qū)域執(zhí)行前向傳播以抽取其特征,然后再用這些特征來預(yù)測提議區(qū)域的類別和邊框
- Fast/Faster R-CNN持續(xù)提升性能:Fast R-CNN 只對整個(gè)圖像做卷積神經(jīng)網(wǎng)絡(luò)的前向傳播,還引入了興趣區(qū)域匯聚層(RoI pooling),從而為具有不同形狀的興趣區(qū)域抽取相同形狀的特征;Faster R-CNN 將 Fast R-CNN 中使用的選擇性搜索替換為參與訓(xùn)練的區(qū)域提議網(wǎng)絡(luò),這樣可以在減少提議區(qū)域數(shù)量的情況下仍然保持目標(biāo)檢測的精度;Mask R-CNN 在 Faster R-CNN 的基礎(chǔ)上引入了一個(gè)全卷積網(wǎng)絡(luò),從而借助目標(biāo)的像素級位置進(jìn)一步提升目標(biāo)檢測的精度
- Faster R-CNN 和 Mask R-CNN 是在追求高精度場景下的常用算法(Mask R-CNN 需要有像素級別的標(biāo)號,所以相對來講局限性會大一點(diǎn),在無人車領(lǐng)域使用的比較多)
單發(fā)多框檢測(SSD)
- 對每個(gè)像素生成多個(gè)以它為中心的多個(gè)錨框



- 輸入圖像之后,首先進(jìn)入一個(gè)基礎(chǔ)網(wǎng)絡(luò)來抽取特征,抽取完特征之后對每個(gè)像素生成大量的錨框(每個(gè)錨框就是一個(gè)樣本,然后預(yù)測錨框的類別以及到真實(shí)邊界框的偏移)
- SSD 在給定錨框之后直接對錨框進(jìn)行預(yù)測,而不需要做兩階段(為什么 Faster RCNN 需要做兩次,而 SSD 只需要做一次?SSD 通過做不同分辨率下的預(yù)測來提升最終的效果,越到底層的 feature map,就越大,越往上,feature map 越少,因此底層更加有利于小物體的檢測,而上層更有利于大物體的檢測)
- SSD 不再使用 RPN 網(wǎng)絡(luò),而是直接在生成的大量樣本(錨框)上做預(yù)測,看是否包含目標(biāo)物體;如果包含目標(biāo)物體,再預(yù)測該樣本到真實(shí)邊緣框的偏移
模型精度

- 上圖中綠色的點(diǎn)表示 SSD
- 從圖中可以看出,SSD 相對于Faster RCNN 來講速度快很多,但是精度不是太好
- SSD 的實(shí)現(xiàn)相對來講比較簡單,R-CNN 系列代碼的實(shí)現(xiàn)非常困難
總結(jié)
- SSD通過單神經(jīng)網(wǎng)絡(luò)來檢測模型
- 以每個(gè)像素為中心產(chǎn)生多個(gè)錨框
- 在多個(gè)段的輸出上進(jìn)行多尺度的檢測(底層檢測小物體,上層檢測大物體)
YOLO
- yolo 也是一個(gè) single-stage 的算法,只有一個(gè)單神經(jīng)網(wǎng)絡(luò)來做預(yù)測
- yolo 也需要錨框,這點(diǎn)和 SSD 相同,但是 SSD 是對每個(gè)像素點(diǎn)生成多個(gè)錨框,所以在絕大部分情況下兩個(gè)相鄰像素的所生成的錨框的重疊率是相當(dāng)高的,這樣就會導(dǎo)致很大的重復(fù)計(jì)算量。
- yolo 的想法是盡量讓錨框不重疊:首先將圖片均勻地分成 S * S 塊,每一塊就是一個(gè)錨框,每一個(gè)錨框預(yù)測 B 個(gè)邊緣框(考慮到一個(gè)錨框中可能包含多個(gè)物體),所以最終就會產(chǎn)生 S ^ 2 * B 個(gè)樣本,因此速度會遠(yuǎn)遠(yuǎn)快于 SSD
- yolo 在后續(xù)的版本(V2,V3,V4...)中有持續(xù)的改進(jìn),但是核心思想沒有變,真實(shí)的邊緣框不會隨機(jī)的出現(xiàn),真實(shí)的邊緣框的比例、大小在每個(gè)數(shù)據(jù)集上的出現(xiàn)是有一定的規(guī)律的,在知道有一定的規(guī)律的時(shí)候就可以使用聚類算法將這個(gè)規(guī)律找出來(給定一個(gè)數(shù)據(jù)集,先分析數(shù)據(jù)集中的統(tǒng)計(jì)信息,然后找出邊緣框出現(xiàn)的規(guī)律,這樣之后在生成錨框的時(shí)候就會有先驗(yàn)知識,從而進(jìn)一步做出優(yōu)化)
模型精度

- 上圖中表示 yolo v3 的直線底端表示論文中的原始精度,頂端表示通過改進(jìn)之后所能達(dá)到的最大精度
center net
- 基于非錨框的目標(biāo)檢測
- center net 的優(yōu)點(diǎn)在于簡單
- center net 會對每個(gè)像素做預(yù)測,用 FCN 對每個(gè)像素做預(yù)測(類似于圖像分割中用 FCN 對每個(gè)像素標(biāo)號),預(yù)測該像素點(diǎn)是不是真實(shí)邊緣框的中心點(diǎn)(將目標(biāo)檢測的邊緣框換算成基于每個(gè)像素的標(biāo)號,然后對每個(gè)像素做預(yù)測,就免去了一些錨框相關(guān)的操作)
Q&A
- 1、請問一下,測試數(shù)據(jù)增強(qiáng)做平均,是結(jié)果做平均還是概率做平均?還是看實(shí)際情況選擇??QA P2 - 00:00?
- 2、多模型融合是不是性價(jià)比不高?對小樣本數(shù)據(jù)呢??QA P2 - 00:32?
- 3、請問 RoI 會不會把圖片壓變形?這樣的話對預(yù)測有影響嗎??QA P2 - 02:45?
- 4、錨框的位置怎么在訓(xùn)練過程中越來越接近目標(biāo)框??QA P2 - 03:26?
- 5、請問在 SSD 中對于密集小目標(biāo)檢測時(shí),即便是第一個(gè) feature map 上的先驗(yàn)框的 stride 映射回原圖像時(shí),都遠(yuǎn)大于小目標(biāo)之間的距離時(shí)(比如文本行框),該怎么設(shè)置網(wǎng)絡(luò)??QA P2 - 04:14?
- 6、對于帶有方向的 box 預(yù)測時(shí),有什么速度快、精度高的網(wǎng)絡(luò)模型嗎??QA P2 - 06:44?
- 7、深度學(xué)習(xí)與統(tǒng)計(jì)學(xué)習(xí)的關(guān)系?(如果還有時(shí)間,老師幫忙看下原問題,比較長:https://discuss.d2l.ai/t/topic/1744/2)?QA P2 - 07:46?
- 8、目前這種非錨框?qū)崿F(xiàn)的有經(jīng)典論文推薦嗎?想去看一下?QA P2 - 08:53?
- 9、yolo 的錨框?qū)嵲诿總€(gè)網(wǎng)絡(luò)的中心進(jìn)行預(yù)測嗎??QA P2 - 08:55?
- 10、不同尺度的特征圖上對錨框進(jìn)行預(yù)測,最后怎么 scale 成原始圖像的真實(shí)預(yù)測框??QA P2 - 09:15?
- 11、想問一下對于一個(gè)物體進(jìn)行拍攝視頻,然后再進(jìn)行分類,圖片上面類別特征比較小,這種情況用 cnn 進(jìn)行圖片分類比較好,還是直接用目標(biāo)檢測比較好??QA P2 - 11:08?
- 12、當(dāng)下車牌識別使用什么模型或者技術(shù)是性能和準(zhǔn)確率綜合比較好的??QA P2 - 13:32?
- 13、最近也看了幾個(gè)模型的結(jié)構(gòu),我的理解是卷積、激活函數(shù)、池化、全連接等的組合,不知道這樣理解對不對,為什么不同的組合會有不同的效果呢,具體和什么有關(guān)系??QA P2 - 14:15?
----end----
其他參考:
1、《動手學(xué)深度學(xué)習(xí)》,課程安排,https://courses.d2l.ai/zh-v2/assets/pdfs/part-2_10.pdf
2、模型精度對比,https://cv.gluon.ai/model_zoo/detection.html
3、《動手學(xué)深度學(xué)習(xí)》,課程安排,https://courses.d2l.ai/zh-v2/assets/pdfs/part-2_11.pdf
4、《動手學(xué)深度學(xué)習(xí)》,課程安排,https://courses.d2l.ai/zh-v2/assets/pdfs/part-2_12.pdf
5、《動手學(xué)深度學(xué)習(xí)》,https://zh-v2.d2l.ai/chapter_computer-vision/rcnn.html