傳統候選區域提取方法


BING

論文《BING: Binarized Normed Gradients for Objectness Estimation at 300fps》
南開大學媒體計算實驗室,CVPR2014 http://mmcheng.net/bing/comment-page-9/
論文翻譯:http://www.cnblogs.com/larch18/p/4569543.html

與edge boxes有異曲同工之妙,也是考慮了我們人類觀察事物的習慣:先粗看,再細看。BING就是提供一種”粗略檢測“的方法,先將目標大概的位置提取出來,主要目的是為了提速,與edge boxes不同的地方在於,BING是基於學習的,可以通過訓練使得檢測器更專注.

具體的操作:

  1. (a)輸入一張圖象,其中紅框是物體,綠框不是物體

  2. (b)首先將輸入圖像重置為不同尺度的,在不同的尺度下計算梯度。然后再隔點取8*8大小的框,作為一個對應圖像的64維的NG特征(該特征優勢:[1].歸一化了支持域,所以無論對象窗口如何改變位置,尺度以及縱橫比,它對應的NG特征基本不會改變。也就是說,NG特征是對於位置,尺度,縱橫比是不敏感的;[2]. NG特征的緊湊性,使得計算和核實更加有效率,而且能夠很好的應用在實時應用程序中)

  3. (cd)使用線性SVM分類器,在NG特征上訓練一個64維的分類器

而在訓練的過程當中,最最核心的就是 這個64位的特征就直接用一個64位的數表示,那對特征的操作表示為對位的操作。大大的降低了時間復雜度。

算法流程

根據BING代碼,給出訓練階段算法流程圖,如下所示:

下載代碼: https://github.com/MingMingCheng/CmCode
該代碼中除了bing還有顯著性分割之類的,bing的代碼僅為LibLinear和Objectness兩部分.

對系統的要求:在圖片較多的情況下(默認使用的VOC2007數據集),需要約4G內存.因此為了訓練模型,程序不能夠編譯為32位(通常只能使用2G內存左右,即使在VS中開啟大地址訪問也不行).程序中對窗口的打分操作計算很容易通過位運算和SSE指令(支持8x8=64bit)來完成快速運算.因此如果要編譯為32位程序,可以加入SSE2的編譯選項來加快速度,通過對比可以發現不使用SSE,CPU占用率10%左右,而開啟后到達90%以上.若編譯為64位程序,則無需手動開啟該選項,因為幾乎所有的64位處理器都有SSE2,而編譯器默認對64位程序開啟該選項,因此我們在開啟該選項后編譯時會提示:忽略未知選項“/arch:SSE2”.
From Wikipedia:

SSE instructions: The original AMD64 architecture adopted Intel's SSE and SSE2 as core instructions. SSE3 instructions were added in April 2005. SSE2 replaces the x87 instruction set's IEEE 80-bit precision with the choice of either IEEE 32-bit or 64-bit floating-point mathematics. This provides floating-point operations compatible with many other modern CPUs. The SSE and SSE2 instructions have also been extended to operate on the eight new XMM registers. SSE and SSE2 are available in 32-bit mode in modern x86 processors; however, if they're used in 32-bit programs, those programs will only work on systems with processors that have the feature. This is not an issue in 64-bit programs, as all AMD64 processors have SSE and SSE2, so using SSE and SSE2 instructions instead of x87 instructions does not reduce the set of machines on which x64 programs can be run. SSE and SSE2 are generally faster than, and duplicate most of the features of the traditional x87 instructions, MMX, and 3DNow!.

在LibLinear工程中編譯生成LibLinear.lib文件

LibLinear是個SVM庫,Bing中使用SVM進行訓練,生成LibLinear.lib后作為Objectness工程的附加依賴庫.

加速

開啟OpenMP多處理器支持:C/C++ ->語言->OpenMP支持->是 (/openmp)
在配置的“C/C++->語言”選項中,另外可能需要SSE指令,在“C/C++->代碼生成”中啟用增強指令集->流式處理 SIMD 擴展 2 (/arch:SSE2)

