基于粒子滤波的目标追踪

基于粒子滤波的目标追踪

particle filter

object tracking

读"K. Nummiaro, E. Koller-Meier, L. Van Gool. An adaptive color-based particle filter[J], Image and Vision Computing, 2002"笔记


粒子滤波中最重要的一个过程就是重要性重采样, Sampling Importance Resampling (SIR).

这篇博客基于粒子滤波的物体跟踪讲的挺形象的 :) 。 这里拿过来记录一下。

  1. 初始化阶段

    基于粒子滤波的目标追踪方法是一种生成式跟踪方法,所以要有一个初始化的阶段。对于第一帧图像,人工标定出待检测的目标,对该目标区域提出特征。论文里将图像的HSV空间划分成不同的bins,然后统计直方图。另外

To increase the reliability of the color distribution when boundary pixels belong to the background or get occluded, smaller weights are assigned to the pixels that are further away from the region center by employing a weighting function

是到区域中心的距离,所以直方图分布可如下计算

是归一化因子,是区域半径,是示性函数,是将加权后的值添加到对应的区间内。

  1. 搜索阶段 - 放狗

    现在已经知道了目标的特征,然后就在目标的周围撒点(particle),即放狗。放狗的方法有很多。 如a)均匀的撒点;b)按高斯分布撒点,就是近的地方撒得多,远的地方撒的少。论文里使用的是后一种方法。每一个粒子都计算所在区域内的颜色直方图,如初始化提取特征一样,然后对所有的相似度进行归一化。文中相似性使用的是巴氏距离。

  2. 重要性重采样

    根据第2阶段获得的相似度重新撒粒子,相似度高的粒子周围多撒,相似度低的地方少撒。这个过程其实可以重复几次,但为了检测速度,重采样一次也可以。

  3. 状态转移

    对上一阶段多次重采样后获得的粒子计算下一时刻的位置。

是多元高斯分布变量。

  1. 观测阶段

    i. 在出计算概率颜色直方图

    ii. 计算各个粒子和目标的巴氏距离

    iii. 更新每个粒子的权重

  2. 决策阶段

    每个粒子都能够获得一个和目标的相似度,这个相似度体现了该区域是目标的置信度,可以把所有例子使用相似度加权后的结果作为目标可能的位置。


粒子滤波更新过程

iteration step of the color-based particle filter.jpg


