行人计数算法

信息处理 计算机视觉 opencv 物体识别
2021-12-29 07:50:45

目前我正在开发一个行人计数器项目(在 Linux 上使用 OpenCV+QT)。我对这种方法的想法是:

  1. 捕捉帧
  2. 做背景减法
  3. 清晰的噪音(侵蚀,扩张)
  4. 查找 blob (cvBlobslib) - 前景对象
  5. 对于每个 blob,设置 ROI 并在这些 blob 中搜索行人(带有 detectMultiScale 的 LBP)(以获得更好的性能)
  6. 对于每个找到的行人做一个嵌套的上半身搜索(不确定)(更好的可靠性)
  7. 如果在连续帧(可能是 3-4 帧)上发现相同的行人 - 将该区域添加到 camshift 和跟踪 - 标记为行人
  8. 从下一帧的斑点检测中排除 camshift 跟踪区域
  9. 如果行人过线增量号

我想检查我是否在正确的轨道上。你对如何改进我的方法有什么建议吗?如果有人从事类似的工作,我将不胜感激有关此问题的任何有用的提示、资源(和批评)。

2个回答

我认为您要问的是行人算法的可行性。

此类问题有两种通用策略:

  1. (自下而上)将其视为一个纯粹的检测问题,在每一帧中,您只检测到行人。一旦你检测到它们,a) 计算它们在一帧中的数量是相当容易的;b) 在连续帧中跟踪它们中的任何一个也很容易。因此,您解决了所有问题。

  2. (从上到下)将其视为动作识别问题,您可以根据其动作检测连续帧中的 ROI 是否为行人。一旦你解决了这个问题,你就可以同时解决检测和跟踪问题。

您的启发式算法属于第一类。我不想劝阻你,但你可能会错过如何检测行人的关键点. 因为真实数据可能比你想象的更复杂。例如,如果这是一个地铁摄像机,它的帧可能充满了行人,因此移除背景或检测斑点根本没有帮助。在这种情况下,使用人脸检测和人脸识别算法来解决问题可能更合理,因为如果你找到一张脸,你就会找到一个行人。另一方面,根据您对行人的定义,并非每个出现在画面中的人都应该被视为行人。在这种情况下,使用动作识别算法(第二类)可能是合理的,您可以根据他或她的行为明确定义行人。

根据我的经验,这里有一些提示:

  1. 坚持你所知道的和你可以轻松掌握的。不要把时间花在花哨但需要许多你没有的背景上。相信我,所有这些算法在某些情况下会很好,但在另一些情况下会很差。因此,第一件事就是让某件事情发挥作用,不管它是好是坏。

  2. 更多地了解您的数据,然后确定您的方法。在许多情况下,对问题的一般描述是不够的。

  3. 如果你想展示你的想法,最好使用 MATLAB 并构建一个原型。

我可以看到这种方法存在许多可能的问题。我是根据自己的经验来用一种非常相似的方法改进行人计数系统的,所以我并不是要气馁。相反,我想提醒您,为了构建一个准确而强大的系统,您可能必须克服这些障碍。

首先,背景减法假定感兴趣的对象将始终在移动,而您对计数不感兴趣的对象将保持完全静止。果然,在您的场景中可能就是这种情况,但这仍然是一个非常有限的假设。我还发现背景减法对照明的变化非常敏感(我同意几何)。

即使你认为你的环境得到了很好的控制,也要小心不要假设一个 blob = 一个人。与人相对应的斑点经常因为没有移动或太小而未被检测到,因此它们被侵蚀或某些阈值标准删除(相信我,你不想进入“调整阈值,直到一切正常”陷阱。它不起作用;))。一个blob也可能对应于两个人一起走,或者一个人携带某种行李。或者是一条狗。所以不要对 blob 做出聪明的假设。

幸运的是,由于您确实提到您正在使用 LBP 进行人员检测,我认为您在没有犯上述段落中的错误的正确轨道上。不过,我不能特别评论 LBP 的有效性。我还读到 HOG(梯度直方图)是人体检测中最先进的方法,请参阅Histograms of Oriented Gradients for Human Detection

我最后的抱怨与使用Camshift有关。它基于颜色直方图,因此,它本身在跟踪易于通过颜色区分的单个对象时效果很好,只要跟踪窗口足够大并且没有遮挡或突然变化。但是,一旦您必须跟踪可能具有非常相似的颜色描述并且彼此非常接近的多个目标您就不能没有一种算法,该算法以某种方式允许您维持多个假设。这可能是粒子过滤器或框架,例如 MCMCDA(Markov Chain Monte Carlo Data Association,见Markov Chain Monte Carlo Data Association for Multiple-Target Tracking)。我在跟踪多个对象时单独使用 Meanshift 的经验是跟踪不应该发生的一切:丢失跟踪、混淆目标、固定在后台等。阅读一些关于多个对象跟踪和数据关联问题的信息,这可能是在毕竟是计算多人的核心(我说“可能是”,因为你的目标是计数而不是跟踪,所以我不会完全放弃一些聪明的方法的可能性,即不跟踪就计数......)

我的最后一条建议是:对于给定的方法,你能做的只有这么多,而且你需要更高级的东西来获得更好的性能(所以我在这方面不同意 user36624)。这可能意味着用更强大的东西改变你的算法,或者完全改变架构。当然,您必须知道哪些花哨的东西对您真正有用。有些出版物试图以有原则的方式解决问题,而其他出版物只是为给定的数据集提出一种算法,并期望您训练一个并不真正适合手头问题的分类器,同时要求您也调整一些阈值。人数统计正在进行的研究,所以不要指望事情会一帆风顺。一定要努力学习一些超出你能力范围的东西,然后一遍又一遍地做……

我承认我没有提供任何解决方案,而只是指出了您方法中的缺陷(所有这些都来自我自己的经验)。为了获得灵感,我建议您阅读一些最近的研究,例如实时监控视频中的稳定多目标跟踪祝你好运!