【问题标题】:Counting Pedestrians Using TensorFlow's Object Detection使用 TensorFlow 的对象检测计数行人
【发布时间】:2018-03-26 04:22:00
【问题描述】:

我是机器学习领域的新手,根据我在 youtube 上看到的和在互联网上阅读的内容,我推测可以使用 tensorflow 的对象检测 API 来计算视频中的行人。

因此,我对 tensorflow 进行了一些研究,并阅读了有关如何安装 tensorflow 的文档,然后最终下载并安装了 tensorflow。使用 github 上提供的示例文件,我调整了与此处提供的 object_detection notebook 相关的代码 ->https://github.com/tensorflow/models/tree/master/research/object_detection

我对我收集的视频执行了修改后的代码,同时更改了 visual_utils.py 脚本,以便报告跨越屏幕上定义的感兴趣区域的对象数量。也就是说,我收集了人类的边界框尺寸(左、右、上、下),并计算了所有穿过定义的感兴趣区域的检测(想象视频帧上具有左右像素值的一组两条虚拟垂直线和然后将检测到的边界框的左右值与预定义的值进行比较)。然而,当我使用这个程序时,我错过了很多行人,即使他们被程序检测到了。那就是程序正确地将他们归类为人,但有时他们不符合我定义的计数标准,因此他们不被计算在内。我想知道是否有更好的方法来使用代码计算独特的行人,而不是使用我正在尝试开发的简单方法。我使用的方法是正确的吗?还有其他更好的方法吗?将不胜感激任何帮助。

请放轻松,因为我不是机器学习专家,只是一个新手。

【问题讨论】:

标签: tensorflow object-detection-api


【解决方案1】:

您正在使用经过训练的预训练模型来识别一般人。我想你是说有些人是行人,有些人不是行人,例如,站在红灯前的人是行人,但站在街道后面的花园里的人不是行人。

如果我是对的,那么您已经达到了使用此模型所能获得的限制,您可能必须自己训练一个模型来做您想做的事情。

由于您不熟悉 ML 构建自己的数据集和训练自己的模型,这听起来可能是一项艰巨的任务,因此可以肯定的是,有一个学习曲线。所以我会建议最简单的方法。也就是说,使用对象检测模型来识别人,然后训练一个新的二元分类模型(大约是最容易训练的模型)来识别特定人是否是行人(您将创建一个图像数据集和 1/0值以将它们识别为行人与否)。我建议这样做是因为布尔分类模型与您可以获得的模型一样简单,并且您可以遵循数十个教程。这是一个很好的:

https://github.com/aymericdamien/TensorFlow-Examples/blob/master/notebooks/3_NeuralNetworks/neural_network.ipynb

执行此操作时需要注意的几点:

  • 在构建数据集时,您需要一组图像,至少有几千张以及每个图像的 1/0 分类(行人或非行人)。
  • 如果您从在 imagenet 上预训练的模型开始,您将获得比从头开始训练的模型更好的结果(尽管这可能是合理的第 2 步,因为它是一项额外的任务)。特别是如果您只有几千张图像可以训练它。
  • 由于您的图像中包含多个人,因此您无法确定希望模型将哪个人分类为行人。没有一种正确的方法可以做到这一点。如果您在此人周围有一个黄色框,则网络可能会成功学习此符号。另一种有效的方法可能是通过删除图像中检测到的其他人并将该区域保留为黑色来移除它们。以目标人物为中心也可能是一种合理的做法。

我的最后一个要点说明了这个想法的一个问题,因为它是我提出的。最好的解决方案是改变目标检测网络以输出每个人的边界框,以及行人/非行人分类;或者只训练模型来识别行人,特别是首先。我提到这是更优化的,但我认为它比我的第一个建议更高级,并且需要管理更复杂的数据集。在您学习 ML 时,这可能不是您想要解决的第一件事。

【讨论】:

  • 如何修改对象检测程序以计算一系列帧中的唯一人员?我对对象检测程序的输入是视频文件而不是图像文件,我正在使用 opencv 库读取输入视频,然后将其逐帧传递给张量流。该视频以 30 帧/秒的速度大约有 350000 帧。同一个人出现在几个帧中,因此如果我每次 tensorflow 检测到一个人时都开始计数,那么我最终会多次计数同一个人,因为他出现在多个帧中。我希望我解释得当。
  • OpenCV 具有一些实时对象跟踪功能。您可能想更深入地了解 OpenCV 当前提供的功能。从头开始构建对象识别和跟踪应用程序当然是可行的,但并非易事。我认为我需要大约一年的时间才能从头开始构建类似的东西。 pyimagesearch.com/2017/09/18/…
  • 在构建这样一个模型时,我的第一个倾向是识别帧之间的两个对象是相同的还是不同的。三元组嵌入方法(人脸识别)似乎是一个合理的起点:medium.com/@ageitgey/…
  • OpenCV 确实提供了一个跟踪器,但我不确定如何设置允许我使用 OpenCv 跟踪对象同时检测/分类它是什么类型的对象的工作流。
  • 我也相信谷歌在示例文件夹中提供的对象检测脚本已经能够跨帧跟踪对象。但问题是我如何利用它来识别独特的对象。可能我需要做更多的研究。大卫,非常感谢您提出的所有好建议。
猜你喜欢
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 2019-07-20
  • 2019-10-25
  • 2021-10-05
  • 1970-01-01
相关资源
最近更新 更多