对象检测技术:让计算机视觉变得容易和直观的神奇力量

日期: 2024-10-28 07:02:47|浏览: 465|编号: 76150

友情提醒:信息内容由网友发布,本站并不对内容真实性负责,请自鉴内容真实性。

”

当一张图片出现在我们眼前时,我们的大脑立即识别出图片中包含的物体。另一方面,我们需要花费大量的时间和训练数据来让机器识别这些物体。

但鉴于硬件和深度学习的最新进展,计算机视觉的这一领域已经变得更加容易和直观。

以下图为例,系统能够以极高的准确度识别图片中的不同物体。

图1

物体检测技术现在正在各个行业中迅速采用。它可以帮助自动驾驶汽车安全行驶,检测拥挤场所中的暴力行为,协助团队进行分析和草稿报告,确保制造的零件得到适当的质量控制,等等。

这些只是物体检测技术的一些应用!在本文中,我们将了解什么是对象检测,并了解可用于解决该领域问题的几种不同方法。

然后我们将深入研究使用它来构建我们自己的对象检测系统。阅读本文后,您将拥有足够的知识来克服不同的物体检测挑战!

注意:本教程假设您了解深度学习的基础知识,并且之前已经解决过简单的图像处理问题。

如果你还没有或者需要弥补的话,建议先阅读以下文章:

什么是物体检测?

在开始构建最先进的模型之前,让我们首先了解什么是对象检测。让我们想象一下为自动驾驶汽车构建一个行人检测系统。

假设您驾驶的汽车捕捉到了如下图所示的图像。你会如何描述这个图像?

图2

该图像实际上描绘了我们的汽车接近一个广场,有几个人在我们的汽车前面过马路。

由于无法清楚地看到交通标志,因此汽车的行人检测系统应该准确识别人们行走的位置,以便避开他们。

那么,汽车系统如何确保行人避让呢?它能做的就是用边界框包围这些人,以便系统能够准确识别图像中行人的位置,并据此决定走哪条路,以避免出现意外。

图3

我们在目标检测中有两个目标:

解决目标检测问题的不同方法

既然我们知道了所提出的问题是什么,那么可以使用什么方法(或方法)来解决该问题?

在本节中,我们将介绍几种可用于检测图像中的对象的技术。先从最简单的方法开始,然后逐渐深入。

方法一:朴素法(分而治之法)

我们可以采取的最简单的方法是将图像分成四个部分:

图4:左上角

图5:右上角

图6:左下角

图7:右下角

下一步是将这些部分中的每一个输入到图像分类器。输出结果是图像的某一部分是否有行人。如果有行人,请在原始图像中标记此块。

输出将如下所示:

图8

这是一个值得首先尝试的好方法,但我们正在寻找的是一个具有高精度的系统。

它需要识别整个物体(或本文中的行人),因为仅定位物体的一部分可能会导致灾难性的结果。

方法二:增加分解次数

以前的系统做得很好,但是我们还能做什么呢?我们可以通过显着增加输入到系统的图像块的数量来改进系统。

输出应如下所示:

图9

最终这有利有弊。当然,我们的解决方案看起来比简单的方法好一点,但是有太多相同的边界框。这是一个问题,我们需要一种更结构化的方法来解决它。

方法3:进行结构化分解

为了以更加结构化的方式构建目标检测系统,我们可以按照以下步骤进行:

步骤1:将图像分成10x10的网格,如下所示:

图10

步骤 2:定义每个图像块的 ()。

步骤3:对于每个质心,取三个具有不同高度和长宽比的不同图像块,如下所示:

图11

步骤 4:通过图像分类器运行所有创建的图像块进行预测。

那么最终的输出是什么呢?当然,它更加结构化和标准化,请看下面:

图12

但我们可以进一步改进!这是获得更好结果的另一种方法。

方法四:提高效率

我们看到的前一种方法在很大程度上是可以接受的,但我们可以构建一个比现在更有效的系统。

您对此有何建议?我首先想到的是优化。如果我们考虑方法 3,我们可以做两件事来改进模型。

增加网格大小

我们可以将网格大小增加到 20,而不是选择 10。

图13

使用更多具有不同高度和纵横比的图像图块,而不是三个

这里,我们可以让1个锚点()对应9个图像块,即3个不同高度的正方形图像块和6个纵横不同高度的矩形图像块。这将为我们提供具有不同长宽比的图像块。

图14

这又有利有弊。当然,这两种方法都可以帮助我们变得更加精致。但它会再次生成大量必须通过图像分类器模型的图像块。

我们能做的就是采用选择性图像补丁而不是所有图像补丁。例如,我们可以构建一个中间分类器,并尝试预测某个图像块是否实际上具有背景,即它是否可能包含对象。这将显着减少图像分类器模型看到的图像块的数量。

我们可以做的另一个优化是减少表明“相同结果”的预测数量。我们以方法3的输出为例:

图15

正如你所看到的,两个边界框预测基本上都是同一个人。我们可以选择其中任何一个。

因此,为了进行预测,我们会考虑所有“表明相同结果”的边界框,并选择最有可能检测到人的边界框。

到目前为止,所有这些优化都给了我们很好的预测。我们几乎肯定会赢,但你能猜出还缺少什么吗?当然缺少深度学习!

方法5:使用深度学习

利用深度学习进行特征选择并构建端到端方法,深度学习在目标检测领域具有巨大潜力。我们可以在哪里利用深度学习来解决我们的问题?如何利用?

我在下面列出了几种方法:

我们现在可以采用单个深度神经网络模型并尝试自行解决所有问题,而不是训练不同的神经网络来解决每个问题。

这样做的优点是神经网络的每个较小部分都将有助于优化同一神经网络的其他部分。这将有助于我们共同训练整个深度模型。

输出将产生迄今为止我们所见过的任何方法的最佳性能,有点类似于下图。我们将在下一节中了解如何构建此模型。

图16

如何使用库构建对象检测模型?

现在我们知道什么是对象检测以及解决问题的最佳方法,让我们构建自己的对象检测系统!

我们将使用 (),一个支持计算机视觉任务的最先进机器学习算法的库。

运行对象检测模型来获得预测很简单。我们不必担心复杂的安装脚本即可开始,我们甚至不需要 GPU 来生成预测!我们将使用这个库来获得上面方法 5 中看到的输出预测。

强烈建议您遵循下面的代码(在您自己的计算机上),因为这可以让您从本节中获得尽可能多的知识。

请注意,您需要在构建对象检测模型之前设置系统。将其安装到本地系统后,您可以开始执行以下步骤。

步骤1:使用3.6版本创建环境。

conda create -n retinanet python=3.6 anaconda

步骤2:激活环境并安装必要的软件包。

source activate retinanet
conda install tensorflow numpy scipy opencv pillow matplotlib h5py keras

第三步:然后安装库。

pip install https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl

第 4 步:现在下载生成预测所需的预训练模型。该模型基于.

点击链接下载:预训练模型()。

步骤 5:将下载的文件复制到当前工作文件夹。

步骤 6:从此链接 () 下载图像并将图像命名为 image.png。

第 7 步:打开笔记本(在终端中输入)并运行以下代码:

from imageai.Detection import ObjectDetection
import os


execution_path = os.getcwd()

detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()
custom_objects = detector.CustomObjects(person=True, car=False)
detections = detector.detectCustomObjectsFromImage(input_image=os.path.join(execution_path , "image.png"), output_image_path=os.path.join(execution_path , "image_new.png"), custom_objects=custom_objects, minimum_percentage_probability=65)


for eachObject in detections:
   print(eachObject["name"] + " : " + eachObject["percentage_probability"] )
   print("--------------------------------")

这将创建一个名为 .png 的修改后的图像文件,其中包含图像的边界框。

步骤 8:要打印图像,请使用以下代码:

fromIPython.display import Image
Image("image_new.png")

恭喜!您已经构建了自己的对象检测模型来检测行人。看看它有多棒吗?

结论

在本文中,我们了解了什么是对象检测以及构建对象检测模型背后的机制。我们还了解了如何使用库来构建检测行人的对象检测模型。

只需更改一些代码,您就可以轻松更改模型以克服自己的对象检测挑战。

提醒:请联系我时一定说明是从101箱包皮具网上看到的!