最近在做移動(dòng)端的視頻流目標(biāo)檢測(cè)剃允,配置opencv4Android姚淆,這一塊在opencv官方文檔上有些說明文檔省店,另外learning opencv3的章節(jié)object detection也值得一看牙咏。
前言
目標(biāo)檢測(cè)早直,就是判斷圖片中是否包含特定物體以及物體在像素空間上的位置祷肯。這里沉填,我們關(guān)注幾種機(jī)器學(xué)習(xí)技術(shù)的目標(biāo)檢測(cè)手段。
1.基于樹的目標(biāo)檢測(cè)技術(shù)
在當(dāng)前的opencv庫里有兩種檢測(cè)器佑笋,cascade classifier翼闹,源自Viola 和 Jones在人臉檢測(cè)上非常成功的算法,詳見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)檢測(cè)上蜀备,一般而言关摇,具有嚴(yán)格結(jié)構(gòu)和豐富紋理的物體(剛性物體)響應(yīng)更好。
這些算法不僅封裝了基學(xué)習(xí)器的函數(shù)碾阁,還包含了學(xué)習(xí)器的輸入或是輸出的預(yù)處理的方法输虱。當(dāng)然,這些算法不像是opencv中的基學(xué)習(xí)器脂凶,有統(tǒng)一的接口宪睹。它建立了boost篩選式級(jí)聯(lián)分類器。它與ML庫中其他部分相比蚕钦,有不同的格局亭病,因?yàn)樗窃谠缙陂_發(fā)的,并完全可用于人臉檢測(cè)嘶居。通常由算法的發(fā)明者提供給opencv罪帖,因此接口更像是算法的原始實(shí)現(xiàn)。
1.1 Cascade Classifiers
Cascade Classifier由一個(gè)重要的概念構(gòu)建,boosted rejection cascade整袁。它在opencv庫里有不同的格式菠齿,因?yàn)樗婚_始是由一個(gè)成熟的人臉檢測(cè)的應(yīng)用發(fā)展而來, 隨后才演化的更普遍葬项。這里我們介紹它的詳細(xì)原理和怎樣應(yīng)用到人臉檢測(cè)和其他物體上泞当。
計(jì)算機(jī)視覺是一個(gè)涉及廣泛而又發(fā)展迅速的領(lǐng)域,所以opencv中某個(gè)特定技術(shù)很容易發(fā)展過時(shí)民珍,之前的人臉檢測(cè)器(Haar classifier)就是這樣襟士,但人臉檢測(cè)又有巨大的需求,因此需要一個(gè)不錯(cuò)的基線技術(shù)供使用嚷量,而且人臉檢測(cè)是建立在最經(jīng)常使用的分類器boosting上陋桂,因此更加通用。事實(shí)上蝶溶,一些公司使用了opencv中的“人臉”檢測(cè)器來檢測(cè)“基本剛性的”物體(臉嗜历,汽車,自行車抖所,人體)梨州。通過成千上萬的物體的各個(gè)角度的訓(xùn)練圖像,訓(xùn)練出新的分類器田轧,這個(gè)技術(shù)被用來設(shè)計(jì)目前最優(yōu)的檢測(cè)算法暴匠。因此,對(duì)于此類識(shí)別任務(wù)傻粘,Haar分類器是一個(gè)有用的工具每窖。
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.使用對(duì)角特征,更普遍地污秆,稱為“Haar-like” 特征后室,在opencv3.x中,又發(fā)展成使用local binary patterns(LBP)混狠。
opencv的cascade classifier實(shí)現(xiàn)有兩層,第一層是特征檢測(cè)疾层,封裝了特征計(jì)算将饺,第二層是boosted cascade,計(jì)算得到的特征的矩形區(qū)域的和與差,boosting分類器與特征的計(jì)算層無關(guān)予弧。
1.1.1 Haar-like features
類Haar特征描述如下圖刮吧,在所有縮放尺度下,這些特征組成了boosting分類器使用的全部“原材料”掖蛤。他們從原始灰度圖像的積分圖中快速計(jì)算得出杀捻。
opencv可以使用cv::integral()函數(shù)輕松計(jì)算積分圖,積分圖是一種數(shù)據(jù)結(jié)構(gòu)蚓庭,可以實(shí)現(xiàn)子區(qū)域的快速求和致讥。這樣的求和在很多應(yīng)用中是有用的,最顯著的是人臉識(shí)別和相關(guān)算法的Haar小波器赞。
opencv支持積分圖的三種變化垢袱。分別是sum, square-sum, tilted-sum.每一種的輸出和輸入圖像尺寸一致。利用這些積分圖港柜,可以計(jì)算圖像的任意直立或傾斜的矩形區(qū)域的和请契,均值和標(biāo)準(zhǔn)差。在這種方式下夏醉,就可能進(jìn)行快速模糊爽锥、梯度估計(jì)、計(jì)算均值和標(biāo)準(zhǔn)差畔柔,甚至為各種窗口大小執(zhí)行快速的可變窗塊相關(guān)計(jì)算氯夷。
積分圖的計(jì)算
三種不同的積分圖在C++ API中僅以他們的參數(shù)加以區(qū)分。
Standard Summation Integral
Squared Summation Integral
如果輸入圖片的尺寸是W*H释树,那么輸出則是(W+1)*(H+1)肠槽。
當(dāng)前,opencv中僅支持兩種特征奢啥。原始的Haar小波(包含對(duì)角特征)和LBP秸仙。
1.1.2 Local binary pattern features
LBP是一種用來描述圖像局部紋理特征的算子,被用于Viola-Jones檢測(cè)器桩盲,回想Haar小波寂纪,它是在一小塊鄰域上通過小波變換的特征向量,而LBP在構(gòu)造特征向量與此不同赌结,在一個(gè)長(zhǎng)寬都為3的倍數(shù)的矩形上捞蛋,將它分割成不相重疊的3*3的小塊,在每一個(gè)小塊上柬姚,用積分圖計(jì)算像素和拟杉,然后將中心點(diǎn)像素與周圍8個(gè)像素點(diǎn)比較得到一個(gè)8位的特征值,用來描述相應(yīng)矩形的特征量承。1.1.3 Training and pretrained detectors
opencv提供了一套預(yù)訓(xùn)練目標(biāo)識(shí)別的文件搬设,也有代碼允許你訓(xùn)練存儲(chǔ)新的檢測(cè)器的目標(biāo)模型穴店。如果不夠用,在opencv存儲(chǔ)目錄里apps文件夾下還有traincascade的應(yīng)用拿穴,你可以用它來訓(xùn)練任何剛性物體的檢測(cè)器泣洞,但穩(wěn)定性因物變化。
預(yù)訓(xùn)練目標(biāo)的文件在.../opencv/data/haarcascades和.../opencv/data/lbpcascades下面默色,其中正面人臉識(shí)別效果最好的是haarcascade_frontalface_alt2.xml球凰,而側(cè)臉卻難以用該方法獲得準(zhǔn)確的檢測(cè)結(jié)果。
1.2 監(jiān)督學(xué)習(xí)和Boosting理論
opencv中的cascade分類器是一種監(jiān)督學(xué)習(xí)腿宰,Viola-Jones檢測(cè)器使用adaboost呕诉,也叫作rejection cascade,cascade是一系列的節(jié)點(diǎn)酗失,每一個(gè)節(jié)點(diǎn)是獨(dú)立的adaboost分類樹义钉,圖像上的一個(gè)子窗口以一種特定順序在所有cascade上測(cè)試,只有通過了所有分類器的窗口才被視作是目標(biāo)规肴。
每一個(gè)節(jié)點(diǎn)都被設(shè)計(jì)成為有高檢測(cè)率(99.9%)和低假正率(大致50%)捶闸,每一個(gè)節(jié)點(diǎn)里,得到?jīng)]有在圖片里的結(jié)果就可以結(jié)束計(jì)算拖刃,然后最終宣稱圖片上沒有目標(biāo)删壮。
1.2.1 Boosting in the Haar cascade
對(duì)于Viola-Jones rejection cascade,每一個(gè)節(jié)點(diǎn)都是組合的弱學(xué)習(xí)器,然后通過boosting兑牡,組成一個(gè)強(qiáng)學(xué)習(xí)器央碟。這些獨(dú)立的弱學(xué)習(xí)器通常是深度為1的決策樹,即單層決策樹均函。單層決策樹通常只做一個(gè)決定亿虽,按照以下格式:特征h里的值v,是大于閾值t,還是小于苞也?“yes”表示物體的存在洛勉,“no”表示沒有。
Viola-Jones分類器的Haar特征或LBP特征的數(shù)量在每一層節(jié)點(diǎn)都可以設(shè)置如迟,但大多通常是單一特征的決策收毫,有些場(chǎng)景最多三個(gè)特征。然后通過迭代提升將這些弱學(xué)習(xí)器進(jìn)行加權(quán)組合殷勘。
在訓(xùn)練一開始此再,需要設(shè)置在每個(gè)節(jié)點(diǎn)上能最優(yōu)化分輸入的閾值tw,然后用累積誤差來計(jì)算權(quán)重參數(shù)αw。在傳統(tǒng)的adaboost里玲销,每一個(gè)特征向量(數(shù)據(jù)點(diǎn))每次迭代時(shí)也需要重新分配權(quán)重输拇。
1.2.2 Rejection cascades.
下圖展示了Rejection cascades的流程,由許多的boosted分類器組成贤斜,每個(gè)節(jié)點(diǎn)Fj包含了整個(gè)決策樹樁的集合淳附,每個(gè)節(jié)點(diǎn)都有個(gè)很高的檢測(cè)率(99.9%)议慰,但可能也有50%的非目標(biāo)檢測(cè)失誤,但這不影響奴曙,想象20個(gè)節(jié)點(diǎn)后,檢測(cè)率為0.99920 ≈ 98%草讶,而假正率僅為0.520 ≈ 0.0001%!
像之前提及的洽糟,這個(gè)技術(shù)實(shí)現(xiàn)了人臉檢測(cè)但不限于人臉,在大多數(shù)剛性物體上都表現(xiàn)的很好堕战,但側(cè)臉或者說是車的角落位置則不然坤溃。
1.2.3 The cv::CascadeClassifer object
cascade分類器在opencv中作為一個(gè)對(duì)象,即cv::CascadeClassifer嘱丢。
這個(gè)構(gòu)造函數(shù)只有一個(gè)參數(shù)薪介,即你存儲(chǔ)的cascade的文件,如果你想要稍后加載越驻,也可以用load函數(shù)汁政。
1.2.4 Searching an image with detectMultiScale()
實(shí)現(xiàn)cascade分類的函數(shù)是cv::CascadeClassifer對(duì)象中的detectMultiScale()方法。
首先輸入類型為CV_8U的灰度圖片缀旁,然后該函數(shù)瀏覽輸入圖片的所有尺度定位目標(biāo)并返回到objects參數(shù)中记劈,設(shè)置scaleFactor決定尺度間的寬度,越大表明計(jì)算速度的提高并巍,但可能會(huì)丟失目標(biāo)目木,minNeighbors參數(shù)是對(duì)錯(cuò)誤判斷的控制,因?yàn)楹玫哪繕?biāo)檢測(cè)會(huì)在相鄰空間碰撞因?yàn)橹苓叺南袼貢?huì)暗示該目標(biāo)的存在懊渡。
未完待續(xù)刽射。。剃执。