【计算机视觉】Objectness算法(一)---总体理解,整理及总结
1.源碼下載及轉換為VS2012 WIN32版本。
http://www.cnblogs.com/larch18/p/4560690.html
2.原文:
http://wenku.baidu.com/link?url=ls5vmcYnsUdC-ynKdBzWgxMX9WomZH2sDRvnQ634UlN8p7oJm_ATFWrLlTQ3H_Co3y-7fL8Jt0MbHu800RWJtSABPKRxrtZvkjkXiFzdLLG
3.原文翻譯:
http://www.cnblogs.com/larch18/p/4569543.html
4.程序說明
http://wenku.baidu.com/link?url=M1VJN_EDd2nHHtxz87mSkxHecKJhcGpuqe8duWbpZxSsR6e2rvcDnaCRnkCekyu1QerZ9VzsH6HetKh3Lq4LGsA1OujwFsrd0pCI8cdWMzC
5.總結:
???? 能夠在識別一個對象之前察覺它,非常接近自底向上的視覺顯著性。根據顯著性定義,廣義的將相關領域的研究氛圍三個類別:局部區域預測、顯著性對象檢測,對象狀態建議。
局部區域檢測: 該模型旨在預測人眼移動的顯著點。啟發于神經生物學研究早期的視覺系統,Itti等人提出了第一個用于顯著性檢測的計算模型,此模型利用了多尺度圖像特征的中心-周圍的差異。Ma和Zhang提出了另一種局部對比度分析方法來產生顯著性圖像,并用模糊增長模型對其進行擴展。Harel等人提出了歸一化中心分布特征來突出顯著部分。 盡管局部區域檢測模型已經取得了卓越的發展,但其傾向于在邊緣部分產生高顯著性值,而不是均勻地突出整個對象,因此,這種方法不適合用于對象檢測。
顯著性對象檢測: 該模型旨在檢測當前視野中最引人注意的對象,然后分割提取整個部分。Liu等人通過在CRF框架中引入局部,區域的,全局顯著性測量。Achanta等人提出了頻率調諧方法。Cheng等人提出了基于全局對比度分析和迭代圖分割的顯著性對象檢測。更多的最新研究也試著基于過濾框架產生一些高分辨的顯著性圖,采用一些效果比較好的數據,或者是使用分層結構。這些顯著性對象分割在簡單的情景圖像分析、內容感知編輯中可以達到很好的效果。而且可以作為一個便宜的工具處理大規模的網絡圖像或者是通過自動篩選結果構建魯棒性好的應用程序然而,這些方法很少能夠運用于包含多對象的復雜圖像,但現實生活中,這樣的圖片確實最有意義的。
對象狀態建議: 該方法并不做決定,而是提供一定數量(例如:1000)包含所有類別對象的窗口。通過產生粗糙分割集,作為對象狀態建議已經被證實為一個減少分類器搜索空間的有效方式,而且可以采用強分類器提高準確率。然后,這兩種方法計算量大,平均一張圖片需要2-7分鐘。Alexe等提出了一個線索綜合性的方法來達到更好、更有效的預測效果。Zhang等人采用方向梯度特征提出了一個級聯的排序SVM方法。Uijlings等人提出了一個可選擇性的搜索方法老獲得更好的預測效果。作者提出了一個簡單直觀的方法,相對于其他方法,達到了更好的檢測效果,而且快于其他流行的方法1000多倍。
另外,對于一個有效的滑動窗口對象檢測方法,保證計算量可控是非常重要的。Lampert等人提出了一個優雅的分支定界方法用于檢測。但是,這些方法只能用于加速分類器,而且是用戶已經提供了一個好的邊框。一些其他有效的分類器和近似核方法也已經被提出。這些方法旨在減小估計單個窗口的計算量,自然也能結合對象性建議進而減小損失。
對象狀態通常表示一個圖像窗口包含任意類別對象的概率值。一個通用類別的檢測方法可以很方便的用于改善預處理過程:1)減少了搜索空間;2)通過使用強分類器來提高檢測準確度.然而,設計一個好的通用類別的方法是非常困難的,需要:
暫時還沒有任何方法可以同時滿足以上全部要求。
認知心理學以及神經生物學研究表明,人擁有強大的能力感知對象。通過對認知反應時間和信號在生物途徑中的傳輸速度進行深入的研究和推理,形成了人類注意力理論假定,該假定認為人類視覺系統只詳細處理圖像的某些局部,而對圖像的其余部分幾 乎視而不見,這也意味著,在識別對象之前,人類視覺系統中會有一些簡單的機制來定位可能的對象。
基于以上的考慮,作者提出一個非常簡單而且魯棒性強的特征(BING),通過使用對象狀態得分來協助檢測對象。動機來自于對象普遍是獨立的,而且都具有很好定義的封閉輪廓。觀察到將圖像歸一化到一個相同的尺度(例如:8*8)上,一般對象的封閉輪廓和梯度范數之間具有強聯系。為了能夠有效量化圖像窗口中對象狀態,將其重置大小為8*8,組合該窗口的像素梯度的幅值作為為一個64位的特征,通過級聯的支持向量機框架學習一個通用的對象檢測方法。而且這個二值化賦范特性(BING),它可以很有效的用于一般對象估計。而且只需要一些CPU原子操作(例如加法,按位移動等)。大部分現存的先進方法,一般采用復雜的分類特征,而且需要采用加速方法以至于計算時間是可控的,相對于此,BING特征是簡單樸素的。
作者在PASCAL VOC2007數據集上,廣義的評價了這個算法。實驗結果顯示,方法很有效(在一個簡單的桌面CPU中達到300fps)的產生了一系列數據驅動,類別獨立,高分辨的對象窗口,通過使用1000個窗口(約為整個滑動窗口的0.2%),檢測率達到96.2%。使用5000個建議窗口以及3個不同的顏色空間,可以達到99.5%。我們也核實了方法的通用性。我們訓練了6個已知類別,然后在14個未知類別上進行測試,得到了很好的效果。相對于其他流行的方法,BING特征能夠使我們達到更好的檢測率,而且速率提高了1000多倍。實現了之前我們提到的關于一個好的檢測器的要求。
6.算法流程圖。
基本與算法無關的東西,這里不再贅述,下面開始邊熟悉源碼,邊更新博客。
6.1、生成正樣本
算法首先,對每張圖像上,可能的所有標注框,采樣生成不同尺度(該尺度在一定經驗值范圍內)的樣本位置,并計算新生成的正樣本與原始樣本重疊率,保留重疊率超過50%的,重新歸一化到8*8大小,計算新生成的有效正樣本的梯度特征,并在水平方向翻轉,最終保存新生成樣本8*8的梯度特征與該特征的水平翻轉特征作為xP.
6.2.負樣本,固定100次隨機產生100個備選的負樣本窗口,篩選出與每張圖片中,與所有目標的重疊率都小于50%的負樣本窗,并將該窗口內保存圖像作為負樣本。
3.尺度處理,在篩選有效正樣本時,同時保存了水平,垂直尺度系數,但是實際保存的尺度size是歸一化映射后的值,即(h - min) * num + w - min?+ 1,其中h,w表示篩選出的有效正樣本相對原始目標的垂直,水平尺度系數,實際上,還是保存的尺度系數,只是在數據結構上,采用哈希映射存儲罷了。
6.4.判定有效樣本,程序下一步,會在上面采樣生成的所有有效正樣本,進行直方圖統計,統計出每個尺度下的樣本數。例如有2500多個圖像文件,計算所有正樣本數,統計每個尺度下的正樣本數。根據統計結果,剔除掉正樣本數少于50的尺度。保存剩下的尺度統計結果,接著,對所有正負樣本,統一分配到一個二維矩陣,垂直表示樣本數,水平表示樣本的8*8梯度特征值,直接保存。
以上,屬于該算法的第一個亮點。
???? 算法主要是用來加速傳統的滑動窗口對象檢測,通過訓練通用的對象估計方法來產生候選對象窗口。作者觀察到一般對象都會有定義完好的封閉輪廓,而且通過將相關圖像窗口重置為固定大小,就可以通過梯度幅值進行區分。基于以上的觀察以及復雜度的考慮,為了明確訓練方法,將窗口固定為8*8的,并將梯度幅值轉化為一個簡單的64維的特征來描述這個窗口。這就相當于我們看路上走的人一樣,在很遠的地方即使我們沒看清楚臉,只是看到一個輪廓也能識別出是不是我們認識的人,反而,如果臉貼著臉去看一個人可能會認不出來。
???? 也就是作者發現,在固定窗口的大小下,物體與背景的梯度模式有所不同。如下圖所示。圖(a)中綠框代表背景,紅框代表物體。如果把這些框都resize成固定大小,比如8X8,然后求出8X8這些塊中每個點的梯度(Normed Gradient,簡稱NG特征,叫賦范梯度特征,就是計算梯度范數,即sqrt(gx^2 + gy^),實際就是該點的L2范數梯度,但是作者實現時,采用-1,0,1方式計算gx或者gy,因此,用|gx| + |gy|近似代替梯度的L2范數),可以明顯看到物體與背景的梯度模式的差別,如圖1(c)所示,物體的梯度分布呈現出較為雜亂的模式,而背景的較為單一和清楚。其實這個道理很淺顯,就是圖像中背景區域往往呈現出homogeneous的特性,早期的圖像區域分割方法就是依靠這種特性來做的。然后我個人覺得這里不一定要用梯度,用其他一些統計特征甚至是圖像特征都有可能得到類似的結果。
???? 所以,作者首先將所有的標注樣本,用不同尺度縮放采樣,將采樣出的有效正樣本統一縮放到8*8,計算NG特征,也就是下面圖中a生成c在過程。這樣,通過SVM訓練這些NG特征,得到目標和背景的第一次區分模型。
??? 下面是原文的解釋
????? 對象一般是具有很好定義封閉輪廓和中心的。重置窗口的時候,就相當于將現實中的對象縮小到一個固定大小,因為在封閉的輪廓中,圖像梯度變化很小,所以它是一個很好的可區分特征,就像是圖1中,輪船和人在顏色,形狀,紋理,光照等方面都有很大的不同,他們在梯度空間都存在共性。為了有效地利用觀察結果,我們首先將輸入圖像重置為不同尺度的,在不同的尺度下計算梯度。然后再重置為取8*8大小的框,作為一個對應圖像的64維的NG特征。
我們采用的NG特征,是一個密集的且緊湊的objectness特性,有以下幾點優勢:首先,由于歸一化了支持域,所以無論對象窗口如何改變位置,尺度以及縱橫比,它對應的NG特征基本不會改變。也就是說,NG特征是對于位置,尺度,縱橫比是不敏感的,這一點是對于任意類別對象檢測是很有用的。
圖1?盡管對象(紅色)和背景(綠色),在圖像空間(a)呈現出了很大的不同,通過一個適當的尺度和縱橫比,我們將其分別重置為固定大小(b),他們對應的NG特征(c)表現出很大的共性,基于NG特征,我們學習了一個簡單的64D線性模型(d),用來篩選對象窗口。
這種不敏感的特性是一個好的對象檢測方法應該具備的。第二,NG特征的緊湊性,使得計算和核實更加有效率,而且能夠很好的應用在實時應用程序中。
NG特征的缺點就是識別能力不夠。但一般而言,會采用檢測器來最終缺點結果的誤報率。
以上,上部分結束。
-----------------------------------------------------------------------------------------------------------------------
6.5.SVM第一級訓練
首先,算法傳遞進入第一級SVM的樣本總數,在超過SVM默認參數值時,采用SVM默認訓練總樣本數。用所有正樣本以及剩下的數量采用隨機從原負樣本中抽取。即,負樣本在這種情況下,不是全部參加SVM第一級訓練。而是隨機抽取一部分,保證總樣本數達到SVM默認訓練總樣本數。
算法做一些SVM的初始化,涉及到樣本標簽Y,實際上,正樣本默認都為有標簽,以及SVM參數初始化等,這個后續另開文說明。這里不說介紹。
通過第一級SVM訓練后,算法生成第一級SVM模型,轉換成8*8,并歸一化到1~255,保存。該模型w是用來下文中投票投票打分的,為第二級SVM學習做準備。
6.6 二值化模型參數w
首先通過上面的訓練,我們可以得到分類的模型線性w,第一個要二值化的目標就是它,二值化的思想可以簡單想象成找若干個基向量,并用這些基向量的線性組合來記表示w, 而且這些基向量的每一維只能取1或者-1(二值嘛)。那么假設我們用了Nw個基向量,每個基向量為aj, j = 1,...,Nw,那么就有。具體模型的二值化近似可以按如下算法1的步驟進行:
算法1的步驟也很明確,每一個都生成一個基向量,此基向量每一維都是由當前殘差的符號決定,然后用當前殘差減去殘差在這基向量的投影(相當于去掉模型在這一維上的分量)。但在計算中因為二進制位只能為0或者1,所以為了處理方便,取,那么就可以將基向量表示為。即基向量二進制與該二進制表示的補。
也就是說,αj表示基向量{-1,1},βj表示校準系數,同時,將每個基向量,映射到一個64位類型的數據中。
這里,實際上采用Gram-Schmidt正交化,只取了包含大部分信息的前Nw個正交向量作為輸出,目的也是為了降低計算量。二值化的目的在于后期位運算,后面還會把NG特征也二值化。直接采用硬件指令大幅度地提升速度。
增加點自己的體會:
代碼中,Nw取2,也就是SVM生成的W 是8*8矩陣,矩陣元素任意值,通過這個二值化過程,生成2個基向量,每個基向量完全覆蓋了W中每個元素,但是此時在基向量中,每個元素對應的取值變成0或者1,因此,原w的64個元素,拼接成了一個64位的單個數據,即基向量。同時,對應該基向量的校準系數,算法為了后期加速,只近似處理高4位的數據,因此,校準系數只有保存4個,且都是一樣的值,但是由于后期位移運算,這里就把校準值放置到了對應bit位。于是,2個基向量,生成8個校準系數,2個64位的數據。
6.7 打分窗口
為了找到圖像中的一般對象,對每張訓練圖像(注意,這里是原圖像,不是標注框),進行上文生成正樣本時得到所有尺度的量化,掃描每個尺度定義好的量化窗口(依據尺度或者是縱橫比,也就是說,這里只是對原圖像依據之前胡尺度系數做縮放,不是縮放到8*8,因此,才有下文的I)。每一個窗口通過上文得到模型w獲得得分
sl =<w,gl>???????????????????????????????????????? (1)
l=(i,x,y)???????????????????????????????????????????? (2)
sl代表過濾器得分,gl表示NG特征,l表示坐標,i表示尺度,(x,y)表示窗口位置。其實就是一個濾波器,向量內積實現。也就是說,SVM第一級訓練得到的w作為權值。該w作用于窗口(即NG特征,不是固定8*8大小),打分越高,就約接近目標。
下面引入w與二進制的內積運算公式:
?? 只需要按位與和字節統計操作.下面解釋如何得到b.
因此,為了實現(1)的快速計算,作者先用上面的算法,二值化了w,現在開始二值化NG,即gl參數,得到上面的b.
接下來我們還要對NG特征進行二值化,還記得我們剛才將NG歸一化到[0,255]之間吧,那么8X8窗口上的每個點的NG特征值就可以用一個byte來存儲,也就是每個值我們都可以用一個8位的二進制串來表示。那么我們就有一個8X8X8的三維矩陣,前兩維是窗口位置(行,列),第三維是在二進制串中的位置(頁)。舉個例子,比如窗口中第1行,第2列的NG特征值是192,換成二進制就是1100 0000,那么矩陣的元素(1,2,1) = (1,2,2)= 1,(1,2,3),…,(1,2,8)= 0;那么我們一頁一頁地將矩陣元素取出來,再將每頁8X8的矩陣元素排成一個64位的二進制串并存進一個int64里。既然思路已經有了,做法也就很簡單了:對于每一頁,將每一行每個元素取出來,不斷加入int64中并左移1位,最后得到那個int64每一位對應的元素坐標排列就應該是(1,1)(1,2)(1,3)…(8,8)。然后作者在這里又玩了一個trick,他說你這樣每次移動一位不是要循環64次嘛,如果先將8個拼成一組(就是剛才那樣左移1次),那么只需要移動8組就好了啊!而且,這樣在相鄰的窗口中還能重用重疊的部分(在VS2010 的Debug模式下我試了下,1個數“每次左移1位,移動1萬次”和“每次左移100位,移動100次”兩種情況,的確是后者速度快)。
最后,為了進一步節省存儲空間,還可以只取NG值的高位來作二值化。因為比如192和193、194,它們的二進制表達分別是1100 0000, 1100 0001和 1100 0010,要是我只看前面4位,后面4位忽略(取0)的話,那么它們的取值都是192。也就是我們可以用192來約等于193和194,這樣我們就不需要用到8位那么多了!寫成公式就是下面的式(2)這樣,其中Ng 是我們要用的高位的位數(也就是前面說的三維矩陣的頁),bk,l就是對應三維矩陣中的第k頁(二值)。
最后將二值化模型w和二值化NG,結合起來對窗口打分的操作由卷積運算變成了大部分是位運算操作,
其中C_j,k是
上面的計算很容易通過位運算和SSE指令(支持8x8=64bit)來完成快速運算。
然后,運用非最大抑制(NMS),做下濾波。
這里,寫的比較雜,再次總結一下,
首先,根據第一級SVM得到模型參數w,對每張訓練圖像,進行所有尺度變換(不是固定8*8大小),然后計算NG特征,接著根據上文的打分系統,計算每個尺度下的sl(實際上,二值化w和二值化NG特征,就是BING特征).并重新排序,利用NMS消除掉高分點附近領域內的打分值。且,這里只選擇指定閾值以上的高分點。然后,在原始圖像,找到對應打分點對應的方框大小,并保存。這樣,針對每張圖像,我們計算了不同尺度i下的打分項以及相對應的可能目標匡。然后,針對所有可能的目標匡,我們將其與原始圖像中所有有效正樣本做重疊率比對,只要有一個正樣本框與該可能目標匡重疊與大于0.5,則該可能目標匡作為正樣本,否則為負樣本。在傳入第二級SVM時,作者將可能目標框的打分值,重新根據尺度整合,即不同尺度下下,所有的打分值,作為正負樣本。在第二級訓練時,針對每個尺度,訓練一次。
6.8第二級SVM訓練
作者針對每種尺度下的打分值,訓練SVM,每種尺度下樣本總數不超過10W。超過,則隨機在正負樣本中抽取。確保先讀取正樣本,后需剩余的位置隨即用負樣本填滿。訓練結束后,生成新的權值vi,ti.
以上,訓練程序結束,下面進入測試部分。
--------------------------------------------------------------------------------
測試程序,在讀入測試圖片后,計算圖像的BING特征,跟二級SVM訓練預處理一樣,對圖像進行不同尺度的縮放,計算NG,打分統計得到sl(用的還是第一級模型的w)
然后,為每個尺度提供一些建議窗口。相對于其他窗口(例如:100*100),一些尺度(例如:10*500)的窗口包含對象的可能性是很小的。因此我們定義對象狀態得分(校準過濾器得分):ol = vi*sl+ti?(3)針對不同尺度i的窗口,得到不同的獨立學習系數。使用校準函數(3)是非常快的,通常只需要在最終的建議窗口重排。
這里,打分用的權值是二級模型訓練出的,即上文的vi,ti.得到ol重新排序。整個過程,計算時間,給出每個檢測圖象的平均測試時間。并保存打分結果與對應的目標框。
打分越高,越接近目標。實際上,算法生成的就是打分窗口,也就是所為的對象狀態。下面測試的時候,根據打分窗口與標注的測試窗口重疊率大于0.5就認為檢測到了。
接著,作者開始繪制結果,根據檢測出的候選框與每個測試標注框計算重疊率,大于0.5,就認為檢測到了(1),否則score為0未檢到。之后,計算平均重疊率和平均檢測率.如下圖:
這里解釋下重疊率:
DRandMABO
上面的精度曲線稱為DR-#WIN curves,源自TPAMI 2012的一篇論文:Measuring the objectness of image windows。原文還提出了將窗口數量比如[[0,5000]歸一化到[0,1]之間,用曲線下的面積作為目標檢測的度量結果,并稱之為the area under the curve(AUC),這樣AUC的范圍就在[0,1]之間了。
檢測精度DR的計算
DR的計算是參考The PASCAL Visual Object Classes (VOC) Challenge,目標檢測任務中DR的計算的是true/false positive精度,將算法檢測目標結果放到groud truth中,將“預測目標區域與groud truth區域的交集”除以“預測目標區域與groud truth區域的并集”作為DR:
DR自少在50%以上才算目標檢測正確,其實,50%已經是很低的了,幾乎不能做為檢測結果,難怪那些個算法(BING這篇文章也是)隨隨便便都到95%以上了。
轉載于:https://www.cnblogs.com/huty/p/8517492.html
總結
以上是生活随笔為你收集整理的【计算机视觉】Objectness算法(一)---总体理解,整理及总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 基础 一步步 一幕幕 [注释、
- 下一篇: 查找Linux中内存和CPU使用率最高的