行人计数算法


12

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

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

我想检查一下我是否走对了。您对如何改善我的方法有什么建议吗?如果有人从事类似的工作,我将不胜感激有关此问题的任何有用技巧,资源(和批评)。


5
您可能想改一下您的问题,而忽略OpenCV部分。将其更像是概念性问题(行人计数和跟踪算法)。
Geerten 2012年

2
您的方法听起来合理,您是否在寻找相关的学术文献?这应该使您对最新技术有所了解。背景扣除可能比较棘手,环境影响以及阴影可能会成为问题。
geometrikal

Answers:


8

我看到这种方法可能会出现很多问题。我从自己的经验谈起,以一种非常相似的方式改进行人计数系统,因此我并不表示灰心。相反,我想警告您可能需要克服的障碍,以便构建准确而强大的系统。

首先,背景扣除假设感兴趣的对象将始终在移动,而您不希望计数的对象将保持完全静止。确实,您的情况可能是这种情况,但这仍然是一个非常有限的假设。我还发现背景扣除对光照的变化非常敏感(我同意几何学)。

警惕假设一个斑点=一个人,即使您认为您的环境得到了很好的控制。经常发生这样的情况:与人相对应的斑点因为它们不动或太小而未被发现,因此它们被腐蚀或某些阈值标准删除了(相信我,您不想进入“调整阈值,直到一切正常为止。“陷阱。它不起作用;))。也可能发生的情况是,一个斑点对应于两个人一起散步,或者一个人携带某种行李。或狗。因此,请勿对斑点做出明智的假设。

幸运的是,由于您确实提到您正在使用LBP进行人员检测,因此我认为您在正确的道路上不会犯上述段落中的错误。不过,我不能特别评论LBP的有效性。我还阅读了HOG(梯度直方图)是人们检测的最新方法,请参阅用于人类检测的定向梯度直方图

我最后的抱怨与使用Camshift有关。它基于颜色直方图,因此,只要跟踪窗口足够大且没有遮挡或突变,它就可以很好地跟踪容易按颜色区分的单个对象。但是,一旦您必须跟踪可能具有非常相似的颜色描述并且彼此非常接近的多个目标,您就无法没有一种算法,该算法以某种方式允许您维持多个假设。这可能是粒子过滤器,也可能是诸如MCMCDA(马尔可夫链蒙特卡洛数据协会,请参阅马尔可夫链蒙特卡洛数据协会的多目标跟踪)之类的框架。)。我在跟踪多个对象时单独使用Meanshift的经验是跟踪不应该发生的一切:丢失跟踪,使目标混乱,在后台固定等。毕竟是数多个人的心脏(我说“可能是”,因为您的目标是数不追踪,所以我不会完全舍弃某些聪明的方法而不计较的可能性……)

我的最后一条建议是:使用一种给定的方法只能做很多事情,并且您需要更高级的工具才能获得更好的性能(因此在这方面我不同意user36624)。这可能意味着通过更强大的功能来更改算法的一部分,或者完全更改体系结构。当然,您必须知道哪种花哨的东西对您真正有用。有一些出版物试图以有原则的方式解决问题,而另一些出版物只是针对给定的数据集提出了一种算法,并期望您训练一个并不真正适合当前问题的分类器,同时要求您还要调整一些阈值。人计数正在进行的研究,所以不要指望事情会轻松进行。尽力去学习一些超出您能力范围的事情,然后一次又一次地做...

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


9

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

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

  1. (从下到上)将其视为纯粹的检测问题,其中在每个帧中仅检测到行人。一旦检测到它们,a)在一个框架中计数它们的数量非常容易;b)在连续帧中跟踪它们中的任何一个也很容易。因此,您解决了所有问题。

  2. (从上到下)将其视为动作识别问题,在该问题中,您可以根据连续动作来检测连续帧中的ROI是否为行人。解决此问题后,即可同时解决检测和跟踪问题。

您的启发式算法属于第一类。我不想阻止您,但是您可能会错过如何检测行人的关键点。因为实际数据可能比您想象的要复杂。例如,如果这是一台地铁摄像机,那么其帧可能充满了行人,因此消除背景或检测斑点完全没有帮助。在这种情况下,使用面部检测和面部识别算法来解决问题可能更合理,因为如果您找到面部,就会找到行人。另一方面,根据您对行人的定义,也许并非所有出现在框架中的人都应被视为行人,这可能是事实。在这种情况下,使用动作识别算法(第二类)可能是合理的,您可以在其中基于行人的行为明确定义行人。

以下是一些基于我的经验的提示:

  1. 坚持知道的内容以及可以轻松掌握的内容。不要将时间花在花哨的事情上,但需要许多您没有的背景。相信我,所有这些算法在某些情况下将是好的,但在另一些情况下将是不好的。因此,第一件事就是使某件事情行之有效,无论它的好坏。

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

  3. 如果您想证明自己的想法,最好使用MATLAB并构建一个原型。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.