0
本文作者: 大牛講堂 | 2017-08-11 17:19 |
雷鋒網(wǎng)按:地平線大牛講堂算法工程師入門第三期重磅來襲!本期地平線深度學(xué)習(xí)算法工程師黃李超將為大家?guī)砦矬w檢測相關(guān)內(nèi)容的分享,全文約8000字,建議閱讀時間20分鐘,歡迎轉(zhuǎn)發(fā)或收藏。
前期傳送門:
干貨 | 算法工程師入門第一期——羅恒講深度學(xué)習(xí)
干貨 | 算法工程師入門第二期——穆黎森講增強學(xué)習(xí)(一)
干貨 | 算法工程師入門第二期——穆黎森講增強學(xué)習(xí)(二)
本次分享主要針對一些對深度學(xué)習(xí)和物體檢測感興趣的同學(xué)。內(nèi)容主要包括:
第一,什么是物體檢測,如何去評價一個物體里系統(tǒng)的好壞。
第二,物體檢測整個的框架是怎么樣的?它一般包含了圖像的分類和物體檢測的定位。
第三,介紹物體檢測的歷史發(fā)展,從傳統(tǒng)的人工設(shè)計的一些圖像特征加上分類器到現(xiàn)在的深度學(xué)習(xí)。
▼
What’s Computer Vision
介紹物體檢測之前,我們首先要知道什么是計算機視覺。計算機視覺是計算機科學(xué)的一個分支領(lǐng)域,旨在構(gòu)造智能算法和程序,來“觀察”這個世界。比如說,一個機器人手里拿著一個東西,它可以知道這個手上拿著的是一個魔方。這個問題對人而言十分簡單,但是對于計算機卻不是那么容易的。因為計算機拿到的信息,是一系列的二進(jìn)制數(shù)據(jù),它描述了每個像素點的顏色強度,而計算機本身是比較困難將這些信息抽象成為一種比較高層語意的表達(dá),去對應(yīng)現(xiàn)實生活中的名詞概念。
所以,我們通常所說的“觀察”(see),實際上是已經(jīng)包含了對視覺信息的加工,以及和真實世界的關(guān)系映射。那么在計算機視覺領(lǐng)域,我們怎樣去定義“觀察”(see)這個概念,和我們?nèi)祟惖睦斫庖恢履兀窟@里我們把它分成三個層次:
第一個層次,也是最經(jīng)典的解釋,1982年David Marr(著名的生物神經(jīng)學(xué)家,計算機視覺理論的鼻祖),他總結(jié)的“To know what is where by looking”。中文意思就是知道有什么東西,在哪里,這就是一個最基本的“see”這個概念。它對應(yīng)計算機視覺里面幾類基本問題:一個是做圖像識別,即解決是什么(what),另一個是物體定位,即在哪里(where)。這里還需要提一下“圖像語意分割”這個概念,它是一個像素級別的物體識別,即每個像素點都要判斷它的類別。它和檢測的區(qū)別是,物體檢測是一個物體級別的,他只需要一個框,去框住物體的位置,而通常分割是比檢測要更難的問題。
再進(jìn)一個層次,除了要知道圖像像素/二維平面內(nèi)每一個像素代表的信息以外,我們可能還需要知道這個物體在這個真實世界當(dāng)中的3D信息。舉個例子,給定一張臥室的照片,以及一些相機參數(shù)和環(huán)境的一些假設(shè),我們需要知道床在這個三維空間的真實的位置,包括它的長寬高。在這個層次中,一個重要的課題就是我們經(jīng)常提到的SLAM,即同時定位和建圖,這個方向在機器人領(lǐng)域有十分重要的作用。
第三個層次則是更高一層的視覺問題,比如說給定圖片或者視頻,我們需要去知曉這個場景正在發(fā)生什么,如果是一個更高級的系統(tǒng),我們甚至希望計算機能夠根據(jù)圖像或者視頻,我們回答一些問題。這就是前兩年非?;鸬囊曈X問答(Visual question answering)方向。
現(xiàn)在我們回歸物體檢測。 物體檢測是視覺感知的第一步,也是計算機視覺的一個重要分支。物體檢測的目標(biāo),就是用框去標(biāo)出物體的位置,并給出物體的類別。物體檢測和圖像分類不一樣,檢測側(cè)重于物體的搜索,而且物體檢測的目標(biāo)必須要有固定的形狀和輪廓。圖像分類可以是任意的目標(biāo),這個目標(biāo)可能是物體,也可能是一些屬性或者場景。
Object Detection Evaluation
如果給定一個物體檢測系統(tǒng),我們要怎么樣去評價它的好壞?物體檢測的輸出,就是一系列的框,加上其屬于某一類別的置信度得分。測評的時候我們需要把他們和標(biāo)注的框(ground truth)進(jìn)行比配。好的檢測框,應(yīng)該和標(biāo)注框有非常大的重疊率,同時又不能對同一個物體重復(fù)檢測。我們把那些和標(biāo)注框重疊率很高的定義為true positive, 把那些重疊率低(甚至沒有重疊)和重復(fù)檢測的框,定義為false positive。
我們還需要定義兩個描述指標(biāo):precision 和recall。Precision是true positive 數(shù)量除以 true positive和false positive的比值,即所有的檢測結(jié)果中,正確的比例。 Recall 則是所有truepositive的個數(shù)和標(biāo)注框個數(shù)的比值,即所有的目標(biāo)中,被系統(tǒng)檢測出來的比例。
接下來,我們可以把檢測的結(jié)果根據(jù)置信度進(jìn)行排序, 設(shè)一個閾值,然后去計算這個情況下的precision和recall。我們設(shè)置不同的閾值,可以得到很多組precision 和recall。 如果我們把所有的precision 和recall 都畫到一張圖上,x軸代表recall, y軸代表precision,那么我們得到的圖,就叫做PR(precision-recall) 曲線。我們可以用這條曲線在x軸上的積分,去描述物體檢測的好壞,這個指標(biāo)叫做Average precision (AP)。 AP值高,就說明系統(tǒng)在比較高recall的情況下,還能保持比較高的的precision. 現(xiàn)在一些成熟的人臉檢測系統(tǒng), AP都是在90%以上。如果我們直接拿標(biāo)注去算AP, 那么肯定就是100%了。
How to Detect an Object
我們再講講如何去做物體檢測?其實很簡單,典型的一個思路就是,我去搜索所有可能的位置。然后再去對這些所有可能的位置進(jìn)行分類,看看它是不是包含這個物體。所以,我們把這個問題分解成兩個步驟,第一步是去找目標(biāo)的位置,第二步就是去做一個置信度分類。
搜索目標(biāo)位置的方法,總體來講可以分成兩類兩種:
第一種是我把所有可能的位置和大小都列舉一遍:我可以通過一個掃描窗口,從圖像左上角開始,從左到右,從上到下,一直掃到到右下角,然后我們改變圖像的大小,保持掃描窗口大小不變,繼續(xù)掃。每一個位置和大小,我們都可以后續(xù)通過處理得到一個置信度得分,這就是最典型的圖像模板匹配的例子。在經(jīng)典的模板匹配的例子中,掃描窗口所用的模板就是一個圖像塊,置信度得分的計算方法是correlation。如果當(dāng)前位置和模板越匹配,那么得分就越大。因此我們能夠通過這種方式得到物體的位置。
遍歷所有可能的位置太耗時,我們能不能比較高效地通過一些啟發(fā)式的方法,快速地得到一些可能會有物體的位置(region proposal)?這樣的方法通常都叫region proposal method。這類方法可以是有監(jiān)督的方法,也可以是無監(jiān)督的方法。 Selective Search就是一個常用的無監(jiān)督的region proposal method。它的原理是根據(jù)像素點的相似度,逐層合并,當(dāng)他們合并之后,就可以得到區(qū)域的邊界,再把這些區(qū)域轉(zhuǎn)化成region proposal 的框。
History of Recognition(Detection)
有了目標(biāo)的候選區(qū)域,我們怎樣得到物體的類別分?jǐn)?shù)呢?這就是一個分類問題。其實圖像識別這個領(lǐng)域,已經(jīng)有大半個世紀(jì)的歷史了。圖像識別,或者說模式識別,最早是在二十世紀(jì)60年代被提出來的。當(dāng)時MIT的計算機教授,組織了一個面向本科生的兩個月的Summer project。這個project 的目的是設(shè)計一個系統(tǒng),能夠智能識別場景里頭的物體,并區(qū)分出類別。顯然當(dāng)時他們低估了這個問題的難度,結(jié)果可想而知。
實際上,從1966年之后到現(xiàn)在,這個問題還并不能算完全解決。但在一定程度上,在深度學(xué)習(xí)出來之后,這個問題得到了很大程度上的解決。其實識別問題本身就不是一個容易的事情。為什么呢?首先,我們看到的這個物體的樣子,只是它在某種背景下某一種光線條件下特定角度的投影的,換一個角度可能就是完全不同的樣子。即使是同一個物體,例如人,它具有多種不同的姿態(tài),所以外觀也會不一樣。例如他可能是躺著的,或者是站著的,形態(tài)都是不一樣的。
假設(shè),我們事先知道了物體的三維形狀,那么物體識別的難度就會小一些。這時候識別問題變成了一個匹配問題。我們可以事先構(gòu)造物體的形狀,然后去搜索可能的視角投影,跟待識別的圖像進(jìn)行匹配。如果找到最合適的匹配,就認(rèn)為是識別成功了。在20世紀(jì)六十年代初到九十年代,大家都是嘗試用這種方法去做。例如我們可以定義一些基本的幾何形狀,然后把物體表示為基本幾何形狀的組合,然后去匹配圖像。
但是這么做并不是很有效,為什么呢?首先很多物體很難用所謂的基本幾何形狀去描述它,特別是一些非剛體,比如動物。其次對于一類物體,它可能會有豐富的類內(nèi)差異性,即使是同一個物體在不同的姿態(tài)下也不一樣,難道我們要為每一種姿態(tài)都預(yù)先創(chuàng)建一個三維模型模板?最后,即使解決了之前的問題,如何才能準(zhǔn)確地從圖像中提取出這些幾何形狀呢?因此這個方法在當(dāng)時雖然理論挺優(yōu)美,但實施起來非常困難。
到了九十年代之后,主流的方法是只從圖像本身考慮,而不去管物體原來的三維形狀。這類方法統(tǒng)一叫做appearance based techniques. 所謂appearance, 從模式識別的角度去描述的話,就是圖像特征(feature),即對圖像的一種抽象描述。有了圖像特征,我們就可以在這個特征空間內(nèi)做匹配,或者分類。一個最經(jīng)典的例子,就是”Eigen Faces”方法,這也是90年代做人臉識別最重要的方法之一。它的主要思想是用PCA(主成分分析)去分解人臉數(shù)據(jù)集,得到特征向量,然后把每一張人臉圖像表達(dá)為特征向量的組合。這些組合系數(shù),就構(gòu)成了對人臉圖像的抽象描述,即特征。最后我們就可以用特征空間內(nèi)樣本的距離,來判斷樣本是否是屬于同一個人臉:同一個人臉在樣本空間內(nèi)距離很小,不同臉之間距離比較大。
然而這個方法還是存在很多問題,首先它需要我們對所有的圖片進(jìn)行對齊,像人臉圖像,就要求每一幅圖中五官基本在固定的位置。但是很多應(yīng)用場景下,目標(biāo)并不是像人臉那么規(guī)整,很難去做統(tǒng)一對齊,而且這種基于全局特征和簡單歐式距離的檢索方法,對復(fù)雜背景,遮擋,和幾何變化等并不適用。
到2000年之后,識別領(lǐng)域有了較大的發(fā)展。首先圖像特征層面,人們設(shè)計了各種各樣的圖像特征,像SIFT,HOG,LBP等等,比起圖像邊緣和角點等簡單的特征更加魯棒。與此同時,機器學(xué)習(xí)方法的發(fā)展也為模式識別提供了各種強大的分類器,例如SVM,boosting等的方法。在此期間,出現(xiàn)了第一個真正具有實際應(yīng)用價值的人臉檢測: Viola and Jones提出的實時人臉檢測。在它之前的一些方法要么效果不怎么好,速度比較快,或者是速度很慢,效果相當(dāng)或者更好。所以作者當(dāng)時在CVPR上拿著攝像頭展示算法的實時demo,驚艷了全場。這個方法能夠做到又快又好的關(guān)鍵,在于使用了簡單的基于積分圖像(integral-image)的圖像特征,和級聯(lián)分類器(cascaded classifier)。前者可以在常數(shù)的時間復(fù)雜度內(nèi)計算任意區(qū)域的特征,使得特征提取變得十分快速;后者可以在一些簡單的背景樣本上做到提前終止(earlyrejection),極大降低了全圖中所有圖像塊分類的計算量。
另外一類方法,通常是人工精心設(shè)計的圖像特征,配上很強的分類器,典型例子就是Dalaland Triggs 在2005年做的行人檢測方面的工作。他們使用了HOG(一種基于圖像梯度直方圖的局部統(tǒng)計特征)作為圖像特征,使用支持向量機(SVM)作為分類器,通過掃描窗口的形式去遍歷圖像所有的位置。
后來人們還在對物體建模方面做了一些工作,旨在用更靈活的模型,而不是單一的模板去定義物體。其實這個思想也不是當(dāng)時提出來的,早在1973年的時候,F(xiàn)ischler& Elschlager 就提出了一種基于部件的模型,名叫Pictorial Structure。它的核心思想有兩點:
1. 物體是由在特定相對位置的不同部件所組成。
2.不同的物體實例中,部件的位置可以允許一定程度上的不同。我們通常又把這個模型叫做彈簧模型,因為部件之間的連接可以看作是用彈簧相連的,雖然大概位置是固定的,但是還是能夠允許一定的形變自由度。
如果我們把Pictorial Structure和上文提到的用作行人檢測的HOG detector結(jié)合起來,是不是會更好?其實這個工作就是深度學(xué)習(xí)還沒火起來之前,在物體檢測領(lǐng)域鼎鼎大名的Deformable Part-based Model(DPM)。這個方法使用了整體模板加上多個部件的模板去描述一個物體,部件之間的位置可以發(fā)生變化。因此它對于復(fù)雜的物體都能夠有比較好的表現(xiàn)。這個方法在PASCAL VOC數(shù)據(jù)集上統(tǒng)治了數(shù)年時間,通過引入更多更復(fù)雜的圖像特征,把檢測平均準(zhǔn)確率從2007年的17%提升到2012年的41%。正是由于這個方法對這一數(shù)據(jù)集的貢獻(xiàn),他的作者之一Ross Girshick被PASCAL VOC數(shù)據(jù)集的組織授予了終生成就獎。
Object Detection via Deep Learning
我們開始第二部分,這一部分主要講的是深度學(xué)習(xí)給物體檢測領(lǐng)域帶來的變化。
首先,關(guān)于深度學(xué)習(xí)的概念,大家只需要記住,深度學(xué)習(xí)其實就是神經(jīng)網(wǎng)絡(luò),是一種特征學(xué)習(xí)的方法。它能在圖像識別,語音識別,自然語言處理等領(lǐng)域有非常好的效果,是因為這些領(lǐng)域內(nèi)很多問題都可以拆解為兩個步驟:特征提取加上模式分類。那么為什么在很多領(lǐng)域,深度學(xué)習(xí)能夠大幅度超過傳統(tǒng)的方法呢?本質(zhì)還是“特征”二字。
我們以圖像分類為例,傳統(tǒng)方法需要人為地根據(jù)場景和目標(biāo)去設(shè)計合適的圖像特征。例如當(dāng)你需要去對物體的外觀進(jìn)行建模,你可能需要基于梯度的特征去描述輪廓。你還需要想辦法對梯度信息進(jìn)行篩選,量化,得到相對穩(wěn)定的表達(dá)。而這些所有的工作,都需要有一定的領(lǐng)域知識去設(shè)計和調(diào)優(yōu)。從PASCAL VOC數(shù)據(jù)集物體檢測方法的發(fā)展來看,更好的特征對最終的效果起到?jīng)Q定性作用。
然而特征學(xué)習(xí)正是深度學(xué)習(xí)所擅長的部分。它把相關(guān)場景和目標(biāo)的特征學(xué)習(xí),轉(zhuǎn)變?yōu)榫W(wǎng)絡(luò)結(jié)構(gòu)的定義和參數(shù)的學(xué)習(xí),從而免去領(lǐng)域?qū)<胰ピO(shè)計特征這一環(huán)節(jié)。我們不需要絞盡腦汁去為你的目標(biāo)去設(shè)計合適的特征,你只需要把原始圖片和標(biāo)注提供給網(wǎng)絡(luò),定義好網(wǎng)絡(luò)結(jié)構(gòu),他就可以從頭到尾自動學(xué)習(xí)出多層次的特征表達(dá)和分類器。深度學(xué)習(xí)還具有非常好的可擴展性。
你可以去設(shè)計很大的模型,利用服務(wù)器GPU在1000類的圖像分類數(shù)據(jù)集上達(dá)到80%多的準(zhǔn)確率,亦或針對一類數(shù)據(jù)例如人臉做檢測,用很小的模型在手機上達(dá)到還不錯的效果。得益于深度學(xué)習(xí)的可擴展性,當(dāng)數(shù)據(jù)規(guī)模足夠大的時候,我們通過增加模型容量和復(fù)雜度,可以比較容易地達(dá)到更好的效果,而很多傳統(tǒng)的方法在大數(shù)據(jù)下的提升比較困難。
深度學(xué)習(xí)這么厲害,它是一個全新的概念么?它跟二三十年前的神經(jīng)網(wǎng)絡(luò)是一回事么?這個問題我們需要辯證地區(qū)看待。首先,現(xiàn)在我們的深度學(xué)習(xí)實際上就是以前傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)的一個發(fā)展,它的一些基本元素并沒有變。例如現(xiàn)在深度神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)方法仍然是反向傳播(back-propagation),它是在1986年被第一次提出來。像現(xiàn)在非常流行的卷積神經(jīng)網(wǎng)絡(luò)(ConvNet),其實1998年的時候就已經(jīng)被應(yīng)用到字符識別系統(tǒng)了。
現(xiàn)在得益于更快的計算能力,更多的數(shù)據(jù),神經(jīng)網(wǎng)絡(luò)以從前無法想象的模型規(guī)模的形態(tài),又重新火了起來。在二三十年前,神經(jīng)網(wǎng)絡(luò)一般就只有兩三層,每一層最多幾十到上百個神經(jīng)元。而現(xiàn)在比較主流的網(wǎng)絡(luò)結(jié)構(gòu),像GoogleNet,ResNet等,參數(shù)量在上百萬個。能夠訓(xùn)練這么大的除了計算和數(shù)據(jù)之外,近些年提出的一些神經(jīng)網(wǎng)絡(luò)的優(yōu)化技巧也起到了決定性的作用。例如ReLU激活函數(shù)的應(yīng)用,使得神經(jīng)網(wǎng)絡(luò)比之前用tanh, sigmoid 等激活函數(shù)的網(wǎng)絡(luò)更容易訓(xùn)練,也更快收斂。另外,像一些更好的神經(jīng)網(wǎng)絡(luò)權(quán)重的初始化方法,以及一些其他的奇淫巧技(trick), 例如drop out等,和新的網(wǎng)絡(luò)結(jié)構(gòu)(ResNet等)也讓神經(jīng)網(wǎng)絡(luò)的實用性和之前相比大大提高。
有關(guān)神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)內(nèi)容,我們就不在這里再細(xì)講了。除了經(jīng)典的denseconnected network, 大家還需要了解Convolution,和Pooling兩個操作,這兩個是現(xiàn)在的主流的神經(jīng)網(wǎng)絡(luò)中最常用也是做基本的單元。我們繼續(xù)回到物體檢測這個問題。大家都知道,如果是用神經(jīng)網(wǎng)絡(luò)做圖像分類的話,我們就直接把圖像送進(jìn)去,就可以直接輸出分類的結(jié)果了。那么物體檢測要怎么做呢?回顧之前提到的物體檢測的流程,物體檢測無非就是搜索加分類。那么,我們能不能: 1. 用神經(jīng)網(wǎng)絡(luò)去替代傳統(tǒng)的分類器?2. 能否把區(qū)域搜索也交給神經(jīng)網(wǎng)絡(luò)去做?3. 甚至直接利用神經(jīng)網(wǎng)絡(luò)通過輸入圖像去輸出物體檢測的結(jié)果?答案是肯定的。
Detection as Region Proposal + Classification
其實這三個問題就代表了現(xiàn)在用神經(jīng)網(wǎng)絡(luò)去做物體檢測的三個基本的思路。假設(shè)我們直接把傳統(tǒng)的基于人工設(shè)計的特種加上分類器的步驟,用卷積神經(jīng)網(wǎng)絡(luò)(CNN)去替代,其實就是大名鼎鼎的R-CNN。這個方法思路很簡單,首先需要產(chǎn)生物體可能的位置的候選區(qū)域,然后把這個區(qū)域送給CNN去做分類和檢測框回歸。候選區(qū)域的產(chǎn)生可以使用任意方法,并不是這個方法所討論的重點。R-CNN這個工作的貢獻(xiàn)是用CNN去取代原來的特征提取和分類器。雖然R-CNN的方法很簡單,而且它也不是2013年深度學(xué)習(xí)火了之后第一個嘗試用CNN去解決物體檢測的方法,但是它在當(dāng)時是性能最好的方法:在PASCAL VOC檢測數(shù)據(jù)集上,比傳統(tǒng)最好的方法要好一大截。
這個方法簡單有效,原因在于:1. 把檢測問題分解為候選區(qū)域搜索和分類兩個子任務(wù),可以分別去優(yōu)化求解,簡化了檢測任務(wù)的學(xué)習(xí)難度。2.后面的分類可以使用在ImageNet等更大數(shù)據(jù)集上預(yù)訓(xùn)練的模型,提供非常豐富的圖像特征和強大的分類器。之前也討論過,圖像特征對物體識別和檢測起非常重要的作用。一般來說,特征越強大,那么分類的效果就越好。所以ImageNet訓(xùn)練的高精確度的分類模型,在R-CNN這個方法中,就是“巨人的肩膀”。
R-CNN雖然很簡單,但是速度太慢的問題嚴(yán)重制約了它的實用性。在論文的實驗中,檢測一張圖像需要40多秒。這個時間還是使用當(dāng)時最好的GPU的速度,如果使用CPU的話,速度還會慢上幾十倍。這個時間開銷主要還是消耗在用CNN作圖像分類上。為了達(dá)到一個好的效果,一張圖像所產(chǎn)生的候選區(qū)域可能有上千個。分類器則需要把這近千個候選區(qū)域都裁剪出來,統(tǒng)一縮放到224*224的大小再分別過一遍CNN。所以在這個方法中,每個區(qū)域的分類器的計算都是獨立的。
而實際上,同一張圖片里頭的檢測候選區(qū)域可能是高度相關(guān)的,特別是當(dāng)候選區(qū)域很多的時候,它們重疊的概率會非常大,所以很多計算應(yīng)該是可以共享的。之前在給定檢測候選區(qū)域之后,我們在原始圖像上裁剪并縮放得到固定大小的輸入圖像送到分類器,我們能否直接在特征圖上這么做呢?這樣的話,特征計算可以被不同的候選區(qū)域共享,從而避免了對相同區(qū)域的特征重復(fù)提取。這個改進(jìn)方法就叫做Fast R-CNN。
我們可以通過簡單的計算去分析改進(jìn)之后的理想的加速比:假設(shè)兩種方法使用的是同一個網(wǎng)絡(luò)結(jié)構(gòu),原始圖像的大小是600*1000,如果我們用R-CNN 的話, 2000個候選區(qū)域累計起來,輸入像素個數(shù)是224*224*2000;如果改用Fast R-CNN,輸入像素個數(shù)只有600*1000,相比之前大約能加速100倍!
現(xiàn)在我們再看看實際運行中, Fast R-CNN的速度。同樣是一張PASCAL VOC數(shù)據(jù)集的圖片,檢測網(wǎng)絡(luò)只需要0.2秒,而之前R-CNN 要達(dá)到類似的準(zhǔn)確率,需要40多秒!而現(xiàn)在候選區(qū)域提取反而成了瓶頸,通常要幾百毫秒到數(shù)秒的時間,而且這一步的計算也是獨立的。后來進(jìn)一步改進(jìn)的FasterR-CNN方法引入了一個叫Region Proposal Network(RPN)的結(jié)構(gòu),解決了這個問題。所謂RPN就是一個CNN,用來預(yù)測哪些地方可能有物體,并回歸出物體的位置。而且RPN和分類網(wǎng)絡(luò)共享了圖像特征,進(jìn)一步避免了重復(fù)計算。所以FasterR-CNN其實就是RPN加上Fast R-CNN,一整套系統(tǒng)可以端到端進(jìn)行訓(xùn)練。FasterR-CNN相比于之前的FastR-CNN,檢測時間由原來的2秒縮短到0.2秒,使得實時的檢測系統(tǒng)成為可能。
One-Shot Detection
剛剛所說的這一系列方法,都是把檢測問題分成了兩步:先產(chǎn)生regionproposal,然后再去分類和回歸。另一類方法則是希望神經(jīng)網(wǎng)絡(luò)能夠一步到位,直接去定位物體。在Faster R-CNN中,RPN是一個弱分類器,它不需要定位和分類十分準(zhǔn)確。如果我們要求RPN得到非常精確的結(jié)果,就可以去掉后續(xù)做分類和定位這一步驟了,整體流程變得更加簡單。其實這類方法相比R-CNN系列的方法,更早的時候就有了。例如2013年的時候有一個叫OverFeat的方法就是這么做的,只不過因為性能不夠好的原因沒有火起來。更早之前,在二十世紀(jì)90年代的時候用CNN去做人臉識別的一些工作,其實也是類似的流程。這類方法雖然流程上簡單,但是模型的學(xué)習(xí)難度相比于兩個階段的方法要更難一些,要取得足夠好的效果,需要在網(wǎng)絡(luò)設(shè)計和學(xué)習(xí)目標(biāo)上下一些功夫。
一步到位的方法現(xiàn)在的一些代表工作有YOLO, SSD?,F(xiàn)在公司里用的DenseBox也是和SSD類似的一個方法,是我在2014年末還在百度實習(xí)的時候做的工作。時間上應(yīng)該比SSD和YOLO都要早。這里我們就主要講一下SSD,它在PASCAL VOC數(shù)據(jù)集上能夠達(dá)到實時的檢測速度,效果也和Faster R-CNN差不多。SSD可以看作是一個強化版的RPN,輸出層的每一個像素都代表了一個檢測框。和RPN一個輸出層不同, SSD會有好幾個輸出層:比較淺的輸出層的分辨率比較高,用來檢測小一些的物體,比較深的層檢測大的物體。最后再把所有層的檢測結(jié)果合在一起作為最終的輸出。
這么做的也是有它的考慮:小物體在過深的層當(dāng)中可能會因為上下文信息過多而丟失掉有效的表達(dá),同時高層的特征的分辨率也比較低,不好處理一塊區(qū)域內(nèi)多個物體的情況。物體檢測想要做得好的話,本質(zhì)上還是需要去解決物體和模板的配準(zhǔn)對齊(registration,alignment),包括位置上的和尺度上的對齊。R-CNN系列把配準(zhǔn)對齊問題交給了regionproposal,而像SSD這種一步到位的檢測器,就只能指望模型本身的感受野去做配準(zhǔn)對齊。因此從方法上討論的話,前者更容易學(xué)習(xí),效果也會更好。
Summary
用CNN去解決檢測問題的思路,基本就是這幾個套路。其實還有一個方向我們并沒有討論,就是用神經(jīng)網(wǎng)絡(luò)去學(xué)習(xí)怎么做檢測的后處理,例如非極大抑制(Non-Maximum Suppression)等。這類工作關(guān)注的人相對比較少,所以相關(guān)的工作也不多。不過在上面介紹的幾個基本框架下,可以研究的細(xì)節(jié)還有很多,例如怎樣去處理好物體的尺度問題,物體的形變問題,怎樣用多任務(wù)學(xué)習(xí)來提高物體檢測的性能,怎樣去最好context和detail之前的平衡等等,我們就不在此做詳細(xì)討論了。
總結(jié)一下,今天主要介紹了物體檢測的領(lǐng)域,包括物體檢測的概念,方法的評估。然后回顧了下圖像識別和檢測領(lǐng)域五十年來的發(fā)展。對于模式識別領(lǐng)域來說,深度學(xué)習(xí)是最好的提取圖像特征的方式,除非硬件受限只能用傳統(tǒng)的方法,不然就可以直接用現(xiàn)在最好的深度學(xué)習(xí)模型去做實驗。這里面我們并沒有討論太多具體實現(xiàn)的細(xì)節(jié),其實在物體檢測領(lǐng)域,對細(xì)節(jié)的處理直接影響到模型最終的結(jié)果。如果你對有興趣的話,還是建議大家在具體的數(shù)據(jù)集上去嘗試,調(diào)參,慢慢地你就會有自己的理解。
其實物體檢測的方法框架,近二十年來并沒有太大的變化。以前的方法為什么在當(dāng)時沒有成功呢?因為當(dāng)時人們并沒有那么多的數(shù)據(jù)和計算資源,所以像深度學(xué)習(xí)這種計算密集型的數(shù)據(jù)驅(qū)動的方法,在當(dāng)時完全沒有用武之地。而且當(dāng)數(shù)據(jù)很小的時候,很多根據(jù)數(shù)據(jù)集的特點專門調(diào)優(yōu)的方法,比起數(shù)據(jù)驅(qū)動的方法更有效。另外,當(dāng)時的機器學(xué)習(xí)的工具并不像現(xiàn)在這么豐富和方便,即使有的話,很多做計算機視覺的人也還沒學(xué)會去用。
歷史總是會交替發(fā)展的,作為一個好的研究人員,你需要去發(fā)現(xiàn)從前的一些好的工作。解決問題的具體辦法不一定相同,但是人們解決問題的大致思路總是相似的。我們需要去弄明白為什么某些方法當(dāng)時并沒有起作用,哪些方法在現(xiàn)在還有應(yīng)用的潛力,需要用現(xiàn)在的方法去重新審視它們。
-End-
雷峰網(wǎng)特約稿件,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。