matlab代码实现

  1. % REFERENCE:


  2. % An adaptive color-based particle filter [J]. Image and Vision 

  3. % Computing, 21 (2003) 99-110 



  4. % note: 

  5. % the structure of sample 

  6. % {1} x,  

  7. % {2} y, 

  8. % {3} vx, 

  9. % {4} vy, 

  10. % {5} hx, 

  11. % {6} hy, 

  12. % {7} a. 

  13. % and the selected region is an ellipse. 

  14. % These functions are programmed for RGB images. 


  15. function [sample,initHist]=ACPF(image,initSample,N,targetHist,bin) 

  16. % INPUTS: 

  17. % image - current frame 

  18. % initSample - init region to be detected 

  19. % N - the numbers of candidates 

  20. % targetHist - the histgram of the target 

  21. % bins -the element represents the number of bins in each channel 

  22. % OUTPUTS: 

  23. % sample - detected region 


  24. % predefined parameters  

  25. global curFrame; % current frame 

  26. global velocityTurb; % the turbulence of the velocity 

  27. global scaleTurb; % the turbulence of the scale 

  28. global bins; % the element represents the number of bins in each channel 

  29. global deltaT; % the time margin of consecutive frames 

  30. global SIGMA2; % the variance of the Gaussian specifing the weight in function: observe 

  31. global shiftTurb; 


  32. curFrame=image; 

  33. velocityTurb=4; 

  34. scaleTurb=4; 

  35. shiftTurb=40; 

  36. bins=bin; 

  37. deltaT=0.05; 

  38. SIGMA2=0.02; % 2*sigma^2 

  39. tolerance=initSample{3}*deltaT+scaleTurb; 

  40. A=eye(7); 

  41. beta=0.9; % the similarity ratio between new histgram and the origin histgram 

  42. alpha=0.1; % the learning factor of object histgram 


  43. [initHist,sampleSet,weight]=initialization(initSample,N); 


  44. tempHist=sqrt(initHist.*targetHist); 

  45. rho=sum(tempHist,1); 

  46. PIE=exp(-(1-rho)/SIGMA2); 

  47. fprintf(‘similarity:%4f\n‘,PIE); 

  48. if PIE>beta 

  49. initHist=alpha*initHist+(1-alpha)*targetHist; 

  50. else 

  51. initHist=targetHist; 

  52. end 


  53. MAXITER=2; 

  54. iter=0; 

  55. oldsample=initSample; 

  56. while iter<MAXITER 

  57. sampleSet=reselect(sampleSet,weight); 

  58. sampleSet=propagate(sampleSet,A); 

  59. weight=observe(sampleSet,initHist); 

  60. sample=estimate(sampleSet,weight); 

  61. if different(sample,oldsample)<tolerance 

  62. break; 

  63. end 

  64. oldsample=sample; 

  65. iter=iter+1; 

  66. end 

  67. % draw the scatter dots ------------------------ 

  68. for i=1:N 

  69. tempSample=sampleSet{i}; 

  70. plot(tempSample{1},tempSample{2},‘o‘,‘MarkerSize‘,5,‘MarkerFaceColor‘,‘g‘); 

  71. hold on 

  72. end 

  73. plot(sample{1},sample{2},‘o‘,‘MarkerSize‘,5,‘MarkerFaceColor‘,‘r‘); 

  74. hold on 

  75. hold off 

  76. % ------------------------------------------------- 

  77. end 


  78. function err=different(sample1,sample2) 

  79. % calculate the difference between sample1 and sample2 

  80. err=0; 

  81. for i=1:7 

  82. err=err+abs(sample1{i}-sample2{i}); 

  83. end 

  84. end 


  85. function [initHist, sampleSet,weight]=initialization(initSample,N) 

  86. % Initializing the target in each frame at the beginning of 

  87. % tracking process. 

  88. % INPUTS: 

  89. % initSample -the sample which will be tracked in current frame 

  90. % N -the length of the sampleSets 

  91. % channel, respectively. 

  92. % OUTPUTS: 

  93. % initHist -the histgram of the target model 

  94. % sampleSet -the set of candidate samples 

  95. % weight -the initial weight of each sample in the sampleSet  

  96. global velocityTurb; 

  97. global scaleTurb; 

  98. global shiftTurb; 


  99. sampleSet=cell(N,1); 

  100. weight=zeros(N,1); 

  101. numSamples=0; % the number of initialized samples 

  102. while numSamples<N 

  103. randoms=randn(7,1); 

  104. sampleTemp{1}=round(initSample{1}+randoms(1)*shiftTurb); 

  105. sampleTemp{2}=round(initSample{2}+randoms(2)*shiftTurb); 

  106. sampleTemp{3}=initSample{3}+randoms(3)*velocityTurb; 

  107. sampleTemp{4}=initSample{4}+randoms(4)*velocityTurb; 

  108. sampleTemp{5}=round(initSample{5}+randoms(5)*scaleTurb); 

  109. sampleTemp{6}=round(initSample{6}+randoms(6)*scaleTurb); 

  110. sampleTemp{7}=scaleTurb; 

  111. if isValidate(sampleTemp)==1 

  112. numSamples=numSamples+1; 

  113. sampleSet{numSamples}=sampleTemp; 

  114. weight(numSamples)=1/N; 

  115. end 

  116. end 

  117. initHist=calColorHist(initSample); 


  118. end 


  119. function colorHist=calColorHist(sample) 

  120. % calculating the color histgram of the region selected by the sample  

  121. % note: 

  122. % the weight function if r<1 then k(r)=1-r^2 else k(r)=0 

  123. global curFrame; 

  124. global bins; 

  125. x=sample{1}-sample{5}; 

  126. y=sample{2}-sample{6}; 

  127. region=curFrame(y:y+2*sample{6},x:x+2*sample{5},:); 

  128. [m,n,~]=size(region); 

  129. tempBins=zeros(bins); 

  130. margin=1.1 ./bins; 

  131. for i=1:m 

  132. for j=1:n 

  133. r=double(region(i,j,1)); 

  134. g=double(region(i,j,2)); 

  135. b=double(region(i,j,3)); 

  136. tempxy=(i-double(sample{6}))^2/(double(sample{6}))^2+1.0*(j-double(sample{5}))^2/(double(sample{5}))^2; 

  137. if tempxy<=1 

  138. tempBins(fix(r/margin(1)+1), fix(g/margin(2)+1), fix(b/margin(3)+1))=... 

  139. tempBins(fix(r/margin(1)+1), fix(g/margin(2)+1), fix(b/margin(3)+1))+... 

  140. 1-tempxy;  

  141. end 

  142. end 

  143. end 

  144. colorHist=tempBins(:); 

  145. colorHist=colorHist./sum(colorHist,1); 

  146. end 


  147. function sampleSet=reselect(sampleSet,weight) 

  148. % reselect process. 

  149. % new samples are selected according the corresponding weight 


  150. % following the steps in the referred paper. 

  151. N=size(weight,1); 

  152. cumulativeW=zeros(N,1); 

  153. cumulativeW(1)=weight(1); 

  154. % calculate the normalized cumulative probabilities 

  155. for i=2:N 

  156. cumulativeW(i)=cumulativeW(i-1)+weight(i); 

  157. end 

  158. cumulativeW=cumulativeW./cumulativeW(N); 

  159. index=zeros(N,1); 

  160. for i=1:N 

  161. % generate a uniformly distributed random number r belong [0,1] 

  162. r=rand(1); 

  163. [~,ind]=find(cumulativeW‘>=r); 

  164. if isempty(ind) 

  165. ind=N; 

  166. end 

  167. index(i)=ind(1); 

  168. end 

  169. tempSampleSet=cell(N,1); 

  170. for i=1:N 

  171. tempSampleSet{i}=sampleSet{index(i)}; 

  172. end 

  173. sampleSet=tempSampleSet; 

  174. end 


  175. function sampleSet=propagate(sampleSet, A ) 

  176. global deltaT; 

  177. global velocityTurb; 

  178. global scaleTurb; 

  179. global shiftTurb; 


  180. MINWIDTH=10; 

  181. MINHEIGHT=15; 

  182. N=length(sampleSet); 

  183. numSamples=0; 

  184. while numSamples<N 

  185. tempSample=sampleSet{numSamples+1}; 

  186. % convernient for expand to high order model A 

  187. tempVector=zeros(7,1); 

  188. for j=1:7 

  189. tempVector(j)=tempSample{j}; 

  190. end 

  191. tempVector=A*tempVector; 

  192. randoms=0.7*randn(7,1); 

  193. tempSample{1}=round(tempVector(1)+deltaT*tempSample{3}+randoms(1)*shiftTurb); 

  194. tempSample{2}=round(tempVector(2)+deltaT*tempSample{4}+randoms(2)*shiftTurb); 

  195. tempSample{3}=tempVector(3)+randoms(3)*velocityTurb; 

  196. tempSample{4}=tempVector(4)+randoms(4)*velocityTurb; 

  197. tempSample{5}=max(round(tempVector(5)+randoms(5)*scaleTurb),MINWIDTH); 

  198. tempSample{6}=max(round(tempVector(6)+randoms(6)*scaleTurb),MINHEIGHT); 

  199. tempSample{7}=scaleTurb; 

  200. if isValidate(tempSample)==1 

  201. numSamples=numSamples+1; 

  202. sampleSet{numSamples}=tempSample; 

  203. end 

  204. end 

  205. end 


  206. function weight=observe(sampleSet,colorHist) 

  207. % calculate the color distribution of each sample in sampleSet 

  208. % return the weight 

  209. global SIGMA2; 

  210. N=length(sampleSet); 

  211. weight=zeros(N,1); 

  212. for i=1:N 

  213. sampleHist=calColorHist(sampleSet{i}); 

  214. tempHist=sqrt(sampleHist.*colorHist); 

  215. rho=sum(tempHist,1);% Bhattacharyya cofficient 

  216. weight(i)=exp(-(1-rho)/SIGMA2); 

  217. end 

  218. weight=weight./sum(weight,1); 

  219. end 


  220. function sample=estimate(sampleSet,weight) 

  221. % estimate the mean state of the set 

  222. N=length(sampleSet); 

  223. sample=cell(7,1); 

  224. for i=1:7 

  225. sample{i}=0; 

  226. for j=1:N 

  227. tempSample=sampleSet{j}; 

  228. sample{i}=sample{i}+weight(j)*tempSample{i}; 

  229. end 

  230. end 

  231. sample{1}=round(sample{1}); 

  232. sample{2}=round(sample{2}); 

  233. sample{5}=round(sample{5}); 

  234. sample{6}=round(sample{6}); 

  235. end 


  236. function validate=isValidate(sample) 

  237. % change the validation of the sample 

  238. % if the coordinate of the corner exceed the image edge,then the sample is not rightful 

  239. global curFrame; 

  240. [m,n,~]=size(curFrame); 

  241. x=sample{1}; 

  242. y=sample{2}; 

  243. hx=sample{5}; 

  244. hy=sample{6}; 

  245. validate=0; %false 

  246. if fix(x-hx-0.5)>=1 && ceil(x+hx+0.5)<=n && fix(y-hy-0.5)>=1 && ceil(y+hy+0.5)<=m 

  247. validate=1; 

  248. end 


  249. end 



