日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 目标检测 >内容正文

目标检测

目标检测原理与实现

發布時間:2025/3/20 目标检测 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 目标检测原理与实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?目標檢測(Object Detection)原理與實現(一)

基于閾值圖像處理的目標檢測 ? ?

? ? ?從今天起開始要寫一些關于目標檢測的文章,涵蓋從簡單的閾值圖像處理檢測、霍夫變換(hough transform)檢測、模版匹配檢測(剛體匹配)、AAM+ASM+ACM(非剛體)匹配檢測到近代機器學習方法檢測,盡量貼一些代碼,這些很實用。本篇就從閾值圖像處理檢測開始。閾值顧名思義就是一個分界值,做圖像處理的都明白閾值的用途,但是考慮到各種觀眾,干脆把OpenCV中的各種閾值標識符和對應代碼示意都貼出來,如(圖一)所示:


(圖一)

? ? ? 仔細閱讀下(圖一)中的各種偽代碼,就很容易明白閾值函數的工作機制,其中src(x,y)是圖像像素點值。下面就給出一個處理答題卡的例子,(圖二)是從網上找到的一個答題卡樣圖,我們的目標是檢測到哪些選項被涂黑了,然后根據坐標判定是哪個數字,其實根據坐標是有依據的,因為答題卡四個角有一些對準線,對齊后用掃描儀掃描后緊跟著經過算法處理就可以判斷出考生選項,本篇文章就簡化流程,考慮到涂的選項是黑色的,因此我們使用第二個閾值方法,經過處理后如(圖三)所示。

?? ?

(圖二) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (圖三)


幾乎perfect,嘿嘿,下面把代碼也貼出來,python版本的。

?

[python]?view plaincopy
  • import?numpy as np ?

  • import?cv2 ?

  • img=cv2.imread('anwser_sheet.jpg') ?

  • grey=cv2.cvtColor(img,cv2.cv.CV_BGR2GRAY) ?

  • retval,grey=cv2.threshold(grey,90,255,cv2.cv.CV_THRESH_BINARY_INV) ?

  • ?

  • grey=cv2.erode(grey,None) ?

  • grey=cv2.dilate(grey,None) ?

  • ?

  • contours,hierarchy=cv2.findContours(grey.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) ?

  • newimg=np.zeros_like(grey) ?

  • cv2.drawContours(newimg, contours, -1,?255) ?

  • cv2.imshow('test',newimg) ?

  • cv2.imwrite("processed.jpg",newimg) ?

  • cv2.waitKey() ?

  • 代碼流程先是讀取圖像文件,接著轉成灰度圖,接著做個開運算(腐蝕后再膨脹),接著閾值處理,最后把目標輪廓畫出,根據目標塊的坐標可以大概的推算出對應的數字,接著秀一下打印出某個涂項,比如最后一個,那么只需要把



    cv2.drawContours(newimg, contours, -1, 255) 改成 cv2.drawContours(newimg, contours, 0, 255)

    第三個參數為負數表示打印所有輪廓,0表示打印最后一個選項,打印是倒著數的。如(圖四)所示:



    (圖四)

    ? ? ?基于閾值圖像處理的目標檢測一般只適應于自己能控制顏色和亮度的項目中,這也為什么規定答題卡要盡量使用黑色的(同一顏色方便閾值處理),另外這種方法也可以用在目標的三維重建上,如(圖五)所示,用閾值的方法找到汽車上的標定點對后續點云的獲取很有幫助,進而完成整個汽車模型的三位重建,此方法雖然簡單,但對這幾種場景很實用,通過簡單的圖像處理(各個階段去噪)后,然后簡單的查找下各種閉合小輪廓就OK了,好了,今天就說到這,比較簡單,后續會越來越復雜些,用到的數學知識也越來越多。


    (圖五)

    轉載請注明出處:http://blog.csdn.net/cuoqu/article/details/9058735

    目標檢測(Object Detection)原理與實現(二)

    基于霍夫變換和廣義霍夫變換的目標檢測

    ? ? ? ?上節討論了基于閾值處理的目標檢測,今天就來討論下基于霍夫投票的目標檢測,霍夫投票打算分成兩個小節,第一個小節簡單的說下霍夫變換和廣義霍夫變換(generalized hough transform),他們投票的權重都是相等的,下一節討論概率空間中的霍夫投票,顧名思義他們的投票權重是不確定的。

    ? ? ?先來看下霍夫變換(hough transform),霍夫變換一般適用于有解析表達式的幾何形狀目標檢測,例如直線、圓、橢圓等。用個統一的解析表達式來表達他們:f(x,alpha)=0,其中x 是圖形上點,alpha則是解析表達式參數,比如歐式坐標系中直線的參數就是斜率m和截距c(或者極坐標系中的theta和ρ),圓的參數則是原點和半徑?;舴蜃儞Q的核心就是把圖像空間的直線變換到參數空間(也叫霍夫空間),比如一個直線y=mx+c,給定一個點(x’,y’),把它代入直線方程,得到y’=mx’+c,其實此時仍然是一條直線(在參數空間的直線,斜率是-x’,截距是y’),圖像空間和霍夫空間的對應關系如(圖一)所示:


    (圖一)

    ? ? (圖一)中左圖是圖像空間,右圖是霍夫空間(參數空間),對于圖像空間中線段pq上任意一點帶入直線方程后,都可以在霍夫空間中得到另外一條直線,二者是對偶的,比如如(圖一)所示,把兩個端點帶入后,在右圖中得到的兩個對偶直線,而且斜率是負的?,F在問題來了,機器是怎么知道pq是一條直線(假設還有其他噪聲點存在的話)?我們不知道斜率也不知道截距,我們要做的就先假設圖像中有一條直線,其方程為y=mx+c,我們要求他的參數,然后把圖像空間中的每個點都代入直線方程,然后在霍夫空間里都產生了一條對偶直線,因為圖像空間中的那條直線上的點共用一個斜率m和截距c,因此他們的對偶直線必然相交于一點,也就是說m,c的值是唯一的,在右圖中也能體現出來。

    直線的霍夫變換檢測核心思想就是這些,但是考慮到斜率截距式直線表示法不能表示所有直線,比如直線X=CONSTANT時,斜率無線大,霍夫空間里無法表示此點,因此我們把直線方程轉換成極坐標表示的形式:,思想還是一樣,區別就是把參數m,c轉換成了theta和ρ),另外圖像空間中的點對應的霍夫空間的幾何形狀不是直線,而是曲線,如(圖二)所示:



    (圖二)

    ? ? (圖二)中右圖的亮點就是我們要求的參數,但是怎么求的,求交點?那也太麻煩了,霍夫投票方法此時就要登場了,你霍夫空間中的曲線也是個圖像嘛,我有的是內存,對于個曲線上的每個點我都用一個字典來表示你們,字典索引就用霍夫空間的坐標(theta和ρ)來檢索,字典的值表示該坐標上有多少個曲線點(字典的學名叫累加器:accumulator)。對于(圖二)中的那個亮點對應的字典值肯定很大,其實我們就是找大的最大值,峰值表示圖像空間中的很多點共用一個參數。該算法的實現步驟如下偽代碼所示:

    For each edge pixel (x,y) ?in image

    ? For θ= -90 to 90

    ? ? ? ρ= x cosθ+ y sin θ

    ? ? ? ++ H(iθ, jρ);

    ? ?end

    end

    直觀來說就是你給我一個圖像空間中的點,我就在霍夫空間中計算很多字典,然后相同位置上加1,簡單的說就是把霍夫空間分割了,分割的越精細越好,但是分的越細計算量也越大,畢竟圖像點很多,這個平衡讀者根據情況自己把握吧。累加器的示意圖如(圖三)所示:


    (圖三)

    圓和橢圓也都是類似步驟,只不過圓有三個參數,而橢圓有5個參數,計算量更大。此算法實現在opencv里也有,直接調用一個函數即可,在此不多說,直接給一個OpenCV自帶的圖像進行檢測直線的結果和他的霍夫空間示意圖,如(圖四)和(圖五)所示:

    (圖四)


    (圖五)


    ? ? (圖五)霍夫空間中的峰值點可能不嚴格的在同一個坐標上,也就說圖像空間中直線上的點并不嚴格的在同一直線上,我們要容許一部分誤差的存在,判斷峰值點是個技巧活。

    下面進入廣義霍夫變換(Generalized Hough Transform)。

    ? ? ? 前面也說了,霍夫變換只適用于具有解析表達式的形狀,對于一般形狀則無能為力,一般形狀沒有解析表達式,沒有解析表達式,那我們怎么進入霍夫空間里呢?沒有霍夫空間,那我們怎么投票?不投票怎么來檢測物體?有條件就上,沒條件創造條件也要上。一般物體雖然沒有解析表達式,但是他們有邊緣,說的多一些,MARR教授一開始就說邊緣是人眼檢測判斷物體的重要條件之一,所以計算機視覺早期出現了很多邊緣檢測算法。有了邊緣就可以創造出切向量,切向量可以做參數嗎?仔細考慮一下,信息太少,ballard在1980年提出了廣義霍夫變換(generalized hough transform),它利用了如(圖六)所示的參數:

    (圖六)


    ? ? ?(圖六)中的alpha表示參數,可以看出參數很多,參數空間肯定是高維的,不過不管他多少維,方法和上面類似,參數空間中投票嘛,考慮到這個方法選擇了一個參考點,把圖像中的點到參考點的距離和相對方位信息作為參數來檢測物體,細心的同學可能感覺出來了,他和Hu moment(Hu矩)有些相似的地方,他們都需要一些模版來提取形狀參數,但是它比Hu moment用到的信息多,而且是在霍夫空間中投票,可以抵抗一些噪聲、遮擋因素的影響,因此他的魯棒性更好。投票流程如(圖七)所示,其中A[a]為投票字典(累加器):

    (圖七)

    它的檢測效果如(圖八)所示:


    (圖八)

    ? ? 這節算是做個鋪墊吧,為下節的霍夫投票在計算機視覺中的應用打下基礎,因為今天的投票是“公平”的,每票的權重都一樣,當遇到復雜問題時,比如部件的參數去投票時,權重需要區分對待,這些放在下個小節來說。廣義霍夫變換的代碼網上也有,如搜不到的同學想要的話,可以留言索取。


    參考文獻:

    GENERALIZING THE HOUGH TRANSFORM TO DETECTARBITRARY SHAPES


    目標檢測(Object Detection)原理與實現(三)


    基于霍夫森林的目標檢測



    ? ? ? 上節說了霍夫變換(HT)和廣義霍夫變換(GHT),今天就接著廣義霍夫變換說下去,在廣義霍夫變換中,每個投票元素(比如邊緣像素中的點)在霍夫空間中累加投票的權重是相等的,每個元素投票的權重互不影響,這其實是假設了圖像空間中的每個像素點是獨立的,但現實是這樣的嗎?答案:不是,尤其是牽扯到我們今天的基于部件的投票時,這種投票元素互相獨立的觀點更站不腳,學過概率圖模型(probabilistic graphic model)的都知道,圖模型里有一種V結構,如(圖一)所示:



    (圖一)

    ? ? ? ? X1,X2是投票元素,Y是我們在霍夫空間中的投票,假設我們觀察Y時,或者說給定Y時,就是觀察圖像空間中的目標,假設X1和X2是目標生成的,X1和X2是獨立的嗎?很明顯不是,這些元素應該向Y投票的權重應該更大才說的通,而其他元素投更小的權重(圖一也可以看出,當給定Y=1時,X1,X2的概率由0.25提高0.33)。這就是Judea peal提出的explain away問題(Even if two hidden causes are independent in the prior, they can become dependent when we observe an effect that they can both influence)。既然有現成的框架:概率圖模型,或者嚴格的說概率模型,那我們就改進廣義霍夫投票,進入概率空間。

    ? ? ? 先來說說霍夫森林吧,霍夫森林是Juergen Gall在2009發表在CVPR上的。它通過構建一個隨機森林把圖像塊(patch appearance)直接映射成對目標重心位置的投票,找到了目標重心也就找到了目標,其他做法也有構建codebook來作為投票元素。無論用什么方法,我們都可以把他們看成像霍夫變換中圖像空間里的像素點一樣的投票元素,然后進入霍夫空間找峰值點來檢測目標。別忘了今天的主題是進入概率空間進行投票,下面來看看作者是怎么進入概率空間的。作者構建一個隨機森林模型,叉開一下,隨機森林由N個決策樹構成,這N個決策時互相獨立,分別來對目標分類,最終由N個分類的數目類別多少來決定目標類別。每個決策樹的訓練樣本是

    ,其中I是目標的一個局部圖像塊(patch),c是它的類標簽(1表示是目標,0表示背景),d表示bouding box內圖像塊到目標中心的偏移(offset)矢量(2D),這個對后面的目標重心投票起著很大的作用;隨機樹生長的目的是使節點樣本的類別和offset不純度最小化,這兩項的具體定義如(圖二)中的公式(2)、(3)所示:



    (圖二)

    ? ? 節點上的分裂準則采用了像素值比較的方法,通過交替的最小化(公式一)來完成決策樹的構建。


    (公式一)

    ? ? ?最后葉子節點記錄兩項重要的信息:CL表示正樣本比例,DL樣本偏移的集合,這兩項(正樣本比例和offset矢量)就是投票元素。另外,訓練的時候作者也采用類似級聯的方式,forest=5trees+5trees+5trees,即第一次5棵樹生長完成后,一些分類比較困難的樣本再用來訓練下一批樹。檢測階段,從圖像上提取patch,然后在隨機森林中的每個決策樹上進行判處理,接著在霍夫空間中進行投票,對圖像進行密集塊采樣,最后輸出霍夫圖像。不過話說回來,概率空間體現在何處?關鍵點就在于如何投票,假設E(X)表示目標重心在位置X的隨機事件的話,表示給定圖像塊時目標重心在位置X的概率,利用貝葉斯公式和一些等價替換,該概率可以分解如(公式二)所示:



    (公式二)

    ? ? ? (公式二)的最后一行有兩項,第一項可以結合決策樹葉子節點的DL用pazen窗來估計,而第二項則直接用葉子節點的CL來計算。這樣(公式二)又可轉換為(公式三):


    (公式三)

    ? ? 不過(公式三)只是一個決策樹的概率,考慮用到是隨機森林,對所有決策樹來個平均,計算下平均概率,如(公式四)所示:


    (公式四)

    ? ? ?這樣就完成了一個patch在概率空間對其附近目標重心的投票,累加所有patch的投票如(公式五)所示:


    (公式五)

    ? ? ? ?檢測結果如(圖三)所示,不過要說的是,檢測到重心并不能說明會嚴格的框住目標,對于不同尺度的目標,需要區分對待,換句話要增加一個參數scale,如果還想考慮bounding box的aspect ratio,那就在增加一個參數,不過計算量也會隨著參數增加而指數增長。


    (圖三)

    ? ? ? 最后提下patch的構成,作者在實驗中使用的patch成分為:3 channels were used (intensity, absolute valueof x- and y-derivatives),實驗結果不錯,但缺點也如上所述,實現代碼Juergen Gall首頁已掛出,還有一些細節實現請查閱參考文獻。霍夫森林雖然進入了概率空間進行投票,但是畢竟是從隨機森林中計算出來的,霍夫投票概率的好壞取決于隨機森林獲取的概率,而且投票元素和目標之間沒有形成雙向因果推理,這是他的瑕疵,結合著概率圖模型,我們可以把概率空間中的霍夫投票理論整的更優美些,并且降低與隨機森林之間的耦合度,使之可以擴展到任意概率獲取方式,所以基于霍夫投票的目標檢測打算再繼續擴展一節。


    參考文獻:

    Class-Specific Hough Forests for ObjectDetection. Juergen Gall



    目標檢測(Object Detection)原理與實現(四)

    基于ASM的目標檢測


    ? ? ? ASM(Active Shape Model:主動形狀模型)是Tim Cootes于1995年提出來的,其實是在1992年提交,1994年被接受,1995被發表的。ASM方法是通過尋找一系列匹配點來檢測形狀的方法,和單純的基于shift(或者surf)特征點匹配的方法不一樣,后者是通過互相獨立的shift(或者surf)特征點匹配來做目標檢測,當模版圖像和待匹配圖像之間的大多數shift(或者surf)匹配上了,就宣稱目標找到,優點是仿射不變(旋轉,縮放,簡單的仿射變換),缺點是發生目標發生形變的時候,此種方法會失效。而ASM可適用于有形變的目標檢測,這種方法和上節的霍夫投票的方法都是基于統計學習的框架來做的,ASM通過前期訓練 (build階段)來獲得一個目標的部件輪廓點分布模型,檢測階段(fit)通過匹配各個部件輪廓點來完成目標檢測,咋一聽,也是基于特征點匹配的,但是這些特征點之間不是獨立的,所有特征點都在小范圍內尋找配對點,當所有配對之間的距離之和最小時就宣稱完成了目標檢測,也就是說每個特征點配對都最滿意咯。同樣搜索也會陷入局部最小,只有模型初始位置選的好,然后模型上的每個點小范圍內搜索下就完成了匹配,因此初始的位置預估的好壞也影響著ASM的性能,這是他的缺點,一般要借助于其他方法來進行初始位置的預估,比如人臉匹配就要接助于cascade等方法來檢測到人臉的位置,然后進行ASM匹配。TimCootes后來還提出了AAM(ActiveAppearance model:主動外觀模型)算法,顧名思義偏重于紋理而不是形狀,二者的主要區別如下:

    ? ? ?1、ASM僅使用一小塊圖像區域的紋理來尋找特征點,而AAM則使用整個特征點區域的圖像。

    ? ? ?2、ASM搜索特征點的準則是沿著圖像邊界的法線來尋找,而AAM僅在當前位置采樣。

    ? ? ?3、ASM是為了尋找所有特征點匹配距離最小,AAM則是使得合成模型圖像和目標圖像匹配代價最小。

    下面就來看看ASM的工作原理吧:

    一、模型的建立(build)

    第一步:選擇合適的特征點

    選擇好的特征點對匹配起著決定性作用。好的特征點大概應該或多或少滿足如下幾點:邊緣點、曲率大的、T型連接點和以上這些點的連線上的等分點,如(圖一)所示:

    (圖一)

    這些特征點是有序的,通過一系列特征點來描述物體,把這些特征點的坐標串起來形成一個2n維的向量:

    ,注意坐標不是成對排列的,如上述表達式所示,先是排列X,后排列Y。而這只是一個圖像實例形狀的描述,假設我們的訓練集有S個圖像,那么這S個2n維的向量則構成了2n維的向量分布,同樣也可以構成一個2n維的向量空間,說到向量空間就有點類似于稀疏編碼的基咯,這個話題就此打住,感興趣的可以翻看前面關于稀疏編碼的博文。這個向量分布可以描述大多數的圖像模型,同樣也可以生成一個類似于原始訓練集的圖像目標實例。如果這個實例很像訓練集中的圖像形狀樣子,那么這個分布是可靠的。那怎么來得到這個分布呢?

    ? ?考慮到S個手工標注2n維的向量冗余信息很大,可以對其采用PCA方法進行降維。相當于在這個2n維的向量空間里找到幾個空間軸來描述分布?;诖俗髡咧苯蛹僭O了下面的一個模型,如(公式一)所示:



    (公式一)

    其中P是包含了前t個主成分的協方差矩陣,也就是t個協方差的特征向量,b是一個t維的向量,用來控制特征點形狀的變化,可以用(公式二)在訓練集中求取,這步還有個問題,就是PCA中主成分個數t的選取,有兩種方法:1)選擇前s個;2)選擇前k%的分量,這里作者推薦使用第二種方法。


    (公式二)

    當b為0時,X-bar(x上面一橫的那個符號)即坐標原點(平均形狀),其實是很好理解哈。但這里b不要太大,如果太大,會導致整個形狀變化超出人臉的變化范圍,會使人變得異常猙獰,大家懂的。。。所以作者這里做了約束,如(圖二)和(公式三)所示:



    (圖二)


    (公式三)

    ?

    二、檢測階段(fix)

    ? ? ? ? 這個階段就像剛開始說的,先用其他第三方方法檢測到目標的大概位置,然后把模型初始位置選在那,接著完成兩個階段的任務:一,模型輪廓大概匹配,二,特征點匹配 。模型輪廓大概匹配階段就是在模型初始位置定位好后,對模型進行一些旋轉,平移,縮放的調節,使得模型的朝向和大小和圖像中的目標大概差不多,如(公式四)所示:


    (公式四)

    ? ? ? ?其中X表示對應待檢測圖像中調整后的模型的點,(Xt,Yt)、s、theta分別表示平移,縮放,旋轉變換,這些變換在圖像處理中經常用到的,具體如(公式五)所示:

    (公式五)


    ? ? ? ?對于公式五中的參數大家可能比較關系怎么求取這些參數,在圖像中可以通過幾對對應點來求解,這里給給出一些近似方法,這些參數的求取可按(圖三)所述步驟來完成:



    (圖三)

    模型輪廓大概匹配之后就進行特征點匹配,具體來說就是沿著輪廓邊緣法線的方向進行搜索、匹配,匹配的方法可以使用圖像塊的SSD方法,SSD就是圖像塊之間的像素點差的平方和。也可以使用類似sift的方法來匹配,但是sift被申請了專利,沒法免費使用,本節的例子使用了類似sift的方法:Histogram Array Transform。

    當所有匹配點之間的歐式距離和最短時,就完成了目標檢測(匹配)。如(公式六)所示:


    (公式六)

    其中Y表示待檢測圖像中每個模型點附近的圖像點,找到Y,再利用Y反求b,并且更新b,直到收斂。目標點搜尋匹配準則如(圖四)所示:


    (圖四)

    最后對上述來個總結,整體的匹配流程如(圖五)所示:

    (圖五)


    ? ? ? 點匹配過程在具體實現中也可以采用金字塔的方式,有粗到精來加快目標點的搜索過程,另外還有些快速判斷先驗信息,比如先驗信息認為特征點主要是圖像的強邊緣點,并且圖像灰度的梯度服從高斯分布,只要找到模型特征點附近梯度最大的值,即認為是特征點所在的位置。但有時這種信息會帶來誤判,如實驗效果(圖六)和(圖七)所示:

    ?

    (圖六) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(圖七)


    ? ? (圖七)紅圈處的眼鏡邊緣處強的邊緣點被誤判成特征點。因此該算法還有很多該改進的地方,雖然如此,ASM仍然是獲取人臉特征的強有力的方法,這節寫的比較倉促,如果有錯誤的地方,請指出,謝謝。


    參考文獻:

    ? ? ? An Introduction to Active Shape Models. Tim Cootes

    ? ? ? Locating Facial Features with an Extended Active ShapeModel.Stephen Milborrow

    ? ? ? Comparing Active Shape Models with Active Appearance Models.TimCootes

    ? ? ? Markov Random Field Modeling in Image Analysis. Stan Z.Li

    ? ? ?http://blog.sina.com.cn/s/blog_6d8e91f401015pv5.html


    轉載請注明來源:http://blog.csdn.net/cuoqu/article/details/9154685

    目標檢測(Object Detection)原理與實現(五)


    基于Cascade分類器的目標檢測


    ? ? ? 從今天開始進入基于機器學習的目標檢測,前幾節雖然也接觸了一些機器學習的方法,但它主要是做輔助工作,機器學習的方法和非機器學習的方法結合在一起使用,說到這想起來前幾天看到一位博士師兄發的笑話,說的是百度實驗室:

    ? ? ?Theory is when you know everthing but nothing works.

    ? ? ?Practice is when everything works but no one knows why.

    ? ? ?In our lab,theory and practice are ?combined:nothing works and no one knows why.

    ? ? ? ? 目前而言,甭管理論好壞吧,只要實用就行,實用的未必是好理論,就像深度學習那樣,不說太遠了,繼續今天的話題,Cascade是Paul Viola發表在2001年的CVPR上,2002年Rainer Lienhart等人改進了Paul的方法,主要是改進了特征并且分析了不同的boosting算法對分類性能的影響和計算復雜度,OpenCV實現的Cascade的分類器也是Rainer的改進版本。所謂不同的boosting算法就是說不同的Adaboost弱分類器,比如Discrete, Real 和 Gentle Adaboost弱分類器,而Cascade(級聯)分類器就是基于多個Adaboot弱分類器對不同的特征進行依次處理(分類)來完成對目標的檢測,簡單的說有多個Adaboost串起來,然后提取每個平滑窗(sliding window)上的不同特征,把這些特征依次放進不同的Adaboost弱分類器里判斷,如果所有的弱分類器都判斷正標簽(1),則表示該該平滑窗內檢測到目標,如(圖一)所示。這樣做的好處是不但通過多個弱分類器來形成一個強的級聯分類器,而且可以減少運算量,比如當一個平滑窗第一個特征沒有通過第一個分類器,那么就沒有必要繼續運算下去,直接拒絕掉當前平滑窗,轉而處理下一個平滑窗,事實上作者的目的就是為了快速拋棄沒有目標的平滑窗,從而達到快速檢測目標。



    (圖一)

    ? ? ? 知道了Cascade強分類器是基于Adaboost算法的,那我們先看下Adaboost弱分類器的工作原理吧,直接上圖,很簡單,如圖二所示:


    (圖二)

    ? ? ? ?但OpenCV里還不是用的這個Adaboost,而是用的Rainer等人改進的Gentle Adaboost弱分類器,Gentle Adabboost弱分類器的工作原理如(圖三)所示:


    (圖三)

    ? ? ? ? Rainer等人比較了DiscreteAdaboost,Real Adaboost,Gentle Adaboost弱分類器,發現Gentle Adaboost弱分類器比其他兩種效果,但是作者沒有詳細討論為什么比他們好,作者只是給出了實際檢測的性能比較分析圖,我也沒看出為什么,如果你們知道為什么,請毫不吝嗇的告知,在此先謝過了,為了嚴謹,把三種分類器的性能分析比較圖也發出來吧,如(圖四)所示:


    (圖四)

    ? ? ? ? 其中GAB表示Gentle Adaboost,RAB表示Real Adaboost,DAB表示Discrete Adaboost。

    ? ? ? ? 好了,介紹完了分類器的工作原理,下面來看下使用的是什么特征。2001年Paul Viola的CVPR上用的幾個不同的特征很簡單,就是平滑窗內某些區域像素和的差值,比如(圖五)所示的,外圍黑色框表示平滑窗,窗內固定的位置有個黑白相間的矩形區域,黑色表示該位置上的像素每個權重都是負一(-1),白色位置上的像素權重為正一(1),然后權重于像素卷積得到的值就是特征值,就一個數字(說的白話一點,就是每個像素值乘上權值后,然后黑白相間的矩形區域相加),不同的黑白相間的矩形區域的計算得到不同的特征,作者還提出一個加速計算這個特征的方法,就是積分圖,在此不說了,網上很多。


    (圖五)

    ? ? ? ? 同樣,OpenCV的實現也沒有使用上述特征,而是使用了2002年Rainer 等人改進的Harr-like特征,計算方法也類似,如圖六所示:


    (圖六)

    ? ? ? ?也是矩形區域,不過不同的特征變化的樣式多了一些,Rainer也提出了一些快速計算方法,具體閱讀參考論文吧。有了特征,有了級聯分類器,就是訓練和檢測了。

    ? ? ? ?直接調用OpenCV的例子程序檢測的效果如(圖七)所示:


    (圖七)

    ? ? ? ? 這節比較簡單,只所以要說這個cascade分類器,是因為前一節用到了這個分類器用于檢測人臉,而且后續也會出現cascade級聯的思想,也可以給自己查漏補缺,寫作倉促,難免有錯,如發現請指出,謝謝。


    ? ? ?有人做過測試:Opencv的正臉檢測精度是68.84058%

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Total images 1104

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Total correct ?760

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Total false negatives 314

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Total false positives 30%

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?accurate ?68.84058

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 側臉識別精度是33.00091

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Total images 1103
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Total correct ?364
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Total false ?negatives 721
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Total false ?positives 18
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?% accurate 33.00091


    參考文獻:

    ? ? ? [1]Rapid Object Detection using a Boosted Cascade of Simple Features. Paul Viola

    ? ? ? [2]Empirical Analysis of Detection Cascades of Boosted Classifiers for Rapid Object ?Detection. Rainer Lienhart, Alexander Kuranov, Vadim Pisarevsky


    轉載請注明來源:http://blog.csdn.net/cuoqu/article/details/9173645

    目標檢測(Object Detection)原理與實現(六)


    基于形變部件模型(Deformable Part Models)的目標檢測



    ? ? ? ?上節說了基于cascade的目標檢測,cascade的級聯思想可以快速拋棄沒有目標的平滑窗(sliding window),因而大大提高了檢測效率,但也不是沒缺點,缺點就是它僅僅使用了很弱的特征,用它做分類的檢測器也是弱分類器,僅僅比隨機猜的要好一些,它的精度靠的是多個弱分類器來實行一票否決式推舉(就是大家都檢測是對的)來提高命中率,確定分類器的個數也是經驗問題。這節就來說說改進的特征,盡量使得改進的特征可以檢測任何物體,當然Deep Learning學習特征很有效,但今天還是按論文發表順序來說下其他方法,(服務器還沒配置好,現在還不能大批跑Deep Learning ^.^),在第四節說了ASM并且簡單的提了下AAM,這兩個模型其實就是形變模型(deform model),說到基于形變模型檢測物體的大牛,就不得說說芝加哥大學教授Pedro F. Felzenszwalb,Pedro發表很多有關基于形變部件來做目標檢測的論文,并靠這個獲得了VOC組委會授予的終身成就獎,另外它早期發表的《Belief propagation for early vision》也很出名,雖然比不上Science那樣的開辟新領域的Paper,但在不犧牲精度的情況下大大提高了BP算法的運行效率,這個BP算法不是神經網絡的BP算法,而是概率圖模型里的推理求解方法(最大后驗概率),它也被用在了后面要說基于霍夫推理的目標檢測。貌似Pedro很擅長做這種事情,他的另外一篇論文《Cascade Object Detection with Deformable Part Models》也是不犧牲精度的情況下把基于形變部件做目標檢測的效率提高了20倍,今天就來學習一下這種基于形變部件的目標檢測。

    ? ? ? ?基于形變部件的目標檢測是現在除了深度學習之外的還相對不錯的目標檢測方法,先來看下為什么要使用形變部件,在(圖一)中,同一個人的不同姿態,試問用前面幾節中的什么方法可以檢測到這些不同姿態的人?閾值不行,廣義霍夫變換行嗎?人的姿態是變換無窮的,需要太多的模板?;舴蛏滞镀?#xff1f;貌似可以,但是霍夫森立的特征是圖像塊,只適用于一些形變不大的物體,當圖像塊內的形變很大時同樣不太適用。那么ASM可以嗎?想想也是和廣義霍夫變換一樣,需要太多的均值模板。歸根結底就是我們沒有很好的形狀描述方法,沒有好的特征。而Pedro幾乎每發表一篇論文就改進一下形狀描述的方法,最終由簡單的表示方法到語法形式的表示方法,其演化過程可以在參考文獻[4]中看出,參考文獻[4]是Pedro的博士論文。



    (圖一)

    ? ? ? ?既然上節中的幾種方法都不能解決大形變目標的檢測問題,那基于形變部件的目標檢測也該上場了。Pedro的五篇關于目標檢測的頂級paper,小生就不一一說了,挑參考文獻中的三篇學習一下。參考文獻[1]、[2]、[3]分別講述了如何利用形變模型描述物體(特征階段)、如何利用形變部件來做檢測(特征處理+分類階段)、如何加速檢測。首先來說下文獻[1]的形變部件。在Deformable Part Model中,通過描述每一部分和部分間的位置關系來表示物體(part+deformable configuration)。其實早在1973年,Part Model就已經在 “Therepresentation and matching of pictorial structures” 這篇文章中被提出了。


    (圖二)

    ? ? ? ? Part Model中,我們通過描述a collection of parts以及connection between parts來表示物體。(圖二)表示經典的彈簧模型,物體的每一部分通過彈簧連接。我們定義一個energy function,該函數度量了兩部分之和:每一部分的匹配程度,部分間連接的變化程度(可以想象為彈簧的形變量)。與模型匹配最好的圖像就是能使這個energy function最小的圖片。形式化表示中,我們可以用一無向圖 G=(V,E) 來表示物體的模型,V={v1,…,vn} 代表n個部分,邊 (vi,vj)∈E 代表兩部分間的連接。物體的某個實例的configuration可以表示為 L=(l1,…,ln),li 表示為 vi 的位置(可以簡單的將圖片的configuration理解為各部分的位置布局,實際configuration可以包含part的其他屬性)。給定一幅圖像,用 mi(li) 來度量vi 被放置圖片中的 li 位置時,與模板的不匹配程度;用 dij(li,lj) 度量 vi,vj 被分別放置在圖片中的 li,lj位置時,模型的變化程度。因此,一副圖像相對于模型的最優configuration,就是既能使每一部分匹配的好,又能使部分間的相對關系與模型盡可能的相符的那一個。同樣的,模型也自然要描述這兩部分。可以通過下面的(公式一)描述最優configuration:


    (公式一)

    ? ? ? ?優化(公式一)其實就是馬爾科夫隨機場中的經典問題求解,可以用上面說的BP算法求解。說的理論些就是最大化后驗概率(MAP),因為從隨機場中很容易轉換到概率測度中(gibbs measure),在這就不說那么復雜了,想系統的學習相關理論可以學習概率圖模型(probabilistic graphical model)。識別的時候采用就是采用部件匹配,并且使得能量最小,這有點類似于ASM,但是ASM沒有使用部件之間的關系,只是單純的讓各匹配點之間的代價和最小。匹配結果如(圖三)所示:


    (圖三)

    ? ? ? 上面的方法沒有用到機器學習,另外部件的尋找也不是一件容易的事情,因為首先要大概預估部件的位置,因此這個方法也有缺點,但這個形變部件的思想可以用來作為特征,接著就來看下Pedro的第二篇文獻[2]如何用它來做目標檢測。

    Pedro在文獻[2]中基于形變模型的目標檢測用到了三方面的知識:1.Hog Features 2.Part Model 3. Latent SVM。

    1. ? ? ?作者通過Hog特征模板來刻畫每一部分,然后進行匹配。并且采用了金字塔,即在不同的分辨率上提取Hog特征。

    2. ? ? ?利用上段提出的Part Model。在進行object detection時,detect window的得分等于part的匹配得分減去模型變化的花費。

    3. ? ? ?在訓練模型時,需要訓練得到每一個part的Hog模板,以及衡量part位置分布cost的參數。文章中提出了Latent SVM方法,將deformable part model的學習問題轉換為一個分類問題。利用SVM學習,將part的位置分布作為latent values,模型的參數轉化為SVM的分割超平面。具體實現中,作者采用了迭代計算的方法,不斷地更新模型。

    針對上面三條,我們可能有幾個疑問:1、部件從何而來?2、如何用部件做檢測?在基于部件做目標檢測之前,贏得PASCAL VOC 2006年挑戰的Dalal-Triggs的方法是直接用HOG作為特征,然后直接基于不同尺度的滑動窗口做判別,像一個濾波器,靠這個濾波器贏得短時的榮譽,但不能抗大形變的目標。Pedro改進了Dalal-Triggs的方法,他計算作為一個得分,其中beta是濾波器,phi(x)是特征向量。通過濾波器找到一個根(root)部件p0,根部件有專門的濾波器,另外還有一系列非根部件(parts)p1…pn,然后把他們組成一個星形結構,此時回顧(圖一)的形變模型思想。每個部件用來表示,其中X,Y是坐標,L表示金字塔級別。當這個星形結構的匹配得分減去模型變化的代價得到最終分最高時,就完成了匹配,如(公式二)所示:


    (公式二)

    ? ? ? ?其中F’表示濾波器的向量化表示,b是偏移項,H表示特征金字塔?,F在假設濾波器解決了部件,完成了匹配,解答了第二個疑問,但是濾波器從何而來,簡單的說就是這個濾波器的權重beta是多少?現在不知道部件,也不知道濾波器,沒有濾波器就沒有部件,沒有部件也求不出濾波器的參數,這就是典型的EM算法要解決的事情,但是作者沒有使用EM算法,而是使用隱SVM(Latent SVM)的方法,隱變量其實就是類似統計中的因子分析,在這里就是找到潛在部件。在訓練的時候對部分部件進行打標簽,用他們求beta,然后用beta再來找潛在部件,因此使用coordinatedescent迭代求解,再一次遇到這個求解方法。有了部件和打分,就是尋找根部件和其他部件的結合匹配最優問題,可以使用動態規劃,但很慢,具體請參考文獻[2]。

    ?

    ? ? ? 在文獻[2]中雖然使用了金字塔來加速搜尋速度,但是對星形結構組合的搜索匹配計算量也很大,檢測速度稍慢。因此接著來看第三篇文獻[3],文獻[3]就是加速檢測過程,對于星形結構模型采用cascade來判斷,來快速拋去沒有有效信息的part,其實實際中根部件的位置對匹配起著很大作用,然后依次對其他部件(n+1),有了這種關系,取一些部件子集后我們可以采用cascade來修剪、拋去一些不是好配置的部件組合(官方用語叫配置),這樣一些在弱分類器中評分高的組合進入更一步的判斷,類似于cascade的級聯思想,但是要注意形變模型的每個部件應該是相關的,而不應該像上節那樣harr-like特征之間獨立,依次判斷在這里行不通,這里其實是個子序列匹配問題,文獻[7]提出過一種解決方法,pedro又改進了此方法,在原來n+1個部件的基礎上增加n+1可以快速計算的簡單部件,這樣打亂之后,子序列匹配的代價就小了一些。

    下面正式進入檢測流程,看看怎么來加速的,大概流程如(圖四)所示:


    (圖四)

    ? ? ?其中各個notation含義如(圖五)所示(特別注意p不是在上面說的部件,而是表示部件vi的貢獻):


    (圖五)

    ? ? ? 基于部件檢測的主題思想到此差不多了,但是還有更多的trick沒有說,比如閾值選取、如何計算簡單的部件等

    檢測效果如(圖六)所示:


    (圖六)

    ? ? ?這是一篇學習筆記式的“流水賬”,難免有說錯的地方,如發現請指出,謝謝。本節所有的文獻代碼都集成在一起掛在pedro主頁上。

    ?

    參考文獻:

    [1] Pictorial Structures for Object Recognition. Pedro F.Felzenszwalb

    [2]Object Detection with Discriminatively Trained Part Based Models.Pedro F. Felzenszwalb

    [3]Cascade Object Detection with Deformable Part Models. Pedro F.Felzenszwalb

    [4]From RigidTemplates To Grammars: Object Detection With Structured Models. Pedro F.Felzenszwalb

    [5]Histogramsof oriented gradients for human detection. N. Dalal and B. Triggs

    [6]?http://bubblexc.com/y2011/422/

    [7]A computational model for visual selection.Y. Amit and D.Geman


    轉載請注明來源:http://blog.csdn.net/cuoqu/article/details/9244193


    總結

    以上是生活随笔為你收集整理的目标检测原理与实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。