在外网上看到一篇非常好的目标检测入门教程,特此翻译过来,希望能对他人有所帮助,也加深下自己的记忆。(大部分机器都翻译的可以,如有错误我会改正,各位也可以google看原文)

介绍

 

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

以下图为例。该系统能够以令人难以置信的精确度识别图像中的不同物体。

深度学习之目标检测 目标检测如何入门_深度学习之目标检测

目标检测技术在各行各业中得到了迅速的应用。
它帮助自动驾驶汽车在交通中安全行驶,在拥挤的地方发现暴力行为,帮助运动队分析球探报告,确保制造过程中零部件的质量控制,等等。
而这些仅仅是对象检测技术所能做的皮毛而已!

在本文中,我们将了解什么是目标检测,并研究几种不同的方法来解决这个空间中的问题。
然后我们将深入研究用Python构建我们自己的对象检测系统。
在本文的最后,您将拥有足够的知识来独自承担不同的目标检测挑战!

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

https://www.analyticsvidhya.com/blog/2016/03/introduction-deep-learning-fundamentals-neural-networks/

https://www.analyticsvidhya.com/blog/2016/04/deep-learning-computer-vision-introduction-convolution-neural-networks/

https://www.analyticsvidhya.com/blog/2016/10/tutorial-optimizing-neural-networks-using-keras-with-image-recognition-case-study/

目录

什么是目标检测?
我们可以使用不同的方法来解决对象检测问题
方法1:原始的方法(分而治之)
方法2:增加分部的数量
方法3:执行结构化的划分
方法4:变得更有效率
方法5:使用深度学习进行特征选择并构建端到端方法
获取技术:如何使用ImageAI库构建对象检测模型

什么是目标检测?

在我们深入构建一个最先进的模型之前,让我们先试着理解什么是对象检测。
让我们(假设)为自动驾驶汽车建立一个行人检测系统。
假设您的汽车捕获了如下所示的

图像。
你如何描述这幅图像?

深度学习之目标检测 目标检测如何入门_目标检测_02

这幅图基本上描绘了我们的车在一个广场附近,几个人在我们的车前面过马路。
由于交通标志看不清楚,汽车的行人检测系统应该准确地识别出人们在哪里行走,这样我们就可以避开他们。

那么,汽车的系统能做些什么来确保这种情况的发生呢?
它所能做的就是在这些人周围创建一个包围框,这样系统就可以确定这些人在图像中的位置,然后相应地决定走哪条路径,以避免任何灾难。

深度学习之目标检测 目标检测如何入门_深度学习_03

 

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

1,识别图像中出现的所有对象及其位置
2,过滤掉警示标志

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

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

方法1:初始方法(分而治之)

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

1,左上角

深度学习之目标检测 目标检测如何入门_神经网络_04

2,右上角

 

深度学习之目标检测 目标检测如何入门_神经网络_05

3,左下角

深度学习之目标检测 目标检测如何入门_深度学习之目标检测_06

4,右下角

深度学习之目标检测 目标检测如何入门_深度学习_07

现在,下一步是将这些部分分别输入图像分类器。
这将给我们一个输出,这部分图像是否有行人。
如果是,在原始图像中标记那个长方形。
输出结果大致如下:

深度学习之目标检测 目标检测如何入门_目标检测_08

这是一个很好的方法,首先尝试,但我们正在寻找一个更准确和更精确的系统。它需要识别整个对象(在本例中是一个人),因为仅定位对象的一部分可能会导致灾难性的结果。

方法2:增加分部的数量

以前的系统运行得很好,但是我们还能做什么呢?

我们可以通过成倍地增加我们输入到系统中的分部的数量来改进它。

我们的输出

深度学习之目标检测 目标检测如何入门_深度学习_09

这最终既是一种恩惠,也是一种诅咒。
当然,我们的解决方案似乎比天真的方法好一点,但它充满了许多近似相同的边界框。
这是一个问题,我们需要一个更有条理的方法来解决我们的问题。

方法3:执行结构化的划分

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

步骤1:将图像划分为10×10的网格像这样的:

深度学习之目标检测 目标检测如何入门_深度学习_10

步骤2:定义每个部分的质心步骤

3:对于每个质心,取三个不同高度和宽高比的部分

深度学习之目标检测 目标检测如何入门_神经网络_11

步骤4:通过图像分类器创建的所有部分获得预测

那么最终的输出是什么样子的呢?
看看下面:

深度学习之目标检测 目标检测如何入门_神经网络_12

但是我们可以在这方面做得更好!
继续阅读,看看另一种方法将产生更好的结果。

方法4:变得更有效率

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

增加网格大小:因此,我们可以将网格大小从10增加到20:

深度学习之目标检测 目标检测如何入门_目标检测_13

在这里,我们可以从一个锚点上取9个形状,即3个不同高度的正方形斑块和6个不同高度的垂直和水平矩形斑块。
这将为我们提供不同的长宽比的补丁。

深度学习之目标检测 目标检测如何入门_深度学习之目标检测_14

当然,这两种方法都可以帮助我们达到更细粒度的层次。
但它将再次创造一个爆炸的所有补丁,我们必须通过我们的图像分类模型。

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

我们可以做的另一个优化,是减少说“相同的事情”的预测。
让我们再看一遍方法3的输出:

深度学习之目标检测 目标检测如何入门_神经网络_15

正如您所看到的,这两个边界框预测基本上是同一个人的。
我们可以选择其中任何一个。
所以为了做出预测,我们考虑所有“说同样的话”的补丁,然后选择最有可能发现一个人的补丁。

到目前为止,所有这些优化都给出了相当不错的预测。
我们几乎很有把握了,但是你能猜出少了什么吗?
当然是深度学习了!

方法5:使用深度学习进行特征选择并构建端到端方法

深度学习在目标检测领域有着巨大的潜力。
你能推荐我们在哪里以及如何利用它来解决我们的问题吗?
我列出了一些方法如下:

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

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

我们的输出将提供到目前为止我们所看到的所有方法中最好的性能,有点类似于下面的图像。
我们将在下一节中看到如何使用Python创建它。

 

深度学习之目标检测 目标检测如何入门_深度学习_16

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

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

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

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

 使用python 3.6版本创建一个Anaconda环境。

conda create -n retinanet python=3.6 anaconda

激活环境并安装必要的包。

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

然后安装ImageAI库。

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

步骤4:现在下载生成预测所需的预训练模型。
这个模型是基于RetinaNet(一篇后续文章的主题)的。
点击链接下载-视网膜网络预训练模型https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5

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

步骤6:从这个链接下载图像。
将图像命名为image.png

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

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

  

深度学习之目标检测 目标检测如何入门_目标检测_17

 

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

最后指出

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

只要稍微调整一下代码,您就可以轻松地转换模型来解决您自己的对象检测挑战。
如果你确实用上述方法解决了这样的问题,特别是为社会事业,请在下面的评论中告诉我!