今天撇去不同目標追蹤算法的框架,比如KCF、TLD、Mean Shift等,忽略它們繁瑣的公式,看了對目標檢測的基本理解。這里做一個簡單的總結,目標檢測的框架一般是下圖這樣的:
目標檢測分為以下幾個步驟:
1、 訓練分類器所需樣本的創建
訓練樣本一般包括正樣本和負樣本,正樣本是指第一幀圖中框定的待檢測的目標,負樣本是指其它不包含目標的任意圖片(比如背景),所有的樣本圖片都被歸一化同樣的尺寸大小(比如20C20)。
2、 特征提取
我們一般通過圖像、視頻或者波形獲得的數據量是很巨大的,比如一個簡單的文字圖像或者一個心電圖波形也可能要有幾千個數據。為了對這些數據進行有效的識別、分類,就需要我們對原始數據進行變換,從而來得到最能反映分類本質的特征。這就是特征選擇與提取的過程。
一般來說,我們把原始數據組成的空間叫測量空間,把分類識別賴以進行的空間叫做特征空間,通過變換,我們可把在維數較高的測量空間中表示的模式轉變為在維數較低的特征空間中表示的模式。(這部分和我目前正在看的SVM和核函數聯系極大,公式比較繁瑣,定義也比較多,目前暫未全部羅列消化,雖然最近看了一部分,大部人說用的不一定需要懂,可是感覺不懂根本無法用好,最近正在致力於消化的小目標,准備從這里開始入手machine learning)
3、 用訓練樣本來訓練分類器
這部分首先得先明白分類器是什么?wikipedia上的解釋是:在機器學習領域,分類的目標是指將具有相似特征的對象聚集,通過特征的線性組合來做出分類決定,以達到此種目的。在這里,對象的特征通常被描述為特征值,在向量中被描述為特征向量。
比如,人腦本身也算一個分類器(強大到超乎想象),人對事物的識別就是一個分類的過程,人在成長和學習過程中,會通過觀察A類事物的多個具體事例來得到對A類事物性質和特點的認識,以后遇到一個新物體的時候,人腦會根據這個事物的特征去判斷是否符合A類事物的性質和特點,然后將其分為A類或者B類(這里是一個簡單的二分類問題)。
在這里,訓練分類器(大腦)可以通過對正樣本和負樣本的觀察(學習),是其具有對該目標的檢測能力,從而遇到該目標時可以檢測出來。
從數學來表達,分類器就是一個函數y=f(x),x是某個事物的特征,y是類別,通俗的說就是例如,你輸入張三的特征x1,分類器就給你認出來這個是張三y1,你輸入李四的特征x2,它就給你認出來這個是李四y2。那么分類器是個函數,它的數學模型是什么呢?一次函數y=kx+b?高次函數?等等好復雜的都有,我們需要先確定它的模型;確定了模型后,模型是不是由很多參數呢?例如上面的一次函數y=kx+b的k和b,高斯函數的均值和方差等等。這個就可以通過什么最小化分類誤差、最小化懲罰啊等等方法來確定,其實訓練分類器好像就是找這些參數,使得達到最好的分類效果。
此外,為了使分類器檢測准確率較好,訓練樣本一般都是成千上萬,然后每個樣本提取出很多個特征,這樣就產生了很多的訓練數據,所以訓練的過程一般也都是很耗時的。
4、 利用訓練好的進行目標檢測
得到了分類器后,我們就可以用來對輸入的圖像進行分類了,也就是在圖像中檢測是否存在我們想要檢測的目標。一般的檢測過程是這樣的:用一個掃描子窗口在待檢測的圖像中不斷的移位滑動,子窗口每到一個位置,就會計算出該區域的特征,然后用我們訓練好的分類器對該特征進行篩選,判定該區域是否為目標。有時候可能因為目標圖像的大小和你訓練分類器時使用的樣本圖片大小不一樣,所以就需要對這個掃描的子窗口變大或者變小(或者將圖像變小),再在圖像中滑動,重新進行匹配一遍。
5、 學習和改進分類器
現在如果樣本數較多,特征選取和分類器算法都比較好的情況下,分類器的檢測准確度都挺高的了。但也會有誤檢的時候。所以更高級點的話就是加入了學習或者自適應,也就是說你把這張圖分類錯誤了,我就把這張圖拿出來,標上其正確的類別,再放到樣本庫中去訓練分類器,讓分類器更新、醒悟,下次別再再弄錯了。我們怎么知道他弄錯了呢?我的理解是:(1)、可能是靠先驗知識來判定(例如目標本身存在着結構啊或者什么的約束)(2)、根據跟蹤速度來判定(目標一般不會運動得太快)(3)、比較在初始圖片幀采集的樣本集得到的殘差函數值的大小來判定(比如說我們得到的目標函數使得殘差值過大)(4)、也可能根據以上這些情況來綜合來判斷的。
6、 小總結
上面模式分類的過程適合很多領域,例如圖像、語音識別等等,它的關鍵點在於兩個方面。
(1) 特征選取:比如說目前比較盛行的有: Haar特征、LBP特征、HOG特征和Shif特征等;他們各有千秋,視要檢測的目標情況而定,例如:拳頭:紋理特征明顯:Haar、LBP(目前有將其和HOG結合);手掌:輪廓特征明顯:HOG特征(行人檢測一般用這個)
(2) 分類器算法
感覺目前比較盛行的有:SVM支持向量機、AdaBoost算法等;其中檢測行人的一般是HOG特征+SVM,OpenCV中檢測人臉的一般是Haar+AdaBoost,OpenCV中檢測拳頭一般是LBP+ AdaBoost;
目標識別與追蹤真心涉及到很多很多算法和machine learning的基礎知識,並且有不斷地涌現的大牛提出各種算法,簡單的哲學,復雜的數學!!感覺身體被掏空,在此勉勵自己,希望自己能在機器視覺領域更上一層樓!