从Python中的Scratch理解和构建对象检测模型

Introduction

当我们看到图像时,我们的大脑会立即识别出其中包含的物体。 另一方面,机器需要花费大量时间和训练数据来识别这些对象。 但随着硬件和深度学习的最新进展,这个计算机视觉领域变得更加容易和直观。

请查看下面的图片作为示例。 该系统能够以令人难以置信的准确度识别图像中的不同对象。
在这里插入图片描述

物体检测技术在各种不同的行业中得到了迅速的采用。 它有助于自动驾驶汽车安全地穿越交通,在拥挤的地方发现暴力行为,协助运动队分析和建立侦察报告,确保对制造中的零件进行适当的质量控制,以及许多其他事情。 而这些只是描述了物体探测技术可以做到的事情!

在本文中,我们将了解对象检测是什么,并查看可以用来解决此空间中的问题的几种不同方法。 然后我们将深入探讨在Python中构建我们自己的对象检测系统。 在本文结束时,您将拥有足够的知识来自己承担不同的对象检测挑战!

注意:本教程假设您了解深度学习的基础知识,并且之前已经解决了简单的图像处理问题。 如果您还没有,或需要复习,我建议您首先阅读以下文章:

Table of Contents

什么是物体检测?
我们可以用来解决对象检测问题的不同方法

  • 方法1:天真的方式(分而治之)
  • 方法2:增加分割数量
  • 方法3:执行结构化划分
  • 方法4:提高效率
  • 方法5:使用深度学习功能选择并构建端到端方法

获取技术:如何使用ImageAI库构建对象检测模型

What is Object Detection?

在我们开始构建最先进的模型之前,让我们首先尝试了解对象检测是什么。 让我们(假设)建立一个自动驾驶汽车的行人检测系统。 假设您的汽车捕获的图像如下图所示。 你会如何描述这张图片?在这里插入图片描述

图像基本上描绘了我们的汽车靠近广场,少数人正在我们的车前过马路。 由于交通标志不清晰可见,汽车的行人检测系统应准确识别人们行走的位置,以便我们可以避开它们。

那么汽车系统可以做些什么来确保这种情况发生呢? 它可以做的是围绕这些人创建一个边界框,以便系统可以确定人们在图像中的位置,然后相应地决定采取哪条路径,以避免任何意外。
在这里插入图片描述

我们做对象检测的目标有两个方面:

  • 识别图像中存在的所有对象及其位置
  • 过滤掉关注对象

Different Approaches to Solve an Object Detection Problem

现在我们知道我们的问题陈述是什么,可以采用什么方法(或多种方法)来解决它? 在本节中,我们将介绍一些可用于检测图像中对象的技术。 我们将从最简单的方法开始,从那里开始。 如果您对我们将在下面看到的那些有任何建议或替代方法,请在评论部分告诉我们!

Approach 1: Naive way (Divide and Conquer)

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

  • 左上角
    在这里插入图片描述
  • 右上角

在这里插入图片描述

  • 左下角

在这里插入图片描述

  • 右下角
    在这里插入图片描述

现在,下一步是将这些部分中的每一个都提供给图像分类器。 这将为我们提供图像的该部分是否具有行人的输出。 如果是,请在原始图像中标记该补丁。 输出有点像这样:
在这里插入图片描述

这是首先尝试的好方法,但我们正在寻找更加准确和精确的系统。 它需要识别整个对象(或者在这种情况下是一个人),因为仅定位对象的某些部分可能会导致灾难性的后果。

Approach 2: Increase the number of divisions

以前的系统运行良好但我们还能做些什么呢? 我们可以通过指数增加我们输入系统的补丁数量来改进它。 这就是我们的输出应该是这样的:

在这里插入图片描述

这最终成了一个福音和诅咒。 当然,我们的解决方案似乎比天真的方法要好一些,但它充满了许多边界框,它们大致相同。 这是一个问题,我们需要一种更有条理的方法来解决我们的问题。

Approach 3: Performing structured divisions

为了以更结构化的方式构建我们的对象检测系统,我们可以按照以下步骤操作:

第1步:将图像划分为10×10网格,如下所示:在这里插入图片描述
第2步:为每个补丁定义质心
步骤3:对于每个质心,取三个不同高度和纵横比的不同补丁:
在这里插入图片描述

