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


捕获帧
进行背景减法
清除噪声(腐蚀,膨胀)
查找斑点(cvBlobslib)-前景对象
对于每个斑点,设置ROI并在这些斑点中搜索行人(具有detectMultiScale的LBP)(以获得更好的性能)
对于每个发现的行人,请执行嵌套上身搜索(不确定)(更好的可靠性)
如果在连续的帧(可能是3-4帧)上发现相同的行人-将该区域添加到camshift和跟踪中-标记为步行者
从blob检测中排除camshift跟踪区域以用于下一帧
一名行人越过线的增量编号

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

评论

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

您的方法听起来合理,您是否在寻找相关的学术文献?这应该使您对最新技术有所了解。背景减法可能很棘手,环境影响以及阴影可能是一个问题。

#1 楼

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

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

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

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

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

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

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

#2 楼

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

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


(自下而上)将其视为纯检测问题,其中/>每帧您只能检测到行人。一旦检测到它们,a)
在一个框架中计数它们的数量就很容易了; b)在连续的帧中跟踪它们中的任何
也很容易。因此,您可以解决所有问题。
(自上而下)将其视为动作识别问题,在该问题中,您可以根据连续动作来检测连续帧中的ROI是否为行人。解决此问题后,即可同时解决检测和跟踪问题。

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

根据我的经验,有一些技巧:


坚持您所知道的以及可以轻松取用的内容。不要将您的时间花在花哨的事情上,但是需要许多您没有的背景。相信我,所有这些算法在某些情况下会很好,但在另一些情况下会不好。因此,首先要做的是
不管它有多好或坏,都可以正常工作。
进一步了解您的数据,然后确定您的方法。在许多情况下,对问题的一般描述是不够的。
如果要演示您的想法,最好使用MATLAB并构建原型。