由浅入深:教你如何构建一个行人目标检测模型(Python)

   当我们看到一张图片时,我们的大脑会立即识别图片中包含的物体。对于机器来说,识别这些对象需要耗费大量的时间和大量的训练数据。但是,随着深度学习和硬件技术的不断进步,目标检测在计算机视觉领域变得更加简单和直观。

如下图所示,该目标检测系统能够以令人难以置信的精确度来识别图像中的不同对象。

241c4af51fd77b4ecd27914147c8bf0a2a8c9857 

现在,目标检测技术在不同的行业中发展迅速。它能帮助无人驾驶汽车在交通中安全行驶、在拥挤的地方发现暴力行为、协助运动团队分析和建立相应的报告、制造业中保证部件质量等等。以上这些只不是是目标检测技术的冰山一角而已。

本文将介绍什么是目标检测,以及解决这一领域问题的一些方法。然后,我们将深入探究如何用Python构建一个目标检测系统。读完这篇文章,你将有能力独自应对不同对象的检测!

读本文之前,你需要有一定的深度学习基础知识,并且也解决过简单的图像处理问题。

什么是目标检测

在开始构建模型之前,让我们先试着理解什么是目标检测。假设我们要为一个无人驾驶汽车构建一个行人检测系统,汽车已经捕获到了如下这张图片,请问,你会如何描述这张图片?

ad471b50b22d9b9febef276d6259e62bf9450072 

这张图片描述这样一个场景:汽车在广场附近,前面有些人正在穿过马路,由于马路上的交通标志不是很清晰,因此,这个行人检测系统必须能够准确的识别人在哪里行走,这样我们的汽车就可以避开这些行人了。

那么,汽车的行人检测系统需要做些什么呢?它需要在这些行人的周围创建一个边界框,这样一来,系统就能够准确的定位图像中的行人,然后再决定走哪条路来避开行人。

c035435f4da7474e9622db9268a317cd4384ad0f 

扫描二维码关注公众号,回复: 1884315 查看本文章

该系统进行目标检测的目标如下

1.确定图像中所有的对象以及其所在的位置。

2.过滤出目标对象。

目标检测的方法

现在,我们已经知道要解决什么问题,那么,有什么方法可以进行目标检测呢?

方法一:分而治之

将图像简单的分为四个部分:

1)左上角

9fed0521e5ed548b333dc035a8ee427b493bf660 

2)右上角

38ed35db8cc38040ffdc99c25ef3e888ec759c30 

3)左下角

80c2680ac0904d2ec999b08f35916dfb5b8035d5 

4)右下角

e9126a94d059e95ff70bb5833630399c926898ff 

这是一个很不错的办法,但是我们想构建一个更为精确的系统,它需要识别整个对象(比如这个图中的某个人)

方法二:增加分割的数量

方法一的系统可以运作的很好,那么我们还需要做什么呢?增加我们输入到系统的块的数量,来改进这个系统,如下图所示

e384ab74c88cfea37bd14782fff99ef508b9cb2e 

这虽然是个很好的方法,但是也带来了不必要的麻烦。当然,这要比第一个方法要好一些,唯一的缺点就是有大量的边界框。因此,我们需要一个更为合理的办法来进行目标检测

方法三:结构化划分

为了更有调理的创建一个目标检测系统,我们的改进如下

第一步:将图像划分成10*10的网格,如下图所示:

f95b98ba7e5687b8e5ce9eab8a5d83bc5b81a64e 

第二步:定义每个块的中心

第三步:对于每个中心,取三种不同的块的组合,即不同长宽比例:

d2b23527a12a25031db0902b82535bbfa4c1a59d 

我们继续进行改进,看看还有什么方法能够使这个目标检测模型的性能更好。

方法四:提高效率

上述三种方法都是比较容易实现的,但是我们希望构建一个更有效率的系统。我在方法三的基础上进行优化,来提高模型的性能,我总共做了两件事:

1.增加网格的数量:将原来的10*10网格的数量提高到20*20

e206e94a1f682075053af4a9f51f653de58058c4 

