背景建模与前景检测3(Background Generation And Foreground Detection Phase 3)
背景建模與前景檢測(cè)之三(Background Generation And Foreground Detection Phase 3)
作者:王先榮
??? 在上一篇文章里,我嘗試翻譯了《Nonparametric Background Generation》,本文主要介紹以下內(nèi)容:如何實(shí)現(xiàn)該論文的算法,如果利用該算法來(lái)進(jìn)行背景建模及前景檢測(cè),最后談?wù)勎业囊恍w會(huì)。為了使描述更加簡(jiǎn)便,以下將該論文的算法及實(shí)現(xiàn)稱為NBGModel。
1 使用示例
??? NBGModel在使用上非常的簡(jiǎn)便,您可以仿照下面的代碼來(lái)使用它:
NBGModel nbgModel = new NBGModel(320, 240);
//訓(xùn)練背景模型
nbgModel.TrainBackgroundModel(historyImages);
//前景檢測(cè)
nbgModel.Update(currentFrame);
//利用結(jié)果
pbResult.Image = nbgModel.ForegroundMask.Bitmap;
//釋放對(duì)象
nbgModel.Dispose();
下面是更加完整的示例:
更加完整的示例?
2 實(shí)現(xiàn)NBGModel
????2.1 我在實(shí)現(xiàn)NBGModel的時(shí)候基本上跟論文中的方式一樣,不過有以下兩點(diǎn)區(qū)別:
(1)論文中的MeanShift計(jì)算使用了Epanechnikov核函數(shù),我使用的是矩形窗形式的MeanShift計(jì)算。主要是因?yàn)槲易约翰粫?huì)實(shí)現(xiàn)MeanShift,只能利用OpenCV中提供的cvMeanShift函數(shù)。這樣做也有一個(gè)好處——不再需要計(jì)算與保存典型點(diǎn)。
(2)論文中的方法在檢測(cè)的過程中聚集中心會(huì)不斷的增加,我模仿CodeBook的實(shí)現(xiàn)為其增加了一個(gè)清除消極聚集中心的ClearStable方法。這樣可以在必要的時(shí)候?qū)㈤L(zhǎng)期不活躍的聚集中心清除掉。
????2.2 NBGModel中用到的數(shù)據(jù)成員如下所示:
??????? private int width;????????????????????????????????????????? //圖像的寬度
??????? private int height;???????????????????????????????????????? //圖像的高度
??????? private NBGParameter param;???????????????????????????????? //非參數(shù)背景模型的參數(shù)
??????? private List<Image<Ycc, Byte>> historyImages = null;??????? //歷史圖像:列表個(gè)數(shù)為param.n,在更新時(shí)如果個(gè)數(shù)大于等于param.n,刪除最早的歷史圖像,加入最新的歷史圖像
??????? //由于這里采用矩形窗口方式的MeanShift計(jì)算,因此不再需要分組圖像的典型點(diǎn)。這跟論文不一樣。
??????? //private List<Image<Ycc,Byte>> convergenceImages = null;?? //收斂圖像:列表個(gè)數(shù)為param.m,僅在背景訓(xùn)練時(shí)使用,訓(xùn)練結(jié)束即被清空,因此這里不再聲明
??????? private Image<Gray, Byte> sampleImage = null;?????????????? //樣本圖像:保存歷史圖像中每個(gè)像素在Y通道的值,用于MeanShift計(jì)算
??????? private List<ClusterCenter<Ycc>>[,] clusterCenters = null;? //聚集中心數(shù)據(jù):將收斂點(diǎn)分類之后得到的聚集中心,數(shù)組大小為:height x width,列表元素個(gè)數(shù)不定q(q<=m)。
??????? private Image<Ycc, Byte> mrbm = null;?????????????????????? //最可靠背景模型
??????? private Image<Gray, Byte> backgroundMask = null;??????????? //背景掩碼圖像
??????? private double frameCount = 0;????????????????????????????? //總幀數(shù)(不包括訓(xùn)練階段的幀數(shù)n)
其中,NBGParameter結(jié)構(gòu)包含以下成員:
??????? public int n;?????????????????????? //樣本數(shù)目:需要被保留的歷史圖像數(shù)目
??????? public int m;?????????????????????? //典型點(diǎn)數(shù)目:歷史圖像需要被分為多少組
??????? public double theta;??????????????? //權(quán)重系數(shù):權(quán)重大于該值的聚集中心為候選背景
??????? public double t;??????????????????? //最小差值:觀測(cè)值與候選背景的最小差值大于該值時(shí),為前景;否則為背景
??????? public MCvTermCriteria criteria;??? //Mean Shift計(jì)算的終止條件:包括最大迭代次數(shù)和終止計(jì)算的精度
聚集中心ClusterCenter使用類而不是結(jié)構(gòu),是為了方便更新,它包含以下成員:
??????? public TColor ci;????????????? //聚集中心的像素值
??????? public double wi;????????????? //聚集中心的權(quán)重
??????? public double li;????????????? //聚集中心包含的收斂點(diǎn)數(shù)目
??????? public double updateFrameNo;?? //更新該聚集中心時(shí)的幀數(shù):用于清除消極的聚集中心
????2.3 NBGModel中的關(guān)鍵流程
1.背景建模
(1)將訓(xùn)練用的樣本圖像添加到歷史圖像historyImages中;
(2)將歷史圖像分為m組,以每組所在位置的矩形窗為起點(diǎn)進(jìn)行MeanShift計(jì)算,結(jié)果窗的中點(diǎn)為收斂中心,收斂中心的像素值為收斂值,將收斂值添加到收斂圖像convergenceImages中;
(3)計(jì)算收斂圖像的聚集中心:(a)得到收斂中心的最小值Cmin;(b)將[0,Cmin+t]區(qū)間中的收斂中心劃分為一類;(c)計(jì)算已分類收斂中心的平均值,作為聚集中心的值;(d)刪除已分類的收斂中心;(e)重復(fù)a~d,直到收斂中心全部歸類;
(4)得到最可靠背景模型MRBM:在聚集中心中選取wi最大的值作為某個(gè)像素的最可靠背景。
2.前景檢測(cè)
(1)用wi≥theta作為條件選擇可能的背景組Cb;
(2)對(duì)每個(gè)觀測(cè)值x0,計(jì)算x0與Cb的最小差值d;
(3)如果d>t,則該點(diǎn)為前景;否則為背景。
3.背景維持
(1)如果某點(diǎn)為背景,更新最近聚集中心的wi為(li+1)/m;
(2)如果某點(diǎn)為前景:(a)以該點(diǎn)所在的矩形窗為起點(diǎn)進(jìn)行MeanShift計(jì)算,可得到新的收斂中心Cnew(wi=1/m);(b)將Cnew加入到聚集中心clusterCenters;
(3)在必要的時(shí)候,清理消極的聚集中心。
????2.4 NBGModel的實(shí)現(xiàn)代碼
值得注意的是:在實(shí)現(xiàn)代碼中,有好幾個(gè)以2結(jié)尾的私有方法,它們主要用于演示算法流程,實(shí)際上并未使用。為了優(yōu)化性能而增加了不少指針操作之后的代碼可讀性變得很差。
?
3 NBGModel類介紹
????3.1 屬性
Width——獲取圖像的寬度
Height——獲取圖像的高度
Param——獲取參數(shù)設(shè)置
Mrbm——獲取最可靠背景模型圖像
BackgroundMask——獲取背景掩碼圖像
ForegroundMask——獲取前景掩碼圖像
FrameCount——獲取已被檢測(cè)的幀數(shù)
????3.2 構(gòu)造函數(shù)
public NBGModel(int width, int height)——用默認(rèn)的參數(shù)初始化NBGModel,等價(jià)于NBGModel(width, height, NBGParameter.GetDefaultNBGParameter())
public NBGModel(int width, int height, NBGParameter param)——用指定的參數(shù)初始化NBGModel
????3.3 方法
AddHistoryImage——添加一幅或者一組歷史圖像
TrainBackgroundModel——訓(xùn)練背景模型;如果傳入了歷史圖像,則先添加歷史圖像,然后再訓(xùn)練背景模型
Update——更新背景模型,同時(shí)檢測(cè)前景
ClearStale——清除消極的聚集中心
Dispose——釋放資源
4 體會(huì)
??? NBGModel的確非常有效,非常簡(jiǎn)潔,特別適用于伴隨復(fù)雜運(yùn)動(dòng)對(duì)象的背景建模。我特意選取了PETS2009中的素材對(duì)其做了一些測(cè)試,結(jié)果也證明了NBGModel的優(yōu)越性。不過需要指出的是,它需要占用大量的內(nèi)存(主要因?yàn)樾枰4鎛幅歷史圖像);它的計(jì)算量比較大。
在使用的過程中,它始終需要在內(nèi)存中緩存n幅歷史圖像,1幅最可靠背景模型圖像,1幅背景掩碼圖像,近似m幅圖像(聚集中心);而在訓(xùn)練階段,更需要臨時(shí)存儲(chǔ)m幅收斂圖像。
例如:樣本數(shù)目為100,典型點(diǎn)數(shù)目為10,圖像尺寸為768x576時(shí),所用的內(nèi)存接近300M,訓(xùn)練背景需要大約需要33秒,而對(duì)每幅圖像進(jìn)行前景檢測(cè)大約需要600ms。雖然可以使用并行編程來(lái)提高性能,但是并不能從根本上解決問題。
(注:測(cè)試電腦的CPU為AMD閃龍3200+,內(nèi)存1.5G。)
??? 看來(lái),有必要研究一種新的方法,目標(biāo)是檢測(cè)效果更好,內(nèi)存占用低,處理更快速。目前的想法是使用《Wallflower: Principles and Practice of Background Manitenance》中的3層架構(gòu)(時(shí)間軸上的像素級(jí)處理,像素間的區(qū)域處理,幀間處理),但是對(duì)每層架構(gòu)都選用目前流行的處理方式,并對(duì)處理方式進(jìn)行優(yōu)化。時(shí)間軸上的像素級(jí)處理打算使用CodeBook方法,但是增加本文的一些思想。像素間的區(qū)域處理打算參考《基于區(qū)域相關(guān)的核函數(shù)背景建模算法》中的方法。幀間處理預(yù)計(jì)會(huì)采用全局灰度統(tǒng)計(jì)值作為依據(jù)。
最后,按照慣例:感謝您耐心看完本文,希望對(duì)您有所幫助。
本文所述方法及代碼僅用于學(xué)習(xí)研究,不得用于商業(yè)目的。
總結(jié)
以上是生活随笔為你收集整理的背景建模与前景检测3(Background Generation And Foreground Detection Phase 3)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 背景建模与前景检测2(Backgroun
- 下一篇: Harris及Shi-Tomasi原理及