我正在跟踪计算机视觉中的人。我有观察结果(blob作为背景扣除后blob检测的输出),我想推断产生这些观察结果的对象。
我遇到了一些卡尔曼滤波器代码。这对我来说很清楚,但我的问题是多目标跟踪:我的问题是有时观察结果不完整/嘈杂。让我更好地解释一下 - 在一个有明确观察的测试中,每个人都有1个blob。卡尔曼滤波器可以帮助我将人的嘈杂路径平滑成平滑的曲线。但是,这不是我的问题;问题是,有时blob检测并不完美,我有1个人的2个blob(例如,如果我想跟踪的人穿着与背景相同颜色的T恤)或有时我有2个blob for 2人(例如,如果两个人自己拥抱或彼此太近)。
我搜索过一些理论,我发现很多论文都是用粒子滤波器来解决物体跟踪问题。所以我研究了贝叶斯滤波器,蒙特卡罗方法,重要性抽样,它有点清晰(我没有关于理解所有事物的概率的数学知识,但这个想法很清楚)。
无论如何,我还不明白粒子滤波器如何帮助我检测2个blob对应1个对象或1个blob对应2个对象的情况。
有人可以帮助理解这个问题吗?
答案 0 :(得分:7)
嗯,首先,OpenCV VideoSurveillance项目是开始处理问题的好方法。
它执行检测响应的数据关联,就像你说的那样。它也通过一种简单的机制处理误报(如你所说,2个blob到1个对象)(初始化基于帧阈值和删除) 。正如你所提到的,另一个问题是,对应于2个对象的1个blob通常称为遮挡(使用VideoSurveillance项目中的术语“碰撞”,但现在它已经过时了)。 VideoSurveillance使用基于3D颜色直方图建模的粒子滤镜实现来解决这种情况。
简单解释:如何根据外观(他们的衣服)区分两个不同的目标?您可以存储它们的颜色直方图,并在以后的帧中使用它,对吗?但是,你如何进行搜索?您可以在下一帧中搜索所有可能的质心,或者使用假设分散在您认为对象所在区域周围的200个随机点。这200个点是粒子。他们是如何工作的?他们比较他们关注的区域并产生物体存在的概率。它们越接近,可能性就越大。最后,您总结了所有可能性并找到了“均值”质心。
简单来说,每个目标的服装都是在概率函数内建模的,并且由于粒子滤波的想法,可以实现接近实时的计算。
最后,卡尔曼滤波器是一个预测器,它只使用运动数据帮助跟踪器。 它会“过滤”极端运动行为,以防粒子滤波器结果比应有的更疯狂。 VideoSurveillance也包括这一点。它与外观互补,当使用两者时,跟踪器更加复杂。
修改:如何对多目标跟踪有用? 假设我们有一个简单的数据关联跟踪器,假设两个对象即将“碰撞”。跟踪器工作正常,直到对象合并为止。在“合并”期间,跟踪器只能看到一个对象。另一个丢了。过了一会儿,他们分开了,跟踪器将旧物体检测为新物体!我们该如何解决这个问题?让我们重新开始粒子过滤和外观建模:
在合并之前,我们有两个物体朝向彼此移动。对象是独立的,跟踪器可以清楚地看到它们。在此期间,外观建模器(一种“记住”对象如何看起来的机制)正在学习这两个对象的外观。当然,随着框架的流逝,两个物体都会略微改变它们的外观。这就是为什么,建模者有一个“学习率”,让他随着时间的推移调整他的“记忆”。
在合并期间,这次我们将跟踪器设置得更耐心,并且不像以前那样容易杀死第二个对象。跟踪器允许两个对象都处于活动状态。像以前一样成功地跟踪非遮挡对象,而另一个对象边界框尝试再次重新定位它的目标。如果我们幸运*,在很短的时间之后,被遮挡的(隐藏的)物体将重新出现(分裂),并且由于粒子,边界框将被吸引到那里。
*如上所述,遮挡目标的边界框仍然由建模者建模。如果被遮挡的人隐藏得太长,建模者将忘记旧对象并了解遮挡区域前面的内容(即非遮挡对象)或将像孤儿框一样四处游荡(这称为漂移)。 VideoSurveillance没有相应的机制。一个简单的解决方案可以是在遮挡期间停止建模器适应。怎么样?当两个边界框重叠时。
答案 1 :(得分:3)
卡尔曼滤波器或粒子滤波器无法处理数据关联问题(多个跟踪问题,其中几个检测必须与多个轨道匹配)。
您需要的是联合概率数据关联过滤器(JPDAF),它将每个检测与一个软轨道相关联(一个检测属于X%到第一个轨道,Y%到第二个轨道......)。
基础跟踪算法可以是粒子滤波器或卡尔曼滤波器。
看看C#中的JPDAF实现 - 为Kalman和粒子滤波器实现。 此时工作样本用于卡尔曼和粒子滤波器,JPDAF将在稍后出现 - 但它已经实现并准备就绪。
Accord.NET Extensions库: https://github.com/dajuric/accord-net-extensions
答案 2 :(得分:2)
我认为关键字是“碎片化”。一个示例论文
http://people.csail.mit.edu/cielbleu/pubs/BoseEtalCVPR07Multiclass.pdf
答案 3 :(得分:-2)
卡尔曼滤波器是一种背景减法器方法。它无法处理数据关联,只能处理高斯噪声。
最后,我重新实现了由对象检测激活的基于直方图的粒子滤波器。
如果有人对此感兴趣,请发表评论!