最近在做移動端的視頻流目標(biāo)檢測,配置opencv4Android,這一塊在opencv官方文檔上有些說明文檔,另外learning opencv3的章節(jié)object detection也值得一看。
前言
目標(biāo)檢測,就是判斷圖片中是否包含特定物體以及物體在像素空間上的位置。這里,我們關(guān)注幾種機(jī)器學(xué)習(xí)技術(shù)的目標(biāo)檢測手段。
1.基于樹的目標(biāo)檢測技術(shù)
在當(dāng)前的opencv庫里有兩種檢測器,cascade classifier,源自Viola 和 Jones在人臉檢測上非常成功的算法,詳見Viola, Paul, and Michael Jones. “Rapid object detection using a boosted cascade of simple features.” Computer Vision and Pattern Recognition, 2001. CVPR 2001. Proceedings of the 2001 IEEE Computer Society Conference on. Vol. 1. IEEE,2001.第二種是soft cascade,一種提供了新途徑的演化的算法,并在大多實(shí)例上比cascade classifier有更健壯的分類。兩種算法都可以用到多目標(biāo)檢測上,一般而言,具有嚴(yán)格結(jié)構(gòu)和豐富紋理的物體(剛性物體)響應(yīng)更好。
這些算法不僅封裝了基學(xué)習(xí)器的函數(shù),還包含了學(xué)習(xí)器的輸入或是輸出的預(yù)處理的方法。當(dāng)然,這些算法不像是opencv中的基學(xué)習(xí)器,有統(tǒng)一的接口。它建立了boost篩選式級聯(lián)分類器。它與ML庫中其他部分相比,有不同的格局,因?yàn)樗窃谠缙陂_發(fā)的,并完全可用于人臉檢測。通常由算法的發(fā)明者提供給opencv,因此接口更像是算法的原始實(shí)現(xiàn)。
1.1 Cascade Classifiers
Cascade Classifier由一個重要的概念構(gòu)建,boosted rejection cascade。它在opencv庫里有不同的格式,因?yàn)樗婚_始是由一個成熟的人臉檢測的應(yīng)用發(fā)展而來, 隨后才演化的更普遍。這里我們介紹它的詳細(xì)原理和怎樣應(yīng)用到人臉檢測和其他物體上。
計算機(jī)視覺是一個涉及廣泛而又發(fā)展迅速的領(lǐng)域,所以opencv中某個特定技術(shù)很容易發(fā)展過時,之前的人臉檢測器(Haar classifier)就是這樣,但人臉檢測又有巨大的需求,因此需要一個不錯的基線技術(shù)供使用,而且人臉檢測是建立在最經(jīng)常使用的分類器boosting上,因此更加通用。事實(shí)上,一些公司使用了opencv中的“人臉”檢測器來檢測“基本剛性的”物體(臉,汽車,自行車,人體)。通過成千上萬的物體的各個角度的訓(xùn)練圖像,訓(xùn)練出新的分類器,這個技術(shù)被用來設(shè)計目前最優(yōu)的檢測算法。因此,對于此類識別任務(wù),Haar分類器是一個有用的工具。
cascade classifier,又被稱為Viola-Jones detector,最開始,這種算法和他的opencv實(shí)現(xiàn)僅支持Haar小波這種特定的特征。之后,由Rainer Lienhart 和 Jochen Maydt擴(kuò)展,詳見Lienhart, Rainer, and Jochen Maydt. “An extended set of haar-like features for rapid object detection.” Proceedings 2002 International Conference on Image Processing. Vol. 1. IEEE, 2002.使用對角特征,更普遍地,稱為“Haar-like” 特征,在opencv3.x中,又發(fā)展成使用local binary patterns(LBP)。
opencv的cascade classifier實(shí)現(xiàn)有兩層,第一層是特征檢測,封裝了特征計算,第二層是boosted cascade,計算得到的特征的矩形區(qū)域的和與差,boosting分類器與特征的計算層無關(guān)。
1.1.1 Haar-like features
類Haar特征描述如下圖,在所有縮放尺度下,這些特征組成了boosting分類器使用的全部“原材料”。他們從原始灰度圖像的積分圖中快速計算得出。
opencv可以使用cv::integral()函數(shù)輕松計算積分圖,積分圖是一種數(shù)據(jù)結(jié)構(gòu),可以實(shí)現(xiàn)子區(qū)域的快速求和。這樣的求和在很多應(yīng)用中是有用的,最顯著的是人臉識別和相關(guān)算法的Haar小波。
opencv支持積分圖的三種變化。分別是sum, square-sum, tilted-sum.每一種的輸出和輸入圖像尺寸一致。利用這些積分圖,可以計算圖像的任意直立或傾斜的矩形區(qū)域的和,均值和標(biāo)準(zhǔn)差。在這種方式下,就可能進(jìn)行快速模糊、梯度估計、計算均值和標(biāo)準(zhǔn)差,甚至為各種窗口大小執(zhí)行快速的可變窗塊相關(guān)計算。
積分圖的計算
三種不同的積分圖在C++ API中僅以他們的參數(shù)加以區(qū)分。
Standard Summation Integral
Squared Summation Integral
如果輸入圖片的尺寸是W*H,那么輸出則是(W+1)*(H+1)。
當(dāng)前,opencv中僅支持兩種特征。原始的Haar小波(包含對角特征)和LBP。
1.1.2 Local binary pattern features
LBP是一種用來描述圖像局部紋理特征的算子,被用于Viola-Jones檢測器,回想Haar小波,它是在一小塊鄰域上通過小波變換的特征向量,而LBP在構(gòu)造特征向量與此不同,在一個長寬都為3的倍數(shù)的矩形上,將它分割成不相重疊的3*3的小塊,在每一個小塊上,用積分圖計算像素和,然后將中心點(diǎn)像素與周圍8個像素點(diǎn)比較得到一個8位的特征值,用來描述相應(yīng)矩形的特征。1.1.3 Training and pretrained detectors
opencv提供了一套預(yù)訓(xùn)練目標(biāo)識別的文件,也有代碼允許你訓(xùn)練存儲新的檢測器的目標(biāo)模型。如果不夠用,在opencv存儲目錄里apps文件夾下還有traincascade的應(yīng)用,你可以用它來訓(xùn)練任何剛性物體的檢測器,但穩(wěn)定性因物變化。
預(yù)訓(xùn)練目標(biāo)的文件在.../opencv/data/haarcascades和.../opencv/data/lbpcascades下面,其中正面人臉識別效果最好的是haarcascade_frontalface_alt2.xml,而側(cè)臉卻難以用該方法獲得準(zhǔn)確的檢測結(jié)果。
1.2 監(jiān)督學(xué)習(xí)和Boosting理論
opencv中的cascade分類器是一種監(jiān)督學(xué)習(xí),Viola-Jones檢測器使用adaboost,也叫作rejection cascade,cascade是一系列的節(jié)點(diǎn),每一個節(jié)點(diǎn)是獨(dú)立的adaboost分類樹,圖像上的一個子窗口以一種特定順序在所有cascade上測試,只有通過了所有分類器的窗口才被視作是目標(biāo)。
每一個節(jié)點(diǎn)都被設(shè)計成為有高檢測率(99.9%)和低假正率(大致50%),每一個節(jié)點(diǎn)里,得到?jīng)]有在圖片里的結(jié)果就可以結(jié)束計算,然后最終宣稱圖片上沒有目標(biāo)。
1.2.1 Boosting in the Haar cascade
對于Viola-Jones rejection cascade,每一個節(jié)點(diǎn)都是組合的弱學(xué)習(xí)器,然后通過boosting,組成一個強(qiáng)學(xué)習(xí)器。這些獨(dú)立的弱學(xué)習(xí)器通常是深度為1的決策樹,即單層決策樹。單層決策樹通常只做一個決定,按照以下格式:特征h里的值v,是大于閾值t,還是小于?“yes”表示物體的存在,“no”表示沒有。
Viola-Jones分類器的Haar特征或LBP特征的數(shù)量在每一層節(jié)點(diǎn)都可以設(shè)置,但大多通常是單一特征的決策,有些場景最多三個特征。然后通過迭代提升將這些弱學(xué)習(xí)器進(jìn)行加權(quán)組合。
在訓(xùn)練一開始,需要設(shè)置在每個節(jié)點(diǎn)上能最優(yōu)化分輸入的閾值tw,然后用累積誤差來計算權(quán)重參數(shù)αw。在傳統(tǒng)的adaboost里,每一個特征向量(數(shù)據(jù)點(diǎn))每次迭代時也需要重新分配權(quán)重。
1.2.2 Rejection cascades.
下圖展示了Rejection cascades的流程,由許多的boosted分類器組成,每個節(jié)點(diǎn)Fj包含了整個決策樹樁的集合,每個節(jié)點(diǎn)都有個很高的檢測率(99.9%),但可能也有50%的非目標(biāo)檢測失誤,但這不影響,想象20個節(jié)點(diǎn)后,檢測率為0.99920 ≈ 98%,而假正率僅為0.520 ≈ 0.0001%!
像之前提及的,這個技術(shù)實(shí)現(xiàn)了人臉檢測但不限于人臉,在大多數(shù)剛性物體上都表現(xiàn)的很好,但側(cè)臉或者說是車的角落位置則不然。
1.2.3 The cv::CascadeClassifer object
cascade分類器在opencv中作為一個對象,即cv::CascadeClassifer。
這個構(gòu)造函數(shù)只有一個參數(shù),即你存儲的cascade的文件,如果你想要稍后加載,也可以用load函數(shù)。
1.2.4 Searching an image with detectMultiScale()
實(shí)現(xiàn)cascade分類的函數(shù)是cv::CascadeClassifer對象中的detectMultiScale()方法。
首先輸入類型為CV_8U的灰度圖片,然后該函數(shù)瀏覽輸入圖片的所有尺度定位目標(biāo)并返回到objects參數(shù)中,設(shè)置scaleFactor決定尺度間的寬度,越大表明計算速度的提高,但可能會丟失目標(biāo),minNeighbors參數(shù)是對錯誤判斷的控制,因?yàn)楹玫哪繕?biāo)檢測會在相鄰空間碰撞因?yàn)橹苓叺南袼貢凳驹撃繕?biāo)的存在。
未完待續(xù)。。。