R-CNN 物體檢測第一彈
? 今天,重讀了 R-CNN 的 TPAMI 版本,感覺受益頗多。該版相比之前的會議版,在檢測流程和實現(xiàn)細(xì)節(jié)上表述得更為清晰。此外,因為是改投 TPAMI 的關(guān)系,因此文中補充了很多額外的實驗和分析,尤其是檢測系統(tǒng)為什么最后設(shè)計成這樣的緣由。接下來,我就簡要記錄一下這篇文章的主要思想和作者對檢測的思考,也加入我個人的理解。
緣起
? 為了推動計算機視覺領(lǐng)域的研究進展,斯坦福大學(xué)的 Li Feifei 組根據(jù) wordnet 的思想,建立了一個包羅了近乎海量圖片的數(shù)據(jù)庫ImageNet 。在那個 SVM 還異常火熱的時代,ImageNet 這種量級的數(shù)據(jù)庫對于現(xiàn)有的圖像分類,目標(biāo)檢測的技術(shù)來說簡直就是災(zāi)難。為了進一步對現(xiàn)有的分類,檢測技術(shù)進行衡量,ImageNet 從2010年開始舉辦 ILSVRC挑戰(zhàn)賽 。這個挑戰(zhàn)賽的任務(wù)主要包括圖像分類,分割,目標(biāo)檢測等。比賽剛剛興起的時候,還是 ensemble learning(比如隨機森林),SVM的天下。而且參賽者們通常拼了老命,好了很多內(nèi)存,組合了很多學(xué)習(xí)器,最后也提高不了多少正確率。
? ILSVRC12,伴隨著船堅炮利的西方國家(加拿大)的Hinton組的AlexNet戰(zhàn)艦的一聲炮響,大家一起進入了CNN+vision的大航海時代... 為什么當(dāng)時CNN模型在圖片分類任務(wù)上能取得這么大的進步,主要是他們當(dāng)時采用的方法包含了如下幾個優(yōu)點:
-
CNN model 在提取圖像 feature 方面的優(yōu)秀能力。
傳統(tǒng)的圖像特征,例如 SIFT,GIST,HOG等都是由計算機視覺專家在數(shù)學(xué)模型推導(dǎo)的基礎(chǔ)上提出來的,這些特征通常被SVM等分類模型用來完成圖像分類。但是這些特征存在著一些與生俱來的缺點:首先,這些特征最初是由科學(xué)家提出的,最初都只是用在特定領(lǐng)域,比如SIFT之于關(guān)鍵點,HOG之于局部邊緣等,但是并未在圖像分類和目標(biāo)檢測任務(wù)上對特征提取的方式做過優(yōu)化;其次,在經(jīng)過復(fù)雜的特征提取步驟之后,再送入SVM分類模型進行訓(xùn)練,最后得出的模型效果不好,我們很難去判斷到底是模型的泛化能力問題,還是特征的表示能力問題。
而CNN model 提取特征的方式則大不一樣,首先它由通用的 卷積層相疊加的方式來獲得,其次,該特征提取的方式是經(jīng)過學(xué)習(xí)得到,而且該學(xué)習(xí)過程是和圖像分類任務(wù)密切聯(lián)系的。也就是說,該特征提取方式實現(xiàn)了對圖像分類任務(wù)的自適應(yīng)。那么這樣會帶來一個問題,要是分類任務(wù)變化了,例如類別數(shù)量變化了,圖像類別變化,甚至不是分類任務(wù)了,該模型不就得重新提取了嗎?在這里我先說,確實是這樣的。但是,人們開發(fā)了 find-tuning 方法以及與之對應(yīng)的transfer-learning理論來解決這個由任務(wù),數(shù)據(jù)變化帶來的模型訓(xùn)練問題。
-
ImageNet 大量數(shù)據(jù)帶來的優(yōu)勢。
圖像分類任務(wù),從機器學(xué)習(xí)的角度來說,就是一個學(xué)習(xí)任務(wù)。
從學(xué)習(xí)的角度來講,我們需要做好以下兩件互為矛盾的事情:第一,構(gòu)造學(xué)習(xí)能力很強的學(xué)習(xí)算法;第二,構(gòu)造泛化能力不弱的學(xué)習(xí)算法。放在函數(shù)的逼近和擬合任務(wù)下來看,第一件事情要求:給我越多越多的數(shù)據(jù)點(x,y),我能擬合出一個萬能的函數(shù)f(x)來通過這些數(shù)據(jù)點附近;第二件事情要求:我擬合出的萬能函數(shù)f(x)能對未知的x求出更準(zhǔn)確的y,即f(x)在訓(xùn)練集和測試集上的performance趨向于一致。那為什么這兩個事情相互矛盾呢?第一,現(xiàn)實世界的數(shù)據(jù)點通常帶有很大的噪聲,如果強行學(xué)習(xí),使得函數(shù)在訓(xùn)練集的每個數(shù)據(jù)點上都十分逼近ground-truth,這樣得到的模型通常都十分復(fù)雜,并且這個模型在測試集上的表現(xiàn)通常很差。這就是過擬合:測試集上的performance 遠(yuǎn)遠(yuǎn)比 訓(xùn)練集差。過擬合的來源一般就是f(x)太復(fù)雜。第二,如果將重點放在使得f(x)在測試集上的performance不差,那么f(x)就會傾向于變得異常簡單(極端情況就是一直輸出常數(shù),這樣performance都很弱),至少這樣雖然學(xué)習(xí)到的內(nèi)容比較少,但是不會因為過擬合而使得測試集performance極差。
那么,有沒有什么辦法跳出這個怪圈呢?目前還沒有,畢竟這是學(xué)習(xí)理論決定的。 我們可以在盡可能保證泛化能力的前提下,提高學(xué)習(xí)能力。
以CNN model為代表的深度學(xué)習(xí)模型是多層前饋神經(jīng)網(wǎng)絡(luò)的特別版,而多層前饋神經(jīng)網(wǎng)絡(luò)本身是一個學(xué)習(xí)能力極強的模型。在此基礎(chǔ)上,為了提高其泛化能力,除了采用加正則的方法,那就是讓訓(xùn)練數(shù)據(jù)盡可能夠多,希望以此來覆蓋更多的圖像分布,從而使得CNN model在遇到測試集之前,能見到更多的帶supervision的訓(xùn)練集樣本,然后通過學(xué)習(xí)使得最后在測試集上的效果不差。因此,如果以ImageNet中的百萬量級的數(shù)據(jù)為訓(xùn)練集,我們就能通過學(xué)習(xí)得到一個不那么容易過擬合的CNN model,關(guān)鍵這個CNN model 的表示擬合能力很強,因此更不會欠擬合。
如果把學(xué)習(xí)比作做菜,那么現(xiàn)在的CNN model就是一口大鍋,而ImageNet就是能配上這口大鍋的天量食材。而現(xiàn)在唯一需要做的就是用一把巨大的鏟子來翻動CNN model這臺做菜機器了。
-
NVIDIA GPU 戰(zhàn)術(shù)核顯卡和CNN model計算方式天然匹配的計算架構(gòu)。
前面說到,CNN model是多層前饋神經(jīng)網(wǎng)絡(luò)的一種。眾所周知,多層前饋神經(jīng)的層數(shù)通常有5-20層,但是每層內(nèi)的隱藏單元數(shù)量則非常巨量(比如CNN Model的某Conv層就可能有56x56x128個隱藏單元),如果采用CPU依次對這些單元進行計算,那么將十分耗時。但是,每一層的隱藏單元間的值互不直接影響,因此可以同時利用權(quán)重和前一層的輸出來求解后一層的每一個隱藏單元的值,這樣在每層內(nèi)部就天然具備了并行計算的特性。
? 另一方面,N家開發(fā)的帶CUDA計算核心的顯卡,又恰好能進行這樣的并行計算。當(dāng)然這個巧合并不完全是因為N家高瞻遠(yuǎn)矚,而是因為顯卡之前就是采用并行計算的方式來對游戲畫面進行著色的。當(dāng)然,另一方面也是因為黃教主十分慷慨,經(jīng)常給各大實驗室送顯卡,本蒟蒻所在的實驗室居然都申請到了,于是大家都開始用它了。
? 這是以上這些優(yōu)勢,使得AlexNet在ILSVRC12的圖像分類比賽拔得頭籌,并且一下子就把結(jié)果提高了很多個百分點。如此一來,那么目標(biāo)檢測任務(wù)能夠利用CNN model來學(xué)到優(yōu)秀的特征以用于自身提高嗎?要知道,檢測不僅要求對檢測到的物體準(zhǔn)確地判斷其類別,更要對物體進行準(zhǔn)確的定位。此外,ILSVRC中的圖像分類數(shù)據(jù)是百萬量級的標(biāo)記數(shù)據(jù),是因為標(biāo)注者只需要對每張圖片(通常包含單類物體)判斷屬于哪一類即可。而對目標(biāo)檢測任務(wù)來講,一張圖片可能包含多個目標(biāo),那么標(biāo)注者不僅需要標(biāo)注出每個目標(biāo)的類別,還需要給出目標(biāo)的精確位置(框住目標(biāo)的bounding box(簡記為bbox)的中心和長寬)。所以能夠用于目標(biāo)檢測任務(wù)的標(biāo)記數(shù)據(jù)就十分少。例如 PASCAL VOC比賽中的數(shù)據(jù),最開始只有20類,后來才有了200類,每一類的目標(biāo)數(shù)量也比較有限。所以,即便能將CNN model用于目標(biāo)檢測,也找不到足夠的標(biāo)記數(shù)據(jù)來驅(qū)動CNN model的學(xué)習(xí)。那么,我們看R-CNN是如何解決兩個問題的?
主要檢測流程
? 那么,R-CNN是如何解決上述問題的呢?
? 首先,如何利用CNN model來進行檢測?更大一點,如何利用分類來進行檢測。作者們借鑒前人的方法,采用類似sliding window的思想,在每張圖片生成可能包含的region,然后嘗試?yán)肅NN 圖片分類model來對每個region來判斷目標(biāo)類別。這樣既實現(xiàn)了目標(biāo)檢測中的類別判斷,又在生成region時已經(jīng)附帶得到了bbox的位置信息。
? 其次,如何應(yīng)對目標(biāo)檢測任務(wù)的標(biāo)記數(shù)據(jù)不足的問題?作者們考慮采用遷移學(xué)習(xí)的策略,直接將用于ImageNet圖片分類的網(wǎng)絡(luò)搬過來用于region圖片的特征提取。但是這樣會因為domain的不同,使得分類任務(wù)性能有所下降,因此還需要利用相對ImageNet來說是少量的 目標(biāo)檢測標(biāo)記數(shù)據(jù)來進行分類網(wǎng)絡(luò)的fine-tuning。具體地,
R-CNN的檢測流程主要包含如下幾步:
-
采用region proposal generation算法(這里用的是Selective Search算法)來獲取圖片中可能包含object的region。
這里的region proposal generation,不是簡單的sliding window,而是希望盡可能得到一些可能包含object的region,即更像object而非background的region。這些region可能存在多種scale,position。如果采用傳統(tǒng)的sliding windows,不僅產(chǎn)生了大量的無意義的region,也為后面對region的逐個分類增加很大的計算量。因此作者在這里用的是 Selective Search 算法,該算法一般能生成2000+左右的region,并且一般能夠囊括圖片中目標(biāo)所在的region。文中5.2部分的敘述顯示,在ILSVRC13 的數(shù)據(jù)上,SS得到的region中,相對ground-truth的bbox來說,有91.6%的召回率;而對PASCAL VOC的數(shù)據(jù),則有98%。
-
將上一步得到的region對應(yīng)的圖片部分逐個提取出來,依次resize到標(biāo)準(zhǔn)大小,然后送入CNN model來提取圖像feature(文中用到的是pool5,fc6,fc7層的特征)。
首先,如何resize到標(biāo)準(zhǔn)大小,文中的7.1部分給出了三種resize策略(詳細(xì)請看文中),結(jié)論是,在第一步得到的proposal周圍一定范圍內(nèi)的context也納入到region中,可以提高mAP。最后,將所有的region對應(yīng)的圖片resize到標(biāo)準(zhǔn)大小,這是因為當(dāng)前使用的CNN model并非全卷積,使用了標(biāo)準(zhǔn)輸入大小。
其次,如果直接采用從ImageNet上訓(xùn)練出來的分類網(wǎng)絡(luò)作為提取特征的網(wǎng)絡(luò)的話,整體檢測性能也比之前的方法好很多。但是如果再在目標(biāo)檢測的標(biāo)記數(shù)據(jù)上進行fine-tuning的話,檢測性能將得到進一步的提升。
一旦涉及該多分類CNN model的fine-tuning訓(xùn)練的話,首先要解決的問題是:各個類別樣本的定義。文中的3.3.2部分給出的定義是:對訓(xùn)練集中每張圖片做SS算法,得到的region中,和ground-truth bbox的IOU>=0.5著被認(rèn)為是該ground-truth bbox對應(yīng)類比的正樣本,而其余的IOU < 0.5都被視作負(fù)樣本,即代表background的樣本。其次,需要將原始的多分類CNN model最后的softmax層由原來的1000分類改為現(xiàn)有的N+1分類,其中1000為原網(wǎng)絡(luò)的softmax層的單元數(shù),N為現(xiàn)有目標(biāo)檢測任務(wù)中的目標(biāo)類別個數(shù)。最后,由于類別樣本相對background樣本來說還是太少,因此在fine-tuning的過程中,每個mini-batch中,背景樣本占比75%,其余為隨機抽取的類別樣本。
-
然后將提取到的圖像特征送到class-specific的SVM算法中去判斷,每個region對應(yīng)的是什么類別(如果什么目標(biāo)都不是,則屬于背景類別),以及屬于該類別的概率。如果該概率 > 某個閾值(例如0.5)。
上一步的fine-tuning的過程,是對一個自帶softmax多分類層的分類網(wǎng)絡(luò)進行微調(diào)。那么,為什么不直接用上述網(wǎng)絡(luò)進行分類,而要將特征抽取出來,采用SVM算法進行分類呢?文中7.2部分給出了作者的理由:采用softmax層分類相比SVM分類,mAP從54.2%降到了50.9%;這可能有兩方面造成:第一,fine-tuning過程定義的正樣本只要求IOU>=0.5,這不適合precision localization;第二,softmax是在隨機采樣的背景樣本上進行訓(xùn)練,而SVM采用的則是hard-negative mining,這提高了分類準(zhǔn)確度。
具體,這里的SVM分類算法學(xué)習(xí)的是N個class-specific SVM classifier,對每個classifier來說,正樣本就是ground-truth bbox,其余和ground-truth bbox的IOU<0.3的generated region都是負(fù)樣本。注意,這里的正樣本和fine-tuning中的定義完全不同。按照作者在7.2部分的描述,最開始作者首先想到采用SVM+pretrained model,并且經(jīng)試驗發(fā)現(xiàn)從SVM現(xiàn)在定義的正負(fù)樣本學(xué)到的SVM模型很好。后來又決定引入fine-tuning,然后發(fā)現(xiàn)之前的正負(fù)樣本定義方式效果很差,采用現(xiàn)在的0.5閾值做fine-tuning效果好了很多。這里的關(guān)鍵不是閾值,而是fine-tuning 中如果采用SVM model那樣的正樣本定義,那么可以用于訓(xùn)練的正樣本就太少了。因此,在改變了fine-tuning的正樣本定義之后,正樣本大概增加了30倍以上,如此fine-tuning過程的效果提了上去。但接下來的問題就是 這樣造成網(wǎng)絡(luò)的precise localization很差,這也是之前提到采用SVM模型做分類的原因之一。
由此看來,這就是一個分類性能+定位性能+訓(xùn)練難易度互為trade-off的過程啊
-
最后,為了提高目標(biāo)的定位精度,采用 bbox regression 技術(shù)來對object的bbox進行修正。
這是一門錦上添花的技術(shù),文中引用的是DPM算法 TPAMI10版本: "Object detection with discriminatively trained part based models"。其主要思想就是:訓(xùn)練一個regressor,通過現(xiàn)有region的(Px,Py,Pw,Py)來預(yù)測真實的(Gx,Gy,Gw,Gh)。
為什么需要作修正呢?這主要是因為目標(biāo)檢測任務(wù)除了注重每個region的分類精度外,還看重region的位置準(zhǔn)確度。但是之前在第一步SS算法時,實際上已經(jīng)將region的位置固定下來了。這里再進行調(diào)整還有提升空間嗎?有的,實驗均顯示采用了bbox regression的mAP有所提升。定性來說,可以這么理解,N個類別中,例如人,其大致的aspect和structure是固定的。如果此時得到一個分類為人的region,采用的bbox regression就可以理解為對該region的位置和長寬進行調(diào)整,使得改造后的aspect和structure更接近人的比例。上面的想法也說明,需要訓(xùn)練的是類別-敏感的bbox regressor。此外,我個人猜測,一個通用的對所有類別一致的bbox regressor可能對提高region的定位精度并沒有什么用,當(dāng)然這個猜想需要驗證,文中尚未給出。
具體地,文中的bbox regressor是一個嶺回歸模型,訓(xùn)練樣本對并不簡單的(Px,Py,Pw,Ph)和(Gx,Gy,Gw,Gh),而是經(jīng)過了一番數(shù)據(jù)處理的(Px,Py,Pw,Ph)和(tx,ty,tw,th),詳細(xì)的數(shù)據(jù)變換請參看文中7.3部分。
值得注意的是,為了訓(xùn)練好這個模型,在構(gòu)建訓(xùn)練樣本對時,針對每個region proposal P,只采用和P的IOU最大的ground-truth bbox G,且該IOU必須大于0.6的閾值。這樣組成的樣本對才能進入 bbox regression的訓(xùn)練集。也就是說,選擇靠得盡可能相近的P和G來進行訓(xùn)練。這主要是考慮到bbox regression不能講原有的位置P帶得太遠(yuǎn),不然影響最終的mAP效果。
此外,實驗發(fā)現(xiàn),只進行一次bbox regression即可,若是在當(dāng)前回歸的結(jié)果上在進行一次bbox regression,效果并沒有改善。
其它
文中還做了很多實驗來驗證每個模塊的意義,例如:
- 4.1節(jié)的可視化,遍歷數(shù)據(jù)庫,測試使得pool5層的某六個unit響應(yīng)極高的前幾名的region,從示例圖看出,pool5 unit已經(jīng)開始對應(yīng)上一些特定的概念。
- 4.2.1節(jié)提到的不采用fine-tuning時,pool5,fc6,fc7特征分別用于SVM分類時,檢測性能相對DPM等均有提升,但是pool5的提升最大。文中說是說明pool5之前的卷積特征更為重要,我認(rèn)為“百尺竿頭,更進一步”,檢測性能的提升本來就是越高越難,fc7相對pool5提高不多,也無可非議。
- 4.2.2節(jié)提到采用fine-tuning時,pool5,fc6,fc7特征用于SVM分類時,檢測性能又有提升,且此時的fc層的提升更大。這說明 fine-tuning 顯著地調(diào)整了fc 層的權(quán)重,使其更適用于目標(biāo)數(shù)據(jù)集的檢測任務(wù)。綜合上一條,發(fā)現(xiàn)卷積層是一個相對通用的特征提取器,而fc層更多的是針對task和數(shù)據(jù)集的不同進行自適應(yīng)調(diào)整。