参考文献

时间: 2024-11-05 15:19:09

基于粒子滤波的目标追踪的相关文章

多尺度压缩跟踪_基于粒子滤波的应用

Tracking-by-detection的思想用discriminative外观模型来在线训练和更新分类器,对于采样的样本在分类器上获得的最大值标定为新目标.压缩跟踪(CT)是压缩域中的一种特征提取方法,然而其缺点是:1 使用固定的跟踪框来检测样本 2 采样半径固定,当运动机动性较大,采样不准确 3 学习因子固定 多尺度压缩跟踪讲CT与粒子滤波(PF:自举粒子滤波--bootstrap filter)结合.粒子滤波在非高斯.非线性贝叶斯模型的应用上较为突出,基于PF的跟踪通常使用轮廓(cont

基于粒子滤波器的目标跟踪算法及实现

代码实现: 运行方式:按P停止,在前景窗口鼠标点击目标,会自动生成外接矩形,再次按P,对该选定目标进行跟踪. [cpp] view plaincopy // TwoLevel.cpp : 定义控制台应用程序的入口点. // /************************************************************************/ /*参考文献real-time Multiple Objects Tracking with Occlusion Handli

基于粒子滤波的物体跟踪

先上图: Rob Hess(http://web.engr.oregonstate.edu/~hess/)实现的这个粒子滤波. 从代码入手,一下子就明白了粒子滤波的原理. 根据维基百科上对粒子滤波的介绍(http://en.wikipedia.org/wiki/Particle_filter),粒子滤波其实有很多变种,Rob Hess实现的这种应该是最基本的一种,Sampling Importance Resampling (SIR),根据重要性重采样. 算法原理的粗浅理解: 1)初始化阶段-提

目标跟踪之粒子滤波---Opencv实现粒子滤波算法

目标跟踪学习笔记_2(particle filter初探1) 目标跟踪学习笔记_3(particle filter初探2) 前面2篇博客已经提到当粒子数增加时会内存报错,后面又仔细查了下程序,是代码方面的问题.所以本次的代码与前几次改变比较小.当然这些code基本也是参考网上的.代码写得很不规范,时间不够,等以后有机会将其优化并整理成类的形式.)              Opencv实现粒子滤波算法            摘要 本文通过opencv实现了一种目标跟踪算法——粒子滤波算法,算法的

论文笔记:目标追踪-CVPR2014-Adaptive Color Attributes for Real-time Visual Tracking

基于自适应颜色属性的目标追踪 Adaptive Color Attributes for Real-Time Visual Tracking 基于自适应颜色属性的实时视觉追踪 3月讲的第一篇论文,个人理解,存在非常多问题,欢迎交流! 这是CVPR2014年的文章. 名字翻译为基于自适应选择颜色属性的实时视觉跟踪.首先理解什么是Adaptive color attributes,文章中colorattributes把颜色分为11类,就是将RGB三种颜色细化为黑.蓝.棕.灰.绿.橙.粉.紫.红.白和

【计算机视觉】粒子滤波跟踪

粒子滤波步骤 1.初始化随机选取N个点,权重统一赋值1/N 2.选取目标特征,颜色直方图等等,用于获取先验概率密度,对比相似度 3.确定状态转移矩阵,用于预测下一帧目标位置 循环开始 4.根据状态转移矩阵,对每个粒子,预测目标新位置 5.获得系统观测值,计算观测位置处特征 6.计算每个预测位置处特征,与观测处位置特征对比,相似度高的赋予较大的权重,反之,赋予较小的权重 7.对粒子加权获取当前的目标最佳位置 8.粒子重采样 循环结束 上面是我自己的理解,有些问题仍然不明白: 1.都有观测值了还修正

粒子滤波终结版

现实案例:美式橄榄球比赛画面的一段,在屏幕上指点一个区域比如计算颜色特征或空间轮廓特征等等,然后跟踪框跟踪目标 粒子滤波算法思想源于蒙特卡洛思想,以事件出现的频率代替该事件的概率,在粒子滤波算法中,凡是用到概率的地方都用离散化采样,通过大量的采样分布来近似表示,此法优点是可以处理任意形式的概率.我们的目的就是让预测粒子接近真实状态. 1)初始化阶段-提取跟踪目标特征 该阶段要人工指定跟踪目标,程序计算跟踪目标的特征,比如可以采用目标的颜色特征.具体到Rob Hess的代码,开始时需要人工用鼠标拖

粒子滤波概述

粒子滤波器是贝叶斯滤波器的一种非参数执行情况,且经常用于估计一个动态系统的状态.粒子滤波器的关键思想是采用一套假设(即粒子)来表示后验概率,其中每一个假设代表了这个系统可能存在的一种潜在状态.状态假设表示为一个有 \( N \) 个加权随机样本的集合 \(S \) : \( S=\left \{ < s^{[i]},w^{[i]} > |i=1,2,...,N \right \} \) 式中: \( s^{[i]}\)是第\( i \)个样本的状态向量:\( w^{[i]}\)是第\( i \

粒子滤波

跟着博主http://blog.csdn.net/heyijia0327/article/details/40899819一起学习 尽管利用高斯逼近能有效解决许多滤波问题,但当滤波分布为多模型或某些状态为离散时,高斯逼近将不再适用.在这种情况下,可选择基于序贯重要性重采样的粒子滤波,该方法通过蒙特卡洛逼近得到贝叶斯滤波方程的解. 在学习过程中,不好理解的地方,比如:理论推导过程中那么多概率公式,概率怎么和系统的状态变量对应上的?状态粒子xk是怎么一步步采样出来的,为什么程序里面都是直接用状态方程