【问题标题】:Particle filter for multi object tracking用于多目标跟踪的粒子滤波器
【发布时间】:2013-03-30 04:52:56
【问题描述】:

我正在研究计算机视觉领域的人员跟踪。我有观察结果(斑点作为背景减除后斑点检测的输出),我想推断产生这些观察结果的对象。

我遇到了一些卡尔曼滤波器代码。我很清楚,但我的问题是多对象跟踪:我的问题是有时观察结果不完整/嘈杂。让我更好地解释一下 - 在一个有明确观察的测试中,我每个人都有 1 个 blob。卡尔曼滤波器可以帮助我将人的嘈杂路径平滑成平滑曲线。但是,这不是我的问题;问题是有时斑点检测并不完美,我有 2 个斑点用于 1 个人(例如,如果我要跟踪的人穿着与背景颜色相同的 T 恤),或者有时我有 1 个斑点用于 2人(例如,如果 2 个人拥抱自己或彼此靠得太近)。

我搜索了一些理论,发现很多论文都在用粒子滤波器解决目标跟踪问题。所以我研究了贝叶斯滤波器,蒙特卡洛方法,重要性采样,它有点清楚(我没有概率的数学知识来理解一切,但想法很清楚)。

无论如何,我仍然不明白粒子过滤器如何帮助我检测 2 个 blob 对应于 1 个对象或 1 个 blob 对应于 2 个对象的情况。

有人可以帮助理解这个问题吗?

【问题讨论】:

    标签: opencv computer-vision tracking particle-filter


    【解决方案1】:

    嗯,首先,OpenCV VideoSurveillance 项目是开始处理您的问题的好方法。

    它像您所说的那样对检测响应进行数据关联。此外,它通过简单的机制处理误报(2 blob 到 1 个对象)(初始化也基于帧阈值和删除) .另一个问题,正如您所提到的,大约 1 个 blob 对应于 2 个对象通常称为遮挡(在 VideoSurveillance 项目中使用了术语“碰撞”,但现在已经过时了)。 VideoSurveillance 正在使用基于 3D 颜色直方图建模的粒子过滤器实现来解决这种情况。

    简单解释:你如何根据他们的外表(他们的衣服)区分两个不同的目标?您可以存储他们的颜色直方图并在以后的帧中使用它,对吗?但是,您如何进行搜索?您可以在下一帧中搜索所有可能的质心,或者使用散布在您认为对象所在区域周围的 200 个随机点。这 200 个点就是粒子。它们是如何工作的?他们比较他们所关注的区域并产生物体在那里的概率。距离越近,可能性就越大。最后,您总结所有可能性并找到“平均”质心。

    简单来说,就是将每个目标的服装建模在概率函数内部,借助粒子滤波的思想,实现近乎实时的计算。

    最后,卡尔曼滤波器是一个预测器,它仅使用运动数据帮助跟踪器。 它“过滤”极端运动行为,以防粒子过滤器结果变得比它应该的更疯狂。 VideoSurveillance 也包括这一点。它与外观相得益彰,并且当同时使用两者时,跟踪器会更加复杂。

    编辑:它对多目标跟踪有何用处? 假设我们有一个带有数据关联的简单跟踪器,假设两个对象即将“碰撞”。跟踪器工作正常,直到对象被合并。在“合并”期间,跟踪器只看到一个对象。另一个丢失了。过了一会儿,它们分裂了,跟踪器将旧对象检测为新对象!我们怎样才能解决这个问题?这次让我们从粒子过滤和外观建模重新开始:

    • 在合并之前,我们有 2 个对象相互靠近。物体是独立的,跟踪器可以清楚地看到它们。在此期间,外观建模器(一种“记住”对象外观的机制)正在学习这两个对象的外观。当然,随着帧的推移,两个对象的外观都略有变化。这就是为什么建模者有一个“学习率”,可以让他随着时间的推移调整他的“记忆”。

    • 在合并过程中,这一次,我们将跟踪器设置得更加耐心,不要像以前那样轻易杀死第二个对象。跟踪器让两个对象都处于活动状态。未遮挡的对象像以前一样被成功跟踪,另一个对象边界框尝试再次重新定位它的目标。如果我们幸运*,在很短的时间后,被遮挡(隐藏)的对象将重新出现(分裂),并且边界框将被粒子吸引到那里。

    *如前所述,被遮挡目标的边界框仍由建模器建模。如果被遮挡的人隐藏的时间过长,建模者会忘记旧对象并了解遮挡区域前面的内容(即未遮挡的对象),或者会像孤盒一样四处游荡(这称为漂移)。 VideoSurveillance 没有这样的机制。一种简单的解决方案可能是在遮挡期间停止建模器适应。如何?当两个边界框重叠时。

    【讨论】:

    • 感谢您的回答。我非常了解粒子滤波的概念,但我仍然不明白它如何用于多目标跟踪或数据关联..
    • 好的。更清楚直方图和外观。现在我只有一个疑问。我可以用这句话解释一切:“粒子滤波器会给我一个多模态分布,分布的每个模式都是一个移动的物体”,对吧?或者:我在图像中有粒子,如果我对它们进行聚类,得到的质心就是运动的物体。对吗?
    • @William 此链接:opencv.willowgarage.com/wiki/VideoSurveillance 似乎不再起作用了。
    • opencv/samples/c/blobtrack.cpp | blobtrack_sample.cpp
    • 我也找不到提到的链接:opencv.willowgarage.com/wiki/VideoSurveillance
    【解决方案2】:

    我认为关键字是“碎片化”。示例论文

    http://people.csail.mit.edu/cielbleu/pubs/BoseEtalCVPR07Multiclass.pdf

    【讨论】:

    • 我知道那张纸,但它是一个批处理程序。无论如何它不使用粒子过滤器。无论如何,谢谢你的回答!
    【解决方案3】:

    卡尔曼滤波器或粒子滤波器无法处理数据关联问题(多个检测必须与多个轨迹匹配的多重跟踪问题)。

    您需要的是联合概率数据关联过滤器 (JPDAF),它将以软方式将每个检测与轨道相关联(一个检测属于 X % 到第一个轨道,Y % 到第二个轨道......)。

    底层跟踪算法可以是粒子滤波或卡尔曼滤波。

    看一下 C# 中的 JPDAF 实现 - 为卡尔曼和粒子滤波器实现。 此时的工作样本是用于卡尔曼和粒子滤波器,JPDAF 稍后会出现 - 但它已经实现并准备就绪。

    Accord.NET 扩展库: https://github.com/dajuric/accord-net-extensions

    【讨论】:

      【解决方案4】:

      在这种情况下,卡尔曼滤波器是一种背景减法器方法。它不能处理数据关联,只能处理高斯噪声。

      最后我重新实现了由物体检测激活的基于直方图的粒子滤波器。

      如果有人对此感兴趣,请发表评论!

      【讨论】:

      • 我对此很感兴趣
      • @nkint 你是怎么做的,你能解释一下或者分享一下吗??
      • 我没有任何代码,但在opencv中实现并不难。在github上有一些opencv+python的实现
      • @nkint 你能解释一下吗?所以我将在 c++ opencv 中实现它。我曾尝试使用卡尔曼滤波器,但我缺少逻辑。
      • @Arjun:它并不复杂,而且网上有很多教程,只是稍微动动脑筋。抱歉,我现在没时间!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      相关资源
      最近更新 更多