1. 論文信息
- 論文標題 :Visual Tracking with Online Multiple Instance Learning
- 論文作者:
- Boris Babenko,University of California, San Diego
- Ming-Hsuan Yang,University of California, Merced
- Serge Belongie,University of California, San Diego
- 發表會議:CVPR,2009
2. 基礎知識
- 目標跟蹤的三大要素:圖像表示(Image Representation)、外觀模型(Appearance Model)和運動模型(Motion Model)。
- 本文中的圖像表示爲Haar-like特徵,外觀模型由一個判別分類器組成,運動模型就是在上一幀目標周圍取一系列的patches(要求:距離 <
s ),看哪一個patch的概率最高就將新的目標框給它(貪心算法)。 - 本文的重點是外觀模型。
- 本文沒有考慮旋轉和尺度變化。
3. 整體思路
- 只要能夠在每一幀中都能應用上述貪心算法,理論上就能實現目標跟蹤,那麼,程序如何計算各個patches(要求:距離 <
s )的概率呢? - 只要每一幀確定了當前的目標位置,程序就會對外觀模型進行更新,實質上是更新判別分類器,新的分類器會對各個patches(要求:距離 <
s )的概率重新進行計算,將概率最大的patch作爲新的目標位置。
4. 判別分類器如何更新
- 一旦確定了當前的目標位置,就選取一組patches(要求:
γ < 距離 <β ),把這些patch放到一個包裏面,標記爲positive,即假設這個包裏面的所有patch中,至少有一個是正樣本。 - 同時也另選取一組patches(要求:
γ < 距離 <β ),對於這些patch,每個都作爲一個獨立的包(有多少個patch,就有多少個包),標記爲negative,即假設這個包裏面的patch是負樣本。 - 注意:這裏用的判別分類器並不是一個單獨的分類器,實際上它由許多獨立的基於Haar-like特徵的弱分類器構成,將這些弱分類器用線性的方式加起來,就形成了一個Haar級聯分類器:
上述公式(1)中的
該論文在更新判別分類器時,核心算法如下所示:
- for
k = 1 toK do - for
m = 1 toM do -
pmij=σ(Hij+hm(xij)) -
pmi=1−∏j(1−pmij) -
Lm=∑i(yilog(pmi)+(1−yi)log(1−pmi)) - end for
-
m∗=argmaxmLm -
hk(x)←hm∗(x) Hij=Hij+hk(x) - end for
- for
在上述算法中,第三行中求的是樣本的概率,第四行求的是包的概率。
從上面的算法可以看出,本文MIL算法主要依賴對數似然函數進行求解,每處理一幀圖像,算法就會採集一些訓練樣本
{(X1,y1),(X2,y2)⋯} ,其中Xi={Xi1,Xi2⋯} ,這時,算法會通過估計p(y|x) 的值來使對數似然函數最大化,如下所示:logL=∑ilog(p(yi|Xi))(2) 其中,
p(y|x)=σ(H(x))(3) 而
σ(x)=11+e−x(4) σ(x) 是Sigmoid函數,其中x 爲H(x) ,表示分類器的結果。
5. 一些不足及相應的修補方法
- 對於positive包,一個包中有多個實例,文章在計算時假定這些實例全部爲正樣本,這種假設離真實情況存在差異,其補救辦法是:基於似然損失函數來選擇弱分類器
h 。 - 在選擇弱分類器時,沒有采用係數,文章沒有對此問題加以補救,文章認爲這並沒有影響性能。
- 似然函數在計算時,僅僅依據當前的樣本,可能導致對當前樣本的過擬合,文章通過保留歷史數據的做法進行修補(前面的算法有沒有體現這種思想?)
6. 實現細節
在文章中,每一個弱分類器
hk 由一個Haar-like特徵fk 以及對應的4個參數構成,弱分類器返回一個對數概率,如下所示:hk(x)=log[pt(y=1|fk(x))pt(y=0|fk(x))](5) 其中,
pt(ft(x)|y=1)∼N(μ1,σ1)pt(ft(x)|y=0)∼N(μ2,σ2)(6)
文章令p(y=1)=p(y=0) ,採用貝葉斯來計算hk(x) 。當這個弱分類器接收了一組新數據{(x1,y1),(x2,y2),...,(xn,yn))} 時,更新的原則如下所示:
μ1←γμ1+(1−γ)1n∑i|yi=1fk(xi)σ1←γσ1+(1−γ)1n∑i|yi=1(fk(xi)−μ1)2−−−−−−−−−−−−−−−−−√(7)
其中,γ 被稱爲學習率參數。對
μ0 和σ0 的更新原則也是一樣的。上述弱分類器函數
hk(x) 的計算在配套代碼中有所體現,比如:
x = samples.feature;
p0 = exp((x - mu0).^2.*e0).*n0;
p1 = exp((x - mu1).^2.*e1).*n1;
r = log(eps + p1) - log(eps + p0);
7. 源碼分析
- 源碼中幾個重要的步驟有:採樣、爲每個樣本計算Haar特徵、更新弱分類器和選擇分類器,其中更新弱分類器有三個相關函數(weakClassifierUpdate、weakClassifier、MilBoostClassifierUpdate)。
- 函數weakClassifierUpdate、weakClassifier、MilBoostClassifierUpdate之間的區別在於,weakClassifierUpdate 主要用於更新
μ 和σ ,weakClassifier。 主要用於存放各個弱分類器對各個樣本的分類結果, MilBoostClassifierUpdate主要用於選出50個分類器。 - 算法的主要結構如下圖所示: