深度学习如何帮助检测单个图像中的多个对象?

数据挖掘 深度学习 卷积神经网络 物体识别
2021-09-19 08:00:37

假设图像中有两辆汽车。鉴于它可以检测图像中的单个汽车,它如何检测这些汽车?

4个回答

尽管生产系统中的许多解决方案仍然使用滑动窗口,如下面的答案所述,但计算机视觉领域正在迅速发展。该领域的最新进展包括R-CNNYOLO


当您已经训练了对象分类器时,检测图像中的对象匹配通常是通过图像块进行强力扫描的问题。

从最大的预期补丁大小开始。例如,如果您的图像是 1024 x 768,但始终是道路的远距离拍摄,您可能不希望任何汽车在图像中占用超过 80 x 80 像素。因此,您从图像的一个角落取出一个 80x80 像素块,然后询问您的分类器那个角落有汽车的可能性。然后取下一个补丁 - 可能移动 20 个像素。

重复所有可能的位置,并确定哪些补丁最有可能包含汽车。

接下来,缩小块大小(可能是 60 x 60,一次移动 15 个像素)并再次重复相同的练习。重复此操作,直到您达到目标的预期最小块大小。

最终,您将获得图像中的区域列表,每个区域都有可能包含汽车。

具有高概率的重叠块很可能是同一辆车,因此逻辑需要具有合并块的阈值 - 通常采用概率得分最高的重叠区域 - 并声明该区域只有一辆车。

与 ML 方法一样,您需要尝试正确的元参数——在这种情况下,块大小、步长和合并/分割区域的规则——以获得最准确的结果。

我想通过分享我的应用程序来添加@Neil_Slater 的答案。

在我的应用程序中,我想训练一个可以自动从象棋书中加载棋子位置的模型,如下所示:

在此处输入图像描述

  1. 在我做任何事情之前,我确保我有一个可以准确检测棋子的模型。

在此处输入图像描述

这不是一个难题,因为它就像训练 MINST 数字一样。我收集了足够多的样本,随机给这些样本添加了一些噪音。我的模型是 2 层卷积深度学习。

  1. 因为棋盘总是一个正方形。我使用 OpenCV 中可用的平方检测来给我一个候选人列表。我会扔掉任何太小、太大或不能被 64 整除的正方形(因为有 64 个正方形)。

  2. 接下来,我将图像裁剪为如下所示:

在此处输入图像描述

现在,我有另一个多层卷积网络来检查棋盘中的每个方块。步长是图像的维度除以 8(因为每个维度有八个正方形)。补丁大小与步长相同。

我的管道工作正常,因为我能够组合两个不同的分类器。我个人更喜欢训练两个分类器,因为训练和验证比尝试将所有内容放入单个模型更容易。

问题本身并不十分清楚,因为您没有声明您有一个模型可以每次运行检测一辆汽车以获取图像,或者您只是询问使用哪些工具、算法或框架来检测汽车(或其他对象)在图像中。

回答第二个变体,您应该使用开发的对象检测算法,它们是 Haar Cascades(嵌入到 OpenCV 中,并且有关于如何训练自定义对象检测器的清晰教程,例如香蕉教程)或 CNN,它们是使用神经网络进行对象检测的选择,就个人而言,我喜欢使用该实现- 简单而全面的代码和惊人的结果。

两种方法(Haar Cascades 和 CNN)基本上都可以找到描述特定对象(面部、香蕉、汽车或 UFO)的相互连接和位于同一位置的形状的模式,并使用这些模式在新图像上查找对象。检测到的对象的相互包含(当对象的边界相交或一个被另一个包含时)用于为每个区域找到最佳匹配。

您的问题明确指出您只是在寻找多辆汽车而不是多个物体,所以答案就在问题中。您不是在寻找多个对象,而是在寻找同一对象的多次出现。

如果您对系统进行了足够好的训练以识别这两种类型的汽车,那么它们都应该使用标准的级联过滤器方法来检测......这就像问我如何在一张照片中检测到两张脸?

如果你正在寻找一辆车和一只猴子,那么情况就大不相同了,使用开放 CV 等工具的常用方法,你通常会训练 2 个分类器(一个用于汽车,一个用于猴子),对图像进行两次迭代。

您想要检测的对象类别越多,您需要的分类器和迭代就越多。