Step 4: Pass all of the patches created through the image classifier to get predictions

So how does the final output look like? A bit more structured and disciplined for sure – take a look below:

在这里插入图片描述

但我们可以进一步改进! 继续阅读以了解另一种可以产生更好结果的方法。

Approach 4: Becoming more efficient

我们看到的先前方法在很大程度上是可以接受的,但我们可以构建一个比这更有效的系统。 你能建议怎么样? 在我的脑海中,我可以提出一个优化。 如果我们考虑方法#3,我们可以做两件事来使我们的模型更好。

 - 增加网格大小:因此,我们可以将网格大小增加为10,而不是将网格大小增加到20:

在这里插入图片描述

取代三个贴片,取出具有不同高度和纵横比的更多贴片:在这里,我们可以从单个锚点取出9个形状,即三个不同高度的方形贴片和6个不同高度的垂直和水平矩形贴片。 这将为我们提供不同的补丁宽高比。

在这里插入图片描述

这又有其优点和缺点。 当然,这两种方法都可以帮助我们更细致地进行。 但它将再次创造我们必须通过我们的图像分类模型的所有补丁的爆炸。

我们能做的是,选择补丁而不是全部。 例如,我们可以构建一个中间分类器,它试图预测补丁是否实际上具有背景,或者可能包含一个对象。 这将指数地减少我们的图像分类模型必须看到的补丁。

我们可以做的另一个优化是减少说“同一件事”的预测。 让我们再次采用方法3的输出:

在这里插入图片描述

Approach 5: Using Deep Learning for feature selection and to build an end-to-end approach

深度学习在对象检测领域具有很大的潜力。您能否建议我们在哪里以及如何利用它来解决我们的问题?我在下面列出了几种方法:

  • 我们可以通过神经网络传递原始图像以减少尺寸,而不是从原始图像中获取补丁
  • 我们还可以使用神经网络来建议选择性补丁
  • 我们可以强化深度学习算法,使预测尽可能接近原始边界框。这将确保算法提供更严格和更精细的边界框预测

现在我们可以采用单个深度神经网络模型来尝试自己解决所有问题,而不是训练不同的神经网络来解决每个问题。这样做的好处是,神经网络的每个较小的组件将有助于优化同一神经网络的其他部分。这将有助于我们共同培训整个深层模型。

从目前为止我们看到的所有方法中,我们的输出将为我们提供最佳性能,有点类似于下图。我们将在下一节中看到如何使用Python创建它。
在这里插入图片描述

Getting Technical: How to build an Object Detection model using the ImageAI library

现在我们知道了什么是对象检测以及解决问题的最佳方法,让我们构建自己的对象检测系统!我们将使用ImageAI,这是一个python库,支持用于计算机视觉任务的最先进的机器学习算法。

运行对象检测模型以获得预测非常简单。我们不必通过复杂的安装脚本来开始。我们甚至不需要GPU来生成预测!我们将使用此ImageAI库来获得我们在方法#5中看到的输出预测。我强烈建议您遵循下面的代码(在您自己的机器上),因为这将使您能够从本节获得最大的知识。

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

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

conda create -n retinanet python=3.6 anaconda[](https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2018/06/I1_2009_09_08_drive_0012_001351-768x223.png)

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

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

第3步:然后安装ImageAI库。

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

步骤4:现在下载生成预测所需的预训练模型。 该模型基于RetinaNet(未来文章的主题)。 点击链接下载 - RetinaNet预训练模型

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

第6步:从此链接下载图像。 将图像命名为image.png

步骤7:打开jupyter笔记本(在终端中键入jupyter notebook)并运行以下代码:

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("--------------------------------")

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

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

from IPython.display import Image
Image("image_new.png")

在这里插入图片描述

恭喜! 您已为行人检测创建了自己的物体检测模型。 这有多棒?

结束笔记

在本文中,我们学习了什么是对象检测,以及创建对象检测模型背后的直觉。 我们还了解了如何使用ImageAI库为行人检测构建此对象检测模型。

通过稍微调整代码,您可以轻松地转换模型以解决您自己的对象检测挑战。

猜你喜欢

转载自blog.csdn.net/weixin_41697507/article/details/89422540
今日推荐