目标检测——从RCNN到Faster RCNN 串烧
本人小碩一枚,方向是深度學(xué)習(xí)的目標(biāo)檢測,故想把從RCNN到Faster RCNN整個線串一下,理清里面的整個設(shè)計流程和創(chuàng)新思路,也算是對大神的創(chuàng)新思維進(jìn)行學(xué)習(xí)。我會不定期改善博客里面可能存在的小錯誤,希望大家多多諒解支持啦。另外,在論文中已經(jīng)講到的點,如果不是特別重要的話,我不會再復(fù)述的啦,所以說各位看官先研讀研讀論文先,然后再看看我對這些論文的理解。對了,涉及到哪層是幾乘幾以及那層到底是多少這種細(xì)節(jié),在這里不做太多討論,除非涉及到核心思想,更多的細(xì)節(jié)將在我之后的博客——對Faster RCNN源碼的解讀中進(jìn)行。
什么是object detection
object detection我的理解,就是在給定的圖片中精確找到物體所在位置,并標(biāo)注出物體的類別。object detection要解決的問題就是在哪里,是什么,具體在哪里這整個流程的問題。然而,這個問題可不是那么容易解決的,物體的尺寸變化范圍很大,擺放物體的角度,姿態(tài)不定,而且可以出現(xiàn)在圖片的任何地方,更何況物體還可以是多個類別。故用一般的方法是比較難處理的,這也是為什么在深度學(xué)習(xí)興起之前,ILSVRC檢測比賽檢測那么沉寂的原因,大家都做的太差了嘛~~不過隨著Hinton在2012年的比賽用CNN虐殺其他團(tuán)隊之后,深度學(xué)習(xí)以及深度卷積網(wǎng)絡(luò)再一次進(jìn)入人們視線,這種比較困難的問題也漸漸有思路了。在開始接觸物體檢測和深度學(xué)習(xí)時,我想憑借深度學(xué)習(xí)強(qiáng)大的擬合能力,給它啥它都能學(xué),最開始的想法是,先訓(xùn)練出一個網(wǎng)絡(luò)能分出是否是物體,即先不管是什么物體,只要bounding box 與ground truth 的IOU大于某個閾值,就認(rèn)為是正樣本,小于某個閾值為負(fù)樣本,然后直接訓(xùn)練,然后直接給它ground truth,然后用當(dāng)前框位置與ground truth的歐式距離作為loss,讓它自己去學(xué)習(xí)什么是object以及object在哪里呢,也就是說把這個任務(wù)當(dāng)成分類問題+回歸問題來做??通過這個網(wǎng)絡(luò)在一張大圖sliding windows,就能確定存在物體的區(qū)域,再根據(jù)回歸,來使得bounding box框得更準(zhǔn)。不過實際上,想想就能知道,這種方法是開始沒有任何限制地去學(xué)習(xí),這樣會導(dǎo)致任務(wù)復(fù)雜度非常高,網(wǎng)絡(luò)會不收斂,而且在測試的時候會非常慢,因為不知道在哪里有什么東西,需要sliding windows并且需要不同尺度的縮放,另外并且在RCNN的論文中提到了不加限制直接當(dāng)回歸來做實際效果并不是特別好。我覺得不好的原因可能是學(xué)習(xí)的復(fù)雜度太高,這相當(dāng)于在一開始就沒有給任何限制,讓網(wǎng)絡(luò)自己去根據(jù)自己預(yù)測的和真實的框的距離差去學(xué)習(xí),這樣子的話,同一種物品在不同位置以不同的大小都可以認(rèn)為是全新的一個訓(xùn)練樣本,完全去擬合這樣的任務(wù)顯然是不太可能的。所以說,這種問題一定要先降低任務(wù)復(fù)雜度,然后再去學(xué)習(xí)降低復(fù)雜度的等價任務(wù)。當(dāng)然這是我看了這么多優(yōu)秀論文得出的馬后炮式的結(jié)論,不過這也恰好說明了Ross Girshick大神科研出RCNN這種跨時代的東東時,思路到底有多么地超前。他為了降低檢測任務(wù)的復(fù)雜度,把檢測任務(wù)最直觀的在哪里(回歸問題),轉(zhuǎn)化成先用傳統(tǒng)方法先定候選框(通過邊緣特征啊,輪廓特征啊什么的使得整個問題的復(fù)雜度降低,我不是全圖搜索object,而是只在符合proposals算法的區(qū)域來搜索),然后在確定是什么(是背景還是是某種物體),然后根據(jù)這些已經(jīng)判斷是物體的區(qū)域(object score分?jǐn)?shù)高于閾值)來進(jìn)行回歸(精確位置所在)。通過我以上的分析,我覺得檢測最難做的是網(wǎng)絡(luò)判斷物體大致在哪里這個過程,而具體是什么,精確位置,當(dāng)知道大致的位置后也就變得異常簡單了。這個思路下來,也就是RCNN,Fast RCNN,Faster RCNN這一條線了。
RCNN 詳解
說了這么多有關(guān)object detection的個人見解,我還是說說這個跨時代的RCNN吧,如果我寫的不夠詳細(xì)的話,我相信大家在別的博客上也能看到RCNN的介紹。流程圖大家應(yīng)該都比較熟悉了,
RCNN全程就是Regions with CNN features,從名字也可以看出,RCNN的檢測算法是基于傳統(tǒng)方法來找出一些可能是物體的區(qū)域,再把該區(qū)域的尺寸歸一化成卷積網(wǎng)絡(luò)輸入的尺寸,最后判斷該區(qū)域到底是不是物體,是哪個物體,以及對是物體的區(qū)域進(jìn)行進(jìn)一步回歸的微微調(diào)整(與深度學(xué)習(xí)里的finetune去分開,我想表達(dá)的就只是對框的位置進(jìn)行微微調(diào)整)學(xué)習(xí),使得框的更加準(zhǔn)確。這就是主要的思路,我去,直接說完了??還是再說一下具體細(xì)節(jié)吧,這樣也好為下一章過渡一下,哈哈。
正如上面所說的,RCNN的核心思想就是把圖片區(qū)域內(nèi)容送給深度網(wǎng)絡(luò),然后提取出深度網(wǎng)絡(luò)某層的特征,并用這個特征來判斷是什么物體(文章把背景也當(dāng)成一種類別,故如果是判斷是不是20個物體時,實際上在實現(xiàn)是判斷21個類。),最后再對是物體的區(qū)域進(jìn)行微微調(diào)整。實際上文章內(nèi)容也說過用我之前所說的方法(先學(xué)習(xí)分類器,然后sliding windows),不過論文用了更直觀的方式來說明這樣的消耗非常大。它說一個深度網(wǎng)絡(luò)(alexNet)在conv5上的感受野是195×195,按照我的理解,就是195×195的區(qū)域經(jīng)過五層卷積后,才變成一個點,所以想在conv5上有一個區(qū)域性的大小(7×7)則需要原圖為227×227,這樣的滑窗每次都要對這么大尺度的內(nèi)容進(jìn)行計算,消耗可想而知,故論文得下結(jié)論,不能用sliding windows的方式去做檢測(消耗一次用的不恰當(dāng),望各位看官能說個更加準(zhǔn)確的詞)。不過論文也沒有提為什么作者會使用先找可能區(qū)域,再進(jìn)行判斷這種方式,只是說他們根據(jù)09年的另一篇論文[1],而做的。這也算是大神們與常人不同的積累量吧。中間的深度網(wǎng)絡(luò)通過ILSVRC分類問題來進(jìn)行訓(xùn)練,即利用訓(xùn)練圖片和訓(xùn)練的分類監(jiān)督信號,來學(xué)習(xí)出這個網(wǎng)絡(luò),再根據(jù)這個網(wǎng)絡(luò)提取的特征,來訓(xùn)練21個分類器和其相應(yīng)的回歸器,不過分類器和回歸器可以放在網(wǎng)絡(luò)中學(xué)習(xí),這也是下面要講的Fast RCNN的內(nèi)容。
最后補(bǔ)充一下大牛們的針對rcnn的創(chuàng)新思路吧,從上面圖片我們可以把RCNN看成四個部分,ss提proposals,深度網(wǎng)絡(luò)提特征,訓(xùn)練分類器,訓(xùn)練對應(yīng)回歸器,這四個是相對獨立的,每種算法都有它的缺陷,那么我們?nèi)绾螌λM(jìn)行改進(jìn)呢?如果讓你現(xiàn)在對這個算法進(jìn)行改進(jìn),該怎么改進(jìn)呢??首先肯定能想到的是,如何讓深度網(wǎng)絡(luò)更好的訓(xùn)練,之前訓(xùn)練只用了分類信息,如果先利用ground truth信息把圖片與object 無關(guān)的內(nèi)容先cut掉,然后再把cut后的圖片用于深度網(wǎng)絡(luò)的訓(xùn)練,這樣訓(xùn)練肯定會更好。這是第一種思路,另外如果把最后兩個放在一起訓(xùn)練,并放入深度網(wǎng)絡(luò)中,這就是joint learning,也就是Fast RCNN的內(nèi)容,如果把ss也放入深度網(wǎng)絡(luò)中,成為一個大的網(wǎng)絡(luò),則是Faster RCNN的內(nèi)容。這也就是后面一系列論文的思路了。(這個如何創(chuàng)新的思維是從某某公司的深度學(xué)習(xí)講座聽到的,我只是深刻學(xué)習(xí)后地一名合格的搬運工,哈哈。)
SPP詳解
SPP網(wǎng)絡(luò),我不得不要先說,這個方法的思想在Fast RCNN, Faster RCNN上都起了舉足輕重的作用。SPP網(wǎng)絡(luò)主要是解決深度網(wǎng)絡(luò)固定輸入層尺寸的這個限制,也從各個方面說明了不限制輸入尺寸帶來的好處。文章在一開始的時候就說明了目前深度網(wǎng)絡(luò)存在的弊端:如果固定網(wǎng)絡(luò)輸入的話,要么選擇crop策略,要么選擇warp策略,crop就是從一個大圖扣出網(wǎng)絡(luò)輸入大小的patch(比如227×227),而warp則是把一個bounding box的內(nèi)容resize成227×227 。無論是那種策略,都能很明顯看出有影響網(wǎng)絡(luò)訓(xùn)練的不利因素,比如crop就有可能crop出object的一個部分,而無法準(zhǔn)確訓(xùn)練出類別,而warp則會改變object的正常寬高比,使得訓(xùn)練效果變差。接著,分析了出深度網(wǎng)絡(luò)需要固定輸入尺寸的原因是因為有全鏈接層,不過在那個時候,還沒有FCN的思想,那如何去做才能使得網(wǎng)絡(luò)不受輸入尺寸的限制呢?Kaiming He 大神就想出,用不同尺度的pooling 來pooling出固定尺度大小的feature map,這樣就可以不受全鏈接層約束任意更改輸入尺度了。下圖就是SPP網(wǎng)絡(luò)的核心思想:
通過對feature map進(jìn)行相應(yīng)尺度的pooling,使得能pooling出4×4, 2×2, 1×1的feature map,再將這些feature map concat成列向量與下一層全鏈接層相連。這樣就消除了輸入尺度不一致的影響。訓(xùn)練的時候就用常規(guī)方法訓(xùn)練,不過由于不受尺度的影響,可以進(jìn)行多尺度訓(xùn)練,即先resize成幾個固定的尺度,然后用SPP網(wǎng)絡(luò)進(jìn)行訓(xùn)練,學(xué)習(xí)。這里講了這么多,實際上我想講的是下面的 東西, SPP如何用在檢測上面。論文中實際上我覺得最關(guān)鍵的地方是提出了一個如何將原圖的某個region映射到conv5的一種機(jī)制,雖然,我并不是太認(rèn)可這種映射機(jī)制,等下我也會說出我認(rèn)為合理的映射方法。論文中是如何映射的,實際上我也是花了好久才明白。
首先,我想先說明函數(shù)這個東東,當(dāng)然我不是通過嚴(yán)謹(jǐn)?shù)亩x來說明。什么是y=f(x),我認(rèn)為只要輸入x,有一組固定的操作f,然后產(chǎn)生一個對應(yīng)的y,這樣子就算是函數(shù)。根據(jù)輸入有一個一一對應(yīng)的輸出,這就是函數(shù)。這樣理解的話,卷積也是函數(shù),pooling也是函數(shù)。當(dāng)然我并不想說明函數(shù)是什么,什么是函數(shù),實際上我想強(qiáng)調(diào)的是一一對應(yīng)這樣的關(guān)系。大家都知道,現(xiàn)在默許的無論是卷積還是pooling(無stride),都會加相應(yīng)的pad,來使得卷積后的尺寸與卷積前相同,當(dāng)然這種做法還個好處就是使得邊緣不會只被卷積一次就消失了~這樣子的話,實際上原圖與卷積后的圖就是一一對應(yīng)的關(guān)系。原圖的每一個點(包括邊緣)都可以卷積得到一個新的點,這就是一一對應(yīng)了。如下圖所示(自己畫得太丑):
綠色部分是圖片,紫色部分是卷積核。
如上圖可以看出,藍(lán)色的區(qū)域是原圖區(qū)域,而紅色的區(qū)域是padding區(qū)域,紫色的是卷積核。卷積后得到的區(qū)域與原區(qū)域是一一對應(yīng)的。而卷積或pooling增加stride的話就相當(dāng)與原圖先進(jìn)行卷積或池化,再進(jìn)行sampling,這還是能一一對應(yīng)的,就這樣原圖的某個區(qū)域就可以通過除以網(wǎng)絡(luò)的所有stride來映射到conv5后去區(qū)域。終于把這里講出來了,大家如果直接按照函數(shù)的一一對應(yīng)關(guān)系去理解,很容易理解為什么原圖的區(qū)域除以所有的stride就是映射到conv5的區(qū)域。這樣子就可以在原圖上的一些操作放在conv5上進(jìn)行,這樣可以減小任務(wù)復(fù)雜度。不過,我并不是太認(rèn)可這種映射機(jī)制,這種映射只能是點到點的關(guān)系,不過我覺得從原圖的某個區(qū)域R映射到conv5的區(qū)域r,應(yīng)該r對R敏感,換句話說,應(yīng)該r感受野應(yīng)該與R有交集。這樣子的話,示意圖如下:
其中藍(lán)色的為conv的神經(jīng)元感受野,紅色的是原圖的某個感興趣區(qū)域,而黑色框我才認(rèn)為是要映射到conv5的區(qū)域。
使用SPP進(jìn)行檢測,先用提候選proposals方法(selective search)選出候選框,不過不像RCNN把每個候選區(qū)域給深度網(wǎng)絡(luò)提特征,而是整張圖提一次特征,再把候選框映射到conv5上,因為候選框的大小尺度不同,映射到conv5后仍不同,所以需要再通過SPP層提取到相同維度的特征,再進(jìn)行分類和回歸,后面的思路和方法與RCNN一致。實際上這樣子做的話就比原先的快很多了,因為之前RCNN也提出了這個原因就是深度網(wǎng)絡(luò)所需要的感受野是非常大的,這樣子的話需要每次將感興趣區(qū)域放大到網(wǎng)絡(luò)的尺度才能卷積到conv5層。這樣計算量就會很大,而SPP只需要計算一次特征,剩下的只需要在conv5層上操作就可以了。當(dāng)然即使是這么完美的算法,也是有它的瑕疵的,可能Kaiming He大神太投入 SPP的功效了,使得整個流程框架并沒有變得更加完美。首先在訓(xùn)練方面,SPP沒有發(fā)揮出它的優(yōu)勢,依舊用了傳統(tǒng)的訓(xùn)練方法,這使得計算量依舊很大,而且分類和bounding box的回歸問題也可以聯(lián)合學(xué)習(xí),使得整體框架更加完美。這些Kaiming He都給忽略了,這樣也就有了第二篇神作 Fast RCNN。
Fast RCNN
在我上帝視角(看完整個線)看來,Fast RCNN提出新的東西并不是太多,往往都是別人忽略的東西,實際上也算是對SPP上的撿漏。當(dāng)然大神能夠找到漏可以撿,所以說這并不是貶義,只是我感覺對這篇論文客觀的評價。首先fast rcnn說無論是訓(xùn)練還是測試都比RCNN 和SPP快很多倍。其次,自己提出了一個特殊的層RoI,這個實際上是SPP的變種,SPP是pooling成多個固定尺度,而RoI只pooling到一個固定的尺度(6×6)。網(wǎng)絡(luò)結(jié)構(gòu)與之前的深度分類網(wǎng)絡(luò)(alex)結(jié)構(gòu)類似,不過把pooling5層換成了RoI層,并把最后一層的Softmax換成兩個,一個是對區(qū)域的分類Softmax(包括背景),另一個是對bounding box的微調(diào)。這個網(wǎng)絡(luò)有兩個輸入,一個是整張圖片,另一個是候選proposals算法產(chǎn)生的可能proposals的坐標(biāo)。訓(xùn)練的時候,它指出了SPP訓(xùn)練的不足之處,并提出新的訓(xùn)練方式,就是把同張圖片的prososals作為一批進(jìn)行學(xué)習(xí),而proposals的坐標(biāo)直接映射到conv5層上,這樣相當(dāng)于一個batch一張圖片的所以訓(xùn)練樣本只卷積了一次。文章提出他們通過這樣的訓(xùn)練方式或許存在不收斂的情況,不過實驗發(fā)現(xiàn),這種情況并沒有發(fā)生。這樣加快了訓(xùn)練速度。另外,它同時利用了分類的監(jiān)督信息和回歸的監(jiān)督信息,使得網(wǎng)絡(luò)訓(xùn)練的更加魯棒,而且效果更好。值得注意的是,他在回歸問題上并沒有用很常見的2范數(shù)作為回歸,而是使用所謂的魯棒L1范數(shù)作為損失函數(shù)(可能在其他地方很常見,不過我是第一次見)。實際訓(xùn)練時,一個batch訓(xùn)練兩張圖片,每張圖片訓(xùn)練64個RoIs(Region of Interest),前向反向計算就不說了,如果把pooling的反向計算理解了,這個roi應(yīng)該不會太難。這篇論文提到了一個讓人引發(fā)遐想的地方就是它將比較大的全鏈接層用SVD分解了一下使得檢測的時候更加迅速。雖然是別人的工作,但是引過來恰到好處。最后作者寫了個類似討論的板塊,并從實驗角度說明了多任務(wù)對訓(xùn)練是否有幫助?尺度不變性如何實現(xiàn)?是單尺度學(xué)習(xí)還是多尺度學(xué)習(xí)?(注意,這里的尺度是對整張圖片的resize尺度)得到的結(jié)論是多尺度學(xué)習(xí)能提高一點點map,不過計算量成倍的增加了,故單尺度訓(xùn)練的效果更好。最后在SVM和Softmax的對比實驗中說明,SVM的優(yōu)勢并不明顯,故直接用Softmax將整個網(wǎng)絡(luò)整合訓(xùn)練更好。
Faster RCNN詳解
就像之前在RCNN章節(jié)提到的創(chuàng)新思路所說,Faster RCNN 將selective search這樣的算法整合到深度網(wǎng)絡(luò)中,這樣不光解決了selective search這樣的算法是cpu實現(xiàn),速度慢的問題,而且與深度網(wǎng)絡(luò)相結(jié)合,共享前面的卷積計算,這樣做計算效率更高。而其他部分則與Fast RCNN差異不大。故這里主要講些Region Proposal Networks的設(shè)計和訓(xùn)練思路。
上圖是RPN的網(wǎng)絡(luò)流程圖,即也是利用了SPP的映射機(jī)制,從conv5上進(jìn)行滑窗來替代從原圖滑窗。不過,要如何訓(xùn)練出一個網(wǎng)絡(luò)來替代selective search相類似的功能呢??實際上思路很簡單,就是先通過SPP根據(jù)一一對應(yīng)的點從conv5映射回原圖,根據(jù)設(shè)計不同的固定初始尺度訓(xùn)練一個網(wǎng)絡(luò),就是給它大小不同(但設(shè)計固定)的region圖,然后根據(jù)與ground truth的覆蓋率給它正負(fù)標(biāo)簽,讓它學(xué)習(xí)里面是否有object即可。這就又變成我介紹RCNN之前提出的方法,訓(xùn)練出一個能檢測物體的網(wǎng)絡(luò),然后對整張圖片進(jìn)行滑窗判斷,不過這樣子的話由于無法判斷region的尺度和scale ratio,故需要多次放縮,這樣子測試,估計判斷一張圖片是否有物體就需要n久。如何降低這一部分的復(fù)雜度??要知道我們只需要找出大致的地方,無論是精確定位位置還是尺寸,后面的工作都可以完成,這樣子的話,與其說用小網(wǎng)絡(luò),簡單的學(xué)習(xí)(這樣子估計和蒙差不多了,反正有無物體也就50%的概率),還不如用深的網(wǎng)絡(luò),固定尺度變化,固定scale ratio變化,固定采樣方式(反正后面的工作能進(jìn)行調(diào)整,更何況它本身就可以對box的位置進(jìn)行調(diào)整)這樣子來降低任務(wù)復(fù)雜度呢。這里有個很不錯的地方就是在前面可以共享卷積計算結(jié)果,這也算是用深度網(wǎng)絡(luò)的另一個原因吧。而這三個固定,我估計也就是為什么文章叫這些proposal為anchor的原因了。這個網(wǎng)絡(luò)的結(jié)果就是卷積層的每個點都有有關(guān)于k個achor boxes的輸出,包括是不是物體,調(diào)整box相應(yīng)的位置。這相當(dāng)于給了比較死的初始位置(三個固定),然后來大致判斷是否是物體以及所對應(yīng)的位置,這樣子的話RPN所要做的也就完成了,這個網(wǎng)絡(luò)也就完成了它應(yīng)該完成的使命,剩下的交給其他部分完成就好了。
以上就是我對object detection的RCNN,Fast RCNN, Faster RCNN的整個理解,寫的比較倉促,而且是讀完整條線的論文才決定寫這篇博客的,故有很多是回憶的,卻又懶得再向文章確認(rèn),不過之后的博客會邊讀邊寫。
我這也是第一次寫博客,如果有理解不對的地方或者邏輯上有不對的地方,請大家指出來,糾正我的錯誤。
總結(jié)
以上是生活随笔為你收集整理的目标检测——从RCNN到Faster RCNN 串烧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论文阅读:SSD: Single Sho
- 下一篇: 2、AD工程创建步骤