2.从之前的3个快增加到更多不同长宽比的块:在同一个中心上取出9个块,即3个不同宽度的正方形块和6个不同长宽比的矩形块,如下图所示:

862799623934a7a85b254539a5c00cc65b47e06b 

这种方法有利有弊,它能够使我们从更细的层次来检测对象,但是,另一方面,我们必须将大量的块输入到图像分类模型中。

因此,我们可以进行有选择性的选择一部分块,而不是全部作为模型的输入。比如,建立一个中间分类器,来检测图像中是否为背景,还是可能包含一个图像。这样就可以大大的减少了模型所需要检测的块。

我们还可以做另一个优化:减少同一个对象的预测。我们再来看看方法的输出:

2322798eb78f2aef89c8bf400a9fcb0ccfccfc18 

正如上图显示的那样,边界框里预测的是同一个人,我们就可以选择其中任何一个进行预测。因此,为了进行目标检测,对于有同一对象的盒子,我们选择那个最容易检测到是人的边界框。

到目前为止,所有这些优化系统的预测结果都很不错。那么,是不是还缺少点什么?没错,就是深度学习!

方法五:利用深度学习进行特征选择,并构建一个端到端的方法

深度学习在目标检测领域中有着很大的应用潜力。那么,我们应该如何将深度学习应用到目标检测中呢?下面,我列出了几种方法:

1.将原始图像输入到神经网络中来降低维度,而不是原始图像的块。

2.使用神经网络来检测所选择的预测块。

3.使用强化深度学习算法,使预测结果尽可能的接近原始边界框,这将确保算法能够提供更加精确的边界框预测。

现在,我们并不会训练不同的神经网络来解决目标检测中的每一个问题,而是训练一个单一的深度神经网络模型来解决所有的问题。这样做的好处是,神经网络中每一个组件有助于优化这个神经网络的其他组件,也有助于我们训练整个深度学习模型。

其输出结果是上述所有的方法中性能最好的一个方法,结果类似于下面这个图像,最后,我们将会学习如何使用Python来创建该模型。

91726d9cf5b8b4efdc20b278936cf38f66a10afa 

教程:如何使用Image AI库构建一个目标检测模型

既然我们现在已经了解了什么是目标检测和解决问题的最佳方法,那么让我们来构建一个属于自己的目标检测系统吧!在这里,我们使用Image AI来构建目标检测模型——支持最前沿的计算机视觉任务的机器学习Python库。

运行一个目标检测模型来获得预测结果,这是件相当简单的事。我们并不需要进行复杂的脚本安装,更不需要一个GPU来产生预测结果。我们将使用上述方法五Image AI库进行目标检测,代码实现如下所述。

请注意:在构建目标检测模型之前,请确保您在本地计算机上安装了PythonAnaconda版本!

第一步:在Python 3.6中布置一个Anaconda环境。

661661ecc28921c07187e4c08dbd2b97287dfac9 

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

d4c5c62172aca667f67fc1bb0138bba5f2796eef 

第三步:安装Image AI库。

a0a669d540f648fa038adc9508c7f4ff07dde935 

第四步:下载预先训练好的模型,该模型是基于目标检测——Retina Net,下载Retina Net预训练模型

第五步:将下载好的文件复制到工作文件夹中。

第六步:下载图片,并命名为image.png

第七步:在 Jupyter Notebook 上运行以下代码:

4219c52d4c693c38f1c7837080b598d97a7baf3c 

这将会创建一个名为image new.png的图像文件,该图像中包含了边界框。

第八步:打印图片,代码及输出图像如下:

244ce2b7336c62d8596311a219bd0189c20bc80c 

de7a43b7b582f9d29532817cf99787f5dcaed057 

这样,我们就成功构建了一个行人目标检测模型。

结语

在这篇文章中,我们了解什么是目标检测,以及创建一个目标检测模型的思路。最后,我们使用Image AI库成功构建了一个行人检测模型。

  数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧!

以上为译文。

本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。

文章原标题《Understanding and Building an Object Detection Model from Scratch in Python》,译者:Mags,审校:袁虎。

文章为简译,更为详细的内容,请查看原文 

猜你喜欢

转载自yq.aliyun.com/articles/604614