雷鋒網按:作者山世光博士,中科院計算所研究員、博導,主要從事計算機視覺、模式識別、機器學習等相關研究工作。迄今已發表CCF A類論文50餘篇,全部論文被Google Scholar引用9000餘次。現任IEEE TIP,TIPNeurocomputing和PRL等國際學術刊物的編委(AE)。研究成果曾獲2005年度國家科技進步二等獎和2015年度國家自然科學獎二等獎。
本文中,山世光博士主要給我們分享梳理了物體檢測技術的近期進展。
物體檢測在整個計算機領域裡,比較成功的一個例子,就是在大概2000年前後出現的Viola-Jones人臉檢測器,其使得物體檢測相比而言成了一項較為成熟的技術。
這個方法基本的思路就是滑動窗口式的,用一個固定大小的窗口在輸入圖像進行滑動,窗口框定的區域會被送入到分類器,去判斷是人臉窗口還是非人臉窗口。滑動的窗口其大小是固定的,但是人臉的大小則多種多樣,為了檢測不同大小的人臉,還需要把輸入圖像縮放到不同大小,使得不同大小的人臉能夠在某個尺度上和窗口大小相匹配。這種滑動窗口式的做法有一個很明顯的問題,就是有太多的位置要去檢查,去判斷是人臉還是非人臉。
判斷是不是人臉,這是兩個分類問題。在2000年的時候,採用的是AdaBoost分類器。進行分類時,分類器的輸入用的是Haar特徵,這是一種非常簡單的特徵,在圖上可以看到有很多黑色和白色的小塊,Haar特徵就是把黑色區域所有像素值之和減去白色區域所有像素值之和,以這個差值作為一個特徵,黑色塊和白色塊有不同的大小和相對位置關係,這就形成了很多個不同的Haar特徵。AdaBoost分類器是一種由多個弱分類器組合而成的強分類器,Viola-Jones檢測器是由多個AdaBoost分類器級聯組成,這種級聯結構的一個重要作用就是加速。
2000年人臉檢測技術開始成熟起來之後,就出現了相關的實際應用,例如數位相機中的人臉對焦的功能,照相的時候,相機會自動檢測人臉,然後根據人臉的位置把焦距調整得更好。
Viola-Jones人臉檢測器之後,在2009年出現了另外一個比較重要的方法:deformable part model(DPM),即可變形部件模型。
就人臉檢測而言,人臉可以大致看成是一種剛體,通常情況下不會有非常大的形變,比方說嘴巴變到鼻子的位置上去。但是對於其它物體,例如人體,人可以把胳膊抬起來,可以把腿翹上去,這會使得人體有非常多非常大的非剛性變換,而DPM通過對部件進行建模就能夠更好地處理這種變換。
剛開始的時候大家也試圖去嘗試用類似於Haar特徵+AdaBoost分類器這樣的做法來檢測行人,但是發現效果不是很好,到2009年之後,有了DPM去建模不同的部件,比如說人有頭有胳膊有膝蓋,然後同時基於局部的部件和整體去做分類,這樣效果就好了很多。DPM相對比較複雜,檢測速度比較慢,但是其在人臉檢測還有行人和車的檢測等任務上還是取得了一定的效果。後來出現了一些加速DPM的方法,試圖提高其檢測速度。DPM引入了對部件的建模,本身是一個很好的方法,但是其被深度學習的光芒給蓋過去了,深度學習在檢測精度上帶來了非常大的提升,所以研究DPM的一些人也快速轉到深度學習上去了。
對於基於深度學習的物體檢測方法,這裡把最近兩三年裡面出現的比較有代表性的工作做一個概括性地介紹。一個就是R-CNN系列,另一個是傳統方法和深度學習的方法的結合。這些方法出現之後帶來檢測性能的極大的提升,待會我的博士生會介紹性能提升的具體情況,大家可以看到,檢測精度幾乎是成倍地增長。當然這裡面還是存在一些問題,就是檢測速度,我知道很多工業界的朋友都在想辦法對基於深度學習的檢測方法進行加速。
所謂的R-CNN,是基於這樣一種非常簡單的想法,對於輸入圖像,通過selective search等方法,先確定出例如2000個最有可能包含物體的窗口,對於這2000個窗口,我們希望它能夠對待檢測物體達到非常高的召回率。然後對這2000個中的每一個去用CNN進行特徵提取和分類。對這2000個區域都要去跑一次CNN,那麼它的速度是非常慢的,即使每次只需要0.5秒,2000個窗口的話也是需要1000秒,為了加速2014年的時候何凱明提出了SPP-net,其做法是對整個圖跑一次CNN,而不需要每一個窗口單獨做,但是這樣有一個小困難,就是這2000個候選窗口每一個的大小都不一樣,為了解決這個問題,SPP-net設計了spatial pyramid pooling,使得不同大的小窗口具有相同維度的特徵。這個方法使得檢測時不需要對每一個候選窗口去計算卷積,但是還是不夠快,檢測一張圖像還是需要幾秒的時間。
Fast R-CNN借鑑了SPP-net的做法,在全圖上進行卷積,然後採用ROI-pooling得到定長的特徵向量。例如不管窗口大小是多少,轉換成7x7這麼大。
Fast R-CNN還引入了一個重要的策略,在對窗口進行分類的同時,還會對物體的邊框進行回歸,使得檢測框更加準確。前面我們說候選窗口會有非常高的召回率,但是可能框的位置不是很準,例如一個人體框可能是缺胳膊缺腿,那麼通過回歸就能夠對檢測框進行校準,在初始的位置上求精。Fast R-CNN把分類和回歸放在一起來做,採用了多任務協同學習的方式。
Faster R-CNN相比於Fast R-CNN又帶來了一個比較大的變化,其將產生候選窗口這一步也用深度網絡來做,並且讓這個網絡和Fast R-CNN的分類網絡共享了卷積層,這個產生候選窗口的網絡叫做RPN,是Faster R-CNN的核心。
RPN替代了之前非常慢的Selective Search,而且通常所用的候選窗口的數目也比較少,只需要300個就夠了,這使得後面分類的速度會更快。為了檢測各種各樣的物體,RPN引入了所謂anchor box的設計,具體來說,RPN在最後一個卷積層輸出的特徵圖上,先用3x3的卷積得到每個位置的特徵向量,然後基於這個特徵向量去回歸9個不同大小和長寬比的窗口,如果特徵圖的大小是40x60,那麼總共就會有大約2萬多個窗口,把這些窗口按照信度進行排序,然後取前300個作為候選窗口,送去做最終的分類。通過用RPN替換Selective Search,並採用共享卷積層的方式,同時降低了候選窗口的數量,Faster R-CNN在速度上有了明顯提高,其在GPU上可以達到5fps的速度。
2015年出現了一個名為YOLO的方法,其最終發表在CVPR 2016上。這是一個蠻奇怪的方法,對於給定的輸入圖像,YOLO不管三七二十一最終都劃分出7x7的網格,也就是得到49個窗口,然後在每個窗口中去預測兩個矩形框。這個預測是通過全連接層來完成的,YOLO會預測每個矩形框的4個參數和其包含物體的信度,以及其屬於每個物體類別的概率。YOLO的速度很快,在GPU上可以達到45fps。
在YOLO之後,在2015年Liu Wei提出了名為SSD的方法。前面提到的YOLO有一個明顯的缺點,就是最多只能檢測7x7=49個物體,如果圖像中有超過49個物體,那麼肯定會有檢測不到的,YOLO在每個網格裡面只會檢測一個物體,如果一個網格裡面同時放入兩個物體,那麼其中一個就會被漏檢。
相比之下,SSD採用了類似於RPN中anchor box的機制,YOLO基於整個特徵圖用全局信息一起去回歸所有位置的檢測框,而SSD是用卷積基於局部特徵去回歸各個位置的檢測框,並且SSD還用到了不同層的特徵,之前YOLO只用了最後一個卷積層上的特徵,這樣做的缺點就是難以檢測小尺度的物體,最後一個卷積層上的神經元其感受野會非常大,小尺度的物體在這上面的特徵就非常不明顯。從速度上來看,在一些情況下,SSD甚至會比YOLO更快,在GPU上達到58fps的速度。
在物體檢測領域,過去有這樣一種現象,就是對每一個物體我們都需要去設計和學習單獨的檢測器,例如做人臉檢測和車輛檢測,兩個檢測器特徵會不一樣,分類器也不一樣,對於每一類物體,需要去嘗試不同的特徵和分類器的組合。但是到了現在,不管是R-CNN那一系列方法,還是YOLO和SDD,都沒有在物體類別上有任何限制,可以檢測人臉,也可以同時檢測其他類別的物體,這是一個非常重要的優勢。但是在特定類別物體的檢測上,現在也還是有一些專門的方法,比方說做人臉檢測的Cascade CNN,其用CNN替換了AdaBoost分類器,為了保證速度足夠快,其採用非常簡單的CNN,比方說把卷積核的數量控制得非常少。在cascade的前面級上,需要非常快速地處理滑動窗口,因此用的CNN會非常簡單,到後面級上窗口變少,分類難度變大,會需要稍微複雜一點的CNN。目前Cascade CNN在公開的人臉檢測評測集FDDB上,在產生100個誤檢的的時候,召回率能夠達到85%。
上面介紹了一些代表性的基於深度學習的物體檢測方法,簡單總結一下:
以ImageNet上的物體檢測任務為例,mAP從2013年的0.23提升到了2015年的0.62,這個變化是非常顯著的。
雷鋒網(公眾號:雷鋒網)註:本文由大牛講堂授權發布,如需轉載請聯繫原作者,並註明作者和出處,不得刪減內容。有興趣可以關注公號【地平線機器人技術】,了解最新消息。
雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。