32位編譯:用_popcnt函數實現_popcnt64函數功能

需要自己動手在INT64類型基礎上寫函數。

inline INT64 __popcnt64(INT64x)
{
       return __popcnt((unsignedint)(x )) +__popcnt((unsignedint)(x>> 32));
}

時間統計

在 objectness.cpp 中取消對 #define PRE_LOAD_IMAGE 的注釋可以預先加載所有的圖片到內存.這樣不會將讀磁盤的時間計算在內.另外將程序編譯為release模式可以加快速度.

訓練數據准備

下載 VOC 2007 數據集 ( training 和 testing) ,解壓並合並后放到 ./VOC2007/
程序使用的是 OpenCV 可讀取的標記數據,因此需要把原始VOC的Annotations目錄下的文件做格式轉換. 轉換好的 VOC 2007 annotation 可以從這里下載: http://mmcheng.net/mftp/Data/VOC2007_AnnotationsOpenCV_Readable.7z
程序運行時讀取VOC2007\ImageSets\Main目錄下的trainval.txt作為訓練集,test.txt作為測試集,class.txt中記錄類別名稱,如果沒有這幾個文件,那么自己創建.

訓練需要用voc提供的,當然也可以自己提供圖片、寫yml文件,但是效率低,很慢,不太建議,但可以嘗試,本人嘗試過,沒發現有太大改善。測試可以自己提供圖片,把你的圖片放到JPEGImage下,名字換了,換成那一類 ,比如把000001.jpg替換為自己的,名字不變。
getObjBndBoxesForTestsFast是調用的主函數,訓練生成的文件,在results目錄下,訓練完了,不用每次都再訓練,注釋掉trainObjectness
evaluatePerImgRecall 生成的文件直接可用MATLAB打開,可以看到隨着候選框的增加,recall的上升趨勢.

運行結果

運行結果保存在VOC2007/Results/下.
取消對程序最后一行objNess.illuTestReults(boxesTests);的注釋,在VOC2007/Local/下能看到圖片預測目標窗口的結果:

精度曲線

程序運行結束后,VOC2007/Results/下生成有個PerImgAllXXX.m的文件,直接在Matlab中就能跑出結果

上面的精度曲線稱為DR-#WIN curves,源自TPAMI 2012的一篇論文:Measuring the objectness of image windows。原文還提出了將窗口數量比如[[0,5000]歸一化到[0,1]之間,用曲線下的面積作為目標檢測的度量結果,並稱之為the area under the curve(AUC),這樣AUC的范圍就在[0,1]之間了。

二值化梯度幅值(BING)

提出了一個NG特征的加速版,二值化梯度幅值,加速特征提取和測試過程.
代碼中存在一個宏定義USE_BINARY,默認沒有開啟.

EdgeBoxes

原版是matlab代碼

他人修改的有C++版:

https://github.com/AlexMa011/edgeBoxes-Cpp-version

https://github.com/zimpha/EdgeBoxes

還有python版

《Edge Boxes: Locating Object Proposals from Edges》ECCV2014,並沒有涉及到“機器學習”,其采用的是純圖像的方法.研究方法:利用邊緣信息(Edge),確定框框內的輪廓個數和與框框邊緣重疊的輪廓個數,並基於此對框框進行評分,進一步根據得分的高低順序確定proposal信息(由大小,長寬比,位置構成)。而后續工作就是在proposal內部運行相關檢測算法。其中基於文獻《Structured Forests for Fast Edge Detection》所提出的結構化邊緣檢測算法,得到的邊緣圖像,這時的邊緣圖像顯得很緊密,需要用NMS進一步處理得到一個相對稀疏的邊緣圖像。

流程圖,如下所示:

對比

三種對比recall:selective>edgeBox>Bing,速度相反。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM