一般物體檢測--Binarized Normed Gradients for Objectness Estimation at 300fps

Highlights: 關於BING這一算法深入的分析和思考,請參考: Cracking bing and beyond (BMVC2014)[pdf]

                      關於一般物體檢測的綜述,請參考:  What makes for effective detection proposals (arxiv2015) [pdf]     


------------  

       前一段時間很多人在網上傳程明明在CVPR14年上即將發表的Objectness文章,Project Page在這裏,和這裏。最近,正好想用一般物體檢測做點事情,上週也在實驗室做了一個這個方面的報告,今天用文字總結一下。 網上已經有一些評論和分享討論作者分享的代碼如何在不同機器和vs版本上進行配置的帖子了,大家可以看這裏這裏

       所謂一般物體(class-independent object, Generic objects),或者Objectness,顧名思義,就是與類別無關的一切物體。對於行人檢測這樣的經典問題,我們的目標是在圖像中判斷哪些位置出現了人------人就是一種物體。在更難的問題中,比如VOC和ImageNet的競賽中,問題變得更難了-----不僅需要參賽者標註出圖片中出現了哪些物體,而且得標出物體出現在哪些位置。順便插一句,還有更難的問題------訓練樣本中只給出圖片,並告訴你圖片中出現了哪些東西(這裏的東西不僅僅是指物體啦,還可以是藍天白雲),但是不告訴你這些東西出現在哪,要求大家在測試圖像中不僅給出測試圖像的label,而且標註出這些東西出現在哪。這個問題在南京大學周志華教授的一系列多示例多標籤學習的問題中得到研究,大家有興趣可以去看看。

      當然言歸正傳,我們現在要討論的問題屬於前兩類,就是要檢測的東西都是物體。以行人檢測爲例,傳統的方法就是sliding windows,但是對於一幅NXN的圖像來說,可能的sub-windows有N^4的數量級之多。這樣對於一個實時的行人檢測系統來說,我們只好選擇弱特徵(爲快速計算,如HOG),以及弱的分類器(也是爲了計算快速,如SVM)。如果我們能夠利用人是“物體”這種先驗知識,快速地從N^4個候選的sub-windows中過濾掉絕大部分,而選擇出10^3數量級的可能是物體的sub-windows,那就太好了,我們就能用一些稍微複雜的特徵和分類器用在這10^3個候選windows上過濾就可以了。對於這種要求實時的系統來說,這第一步,就是找出10^3數量級的sub-windows,一定要快速才行。(當然對於某些只是要離線過程中處理的情況下,這一步要求可以稍微降低一些。哪些場合是離線處理的,以後時機成熟了我會再說。)以往的selective search的方法,速度上也需要1-2秒。而Cheng的這項工作使速度能達到300fps。

        “物體”的最大特點就是有Well-defined closed boundary,而背景則是雜亂無章的。而文章中最主要的發現則是,在梯度空間圖(normed gradient space)上,無論物體是長的還是寬的,只要歸一化到一個相同的尺度上(例如8*8),它們的就變得十分有共性了,這時用SVM分類器就能把物體和非物體區分出來。所以作者採用的特徵就是簡單的像素梯度的幅值(norm of gradient),並且只選擇36種不同的size(比如8*8,16*16,32*64等),而分類器則是採用cascaded SVM。級聯的SVM中第一級SVM對所有的候選窗口進行粗過濾,第二級SVM,則是對每一個size的窗口分別設計(也就是設計了36個不同的SVM),這也比較合理,因爲不同的size會是物體的概率是不一樣的,正方形的窗口就更可能是物體,而8*256這種長條形的窗口就不太可能是。訓練樣本是直接用VOC的training set的ground truth,而負樣本是每個training set image中隨機採100個。如果這36種size中,某個size的正樣本數少於50個,這個size就直接被忽略。爲了獲取不同size的候選框,作者採樣首先對原始圖像進行不同尺度的resize,然後用訓練好的SVM在resize後的每個8*8的模板上進行卷積,達到效果。(以200*200的圖像爲例,如要檢測每個32*32的窗口大小是否會是物體,一般的做法就是先算整個圖的梯度,然後隔點取32*32大小的框,再把框中的子圖歸一化到8*8的大小,最後送到cascaded SVM當中看得分。而作者的做法則是先把圖像resize到50*50,然後計算梯度,然後再逐點取8*8大小的框,送到cascaded SVM當中看得分。這兩步驟效果是差不多的,只是計算梯度的尺度不一樣,但是後者只用做一次resize)。

     本來說到這裏,大家就以爲要做完了,但是作者最重要的部分就是做速度上的優化。這是通過二值表示的優化完成的。SVM的分類器無非是y=w·x,這裏w和x都是64維的向量。作者首先將w用一組基來表示(這組基一共Nw個,Nw應小於64,作者在程序中取了2。這個Nw是很重要的,直接減少計算量。感謝Yi Jun師兄在組會上的提醒),這組基中每個向量的64維都只由0和1來表達。至於x,normed gradient中每個像素的梯度是0-255的值,在計算機中是用一個byte來表示的,作者做了“二值化”,僅由這個byte的頭Ng位來代替(這樣產生Ng個二值化的圖)。我們假設Ng=1,就是最典型的二值化操作。這樣做,y=w·x的大部分計算都是位運算,只有Nw次浮點/整型的乘法和Nw·Ng次浮點/整型加法。還有一個優點就是遍歷圖像中每一個8*8的框的時候,也可以用位操作做滑動,而不用每次都遍歷64個值。我講的比較粗糙,具體點的大家可以看下面兩個截圖:



       這裏面優化的部分應該是最重要的,motivation倒不是很難(鄙人無眼光的看法,諸位莫噴)。model本身也許大家會疑問爲什麼是8*8之類的參數,我更覺得這些參數有些是爲了優化而故意這麼設計的。年初老萬和我說Objectness代替sliding windows會是大趨勢了,當時我還很迷糊,不確定一般物體檢測會有多靠譜,現在等我反應過來的時候,這個方向很快就已經做到又快又準了。哎,我還是一個沒眼光看長遠的人。

       還要提一下,作者的準確的度量是用了VOC的檢測的準則:intersection/union超過50%就算是框對了。其實這個條件還算比較寬鬆的-----對VOC的檢測問題來說,這個指標達到50%確實可以檢測的準確性是八九不離十的了,但是objectness只是用於檢測的第一步,只有50%的intersection/union實在是就有點說不過去了(大家看看效果便知),這多少對後面的recognition有點影響。所以,別看這96.2%的準確性就覺得這個方向沒啥做的了,其實光從準確性的方面來說,就還有蠻大的上升空間的,更別提如何把候選的regions降低到1000以下了(我好像又和上一段話自相矛盾了,哈哈)。


---------------------

jiang1st

轉載請註明出處: http://blog.csdn.net/jwh_bupt/article/details/22961163

http://jiangwh.weebly.com/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章