opencv目標(biāo)檢測(object detection)

最近在做移動端的視頻流目標(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特征描述如下圖,
類Haar特征(矩形和旋轉(zhuǎn)矩形特征都很容易從積分圖中算出)

在所有縮放尺度下,這些特征組成了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)矩形的特征。
image.png
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)組合。
boosting

在訓(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%!

Rejection cascades

像之前提及的,這個技術(shù)實(shí)現(xiàn)了人臉檢測但不限于人臉,在大多數(shù)剛性物體上都表現(xiàn)的很好,但側(cè)臉或者說是車的角落位置則不然。

1.2.3 The cv::CascadeClassifer object

cascade分類器在opencv中作為一個對象,即cv::CascadeClassifer。


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ù)。。。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內(nèi)容