对象跟踪:轻松使用粒子滤波器





5.00/5 (33投票s)
SIR 粒子滤波器简要教程,附带 C# 示例
![]() |
|
![]() |
![]() |
颜色对象跟踪:每个粒子都模拟红色颜色的概率。粒子滤波器用于检测和跟踪红笔。 | 模板选择:模板的大小、角度和位置由粒子建模。粒子滤波器用于选择更可能的模板子集,从而减少匹配时间。 |
目录
引言
![]() |
目标跟踪是计算机视觉的主要任务之一。目标跟踪广泛应用于各种应用程序中,例如:视频监控、汽车跟踪(距离估计)、人员检测和跟踪等。目标跟踪器通常需要一些初始化步骤,例如初始目标位置,这可以通过手动或使用 Viola-Jones 检测器或快速模板匹配等目标检测器自动提供。跟踪存在几个主要问题:
- 遮挡
- 多目标
- 尺度、光照、外观变化
- 困难和快速的运动
- ...
尽管目标跟踪问题已经存在多年,但仍未解决,并且存在许多目标跟踪器,有专为特定目的构建的,也有通用的。
卡尔曼滤波器假设线性运动模型和高斯噪声,并且只返回一个假设(例如,被跟踪物体的可能位置)。如果运动快速且不可预测(例如,刮风天树上的叶子),卡尔曼滤波器很可能会失败。粒子滤波器返回多个假设(每个粒子代表一个假设),因此可以处理非高斯噪声并支持非线性模型。除了目标跟踪(其中状态是位置向量 (x, y))之外,状态可以是任何东西,例如模型的形状。本文将解释粒子滤波器背后的主要思想,并将重点介绍其在目标跟踪中的实际应用以及示例。
粒子滤波器 - 主要思想
粒子滤波器是一种通用函数优化算法,其中解决方案搜索空间通过粒子(采样)进行搜索。那么这意味着什么呢?在我们的例子中,每个粒子都包含测试,以确定对象在粒子所在位置的可能性。在粒子评估完成后,根据粒子的优劣分配权重。然后,通过重采样过程,好的粒子被复制,坏的粒子被移除。下一代粒子接着预测对象可能在哪里。然后对这一代进行评估,循环重复。
与卡尔曼滤波器相反,粒子滤波器可以模拟非线性物体运动,因为运动模型不需要像离散卡尔曼滤波器那样写成状态转移矩阵。此外,粒子滤波器相当容易理解,但也有一个缺点:滤波器的性能取决于粒子数量,粒子数量越多,估计就越好,但成本也越高。尽管如此,粒子滤波器在通用函数优化中被广泛使用,包括目标跟踪。
下图显示了粒子滤波器的两个主要步骤。
预测
预测是第一步,包括根据粒子权重进行粒子选择重采样,下一个状态转移(例如应用运动模型)漂移以及施加噪声扩散。
更新(修正)
在获得带噪声的测量值后,更新(校正)步骤开始。对每个粒子进行评估,并根据获得的似然更新每个粒子的权重。
现在您已经了解了基础知识,是时候进行实际示例了,但首先简要介绍一下实现。
实现
粒子滤波器实现为 IEnumerable<TParticle>
或 IList<TParticle>
的一系列扩展方法,其中 TParticle
实现 IParticle
接口。方法实现为在粒子集合(例如粒子滤波器)上定义的扩展。这种实现方式提供了
- 灵活性
- 特定部分的自定义实现
- 可扩展性
- 开发人员学习曲线短
下面的类图显示了实现概要
![]() |
类图。通用粒子滤波器的实现没有引入任何新类。相反,它将单个粒子实现为一个轻量级接口,并为 ParticleFilter 类中定义的粒子集合(例如粒子滤波器)提供扩展方法。 |
假设我们想使用恒定速度模型,并且测量模型是对象的位置(正如上图中所示)。该示例的用法如下所示
粒子
粒子实现了两个主要方法:drift
和 diffuse
。由于我们不包含任何运动模型,此方法为空。我们通过随机化当前粒子位置来扩散粒子。下面显示的代码省略了一些不重要的实现细节。
class ColorParticle: IParticle
{
public double Weight { get; set; }
public PointF Position { get; set; }
//we do not have velocity (or something else), so nothing :)
public void Drift()
{ }
public void Diffuse()
{
//randomize the position a little bit
}
...
}
初始化
最复杂的步骤是初始化,包括粒子实现(漂移和扩散)和初始化。所示的初始化过程在图像上均匀散射 1000 个粒子。
//ColorParticle is the implementation of the particle of the introductory sample
List<ColorParticle> particleFilter = new List<ColorParticle>();
particleFilter.CreateParticles(1000, //particles' count
ColorParticle.FromArray, //convert arr => position (create from array)
new ISampleableDistribution<double>[] //position range
{
new UniformContinuousDistribution(0, imgSize.Width),
new UniformContinuousDistribution(0, imgSize.Height)
});
预测
预测步骤只包含一个方法,如果没有测量值,该方法将重复执行而没有校正方法。它包括重采样、漂移和扩散方法。
private void predict()
{
particleFilter = particleFilter.Predict();
}
更新(修正)
更新(校正)方法根据其测量值更新粒子的权重。
private void update()
{
particleFilter.Update(measure);
}
private double measure(ColorParticle p)
{
//get Euclidean distance from the reference color
}
结论
本文介绍了用于目标跟踪问题的离散粒子滤波器及其在 C# 中的实现。粒子滤波器还有更多用途,因为它可作为通用优化问题,如所包含示例之一所示。
源代码和示例代码是 Accord.NET Extensions Framework 的一部分,这是一个主要用于图像处理、对象检测和跟踪的框架,所有这些都打包为流畅的扩展和简单直观的泛型,所以不要忘记看一看 :)
参考文献
[1] | Smith K. "计算机视觉精选主题 - 2D 跟踪 1/2 IJACI" 迄今为止最好的目标跟踪教程 - 本文中使用了一些幻灯片 |
[2] | Mallikarjuna Rao G. "使用粒子滤波器的视觉目标跟踪:一项调查" |
历史
- 2014年1月16日 - 第一个版本发布