当我们看到一张图片时, 我们的大脑会立即识别图片中所包含的物体. 而对于机器来说, 识别这些对象则需要耗费大量的时间和大量的训练数据. 但是, 随着深度学习和硬件技术的不断进步, 目标检测在计算机视觉领域变得更加简单和直观.
如下图所示, 该目标检测系统能够以令人难以置信的精确度来识别图像中的不同对象.
现在, 目标检测技术在不同的行业中发展迅速. 它能帮助无人驾驶汽车在交通中安全行驶, 在拥挤的地方发现暴力行为, 协助运动团队分析和建立相应的报告, 制造业中保证部件质量等等. 以上这些只不是是目标检测技术的冰山一角而已.
本文将介绍什么是目标检测, 以及解决这一领域问题的一些方法. 然后, 我们将深入探究如何用 Python 构建一个目标检测系统. 读完这篇文章, 你将有能力独自应对不同对象的检测!
读本文之前, 你需要有一定的深度学习基础知识, 并且也解决过简单的图像处理问题.
什么是目标检测?
在开始构建模型之前, 让我们先试着理解什么是目标检测. 假设我们要为一个无人驾驶汽车构建一个行人检测系统, 汽车已经捕获到了如下这张图片, 请问, 你会如何描述这张图片?
这张图片描述了这样一个场景: 汽车在广场附近, 前面有些人正在穿过马路, 由于马路上的交通标志不是很清晰, 因此, 这个行人检测系统必须能够准确的识别行人在哪里行走, 这样我们的汽车就可以避开这些行人了.
那么, 汽车的行人检测系统需要做些什么呢? 它需要在这些行人的周围创建一个边界框, 这样一来, 系统就能够准确的定位图像中的行人, 然后再决定走哪条路来避开行人.
该系统进行目标检测的目标如下:
1. 确定图像中所有的对象以及其所在的位置.
2. 过滤出目标对象.
目标检测的方法
现在, 我们已经知道要解决什么问题, 那么, 有什么方法可以进行目标检测呢?
方法一: 分而治之
将图像简单的分为四个部分:
(1) 左上角
(2) 右上角
(3) 左下角
(4) 右下角
这是一个很不错的办法, 但是我们想构建一个更为精确的系统, 它需要识别整个对象 (比如这个图中的某个人) .
方法二: 增加分割的数量
方法一的系统可以运作的很好, 那么我们还需要做什么呢? 增加我们输入到系统的块的数量, 来改进这个系统, 如下图所示:
这虽然是个很好的方法, 但是也带来了不必要的麻烦. 当然, 这要比第一个方法要好一些, 唯一的缺点就是有大量的边界框. 因此, 我们需要一个更为合理的办法来进行目标检测.
方法三: 结构化划分
为了更有调理的创建一个目标检测系统, 我们的改进如下:
第一步: 将图像划分成 10*10 的网格, 如下图所示:
第二步: 定义每个块的中心
第三步: 对于每个中心, 取三种不同的块的组合, 即不同长宽比例:
我们继续进行改进, 看看还有什么方法能够使这个目标检测模型的性能更好.
方法四: 提高效率
上述三种方法都是比较容易实现的, 但是我们希望构建一个更有效率的系统. 我在方法三的基础上进行优化, 来提高模型的性能, 我总共做了两件事:
1. 增加网格的数量: 将原来的 10*10 网格的数量提高到 20*20.
2. 从之前的 3 个快增加到更多不同长宽比的块: 在同一个中心上取出 9 个块, 即 3 个不同宽度的正方形块和 6 个不同长宽比的矩形块, 如下图所示:
这种方法有利有弊, 它能够使我们从更细的层次来检测对象, 但是, 另一方面, 我们必须将大量的块输入到图像分类模型中.
因此, 我们可以进行有选择性的选择一部分块, 而不是全部作为模型的输入. 比如, 建立一个中间分类器, 来检测图像中是否为背景, 还是可能包含一个图像. 这样就可以大大的减少了模型所需要检测的块.
我们还可以做另一个优化: 减少对 "同一个对象" 的预测. 我们再来看看方法三的输出:
正如上图显示的那样, 边界框里预测的是同一个人, 我们就可以选择其中任何一个进行预测. 因此, 为了进行目标检测
, 对于有 "同一对象" 的盒子, 我们选择那个最容易检测到是人的边界框.
到目前为止, 所有这些优化系统的预测结果都很不错. 那么, 是不是还缺少点什么? 没错, 就是深度学习!
方法五: 利用深度学习进行特征选择, 并构建一个端到端的方法
深度学习在目标检测领域中有着很大的应用潜力. 那么, 我们应该如何将深度学习应用到目标检测中呢? 下面, 我列出了几种方法:
1. 将原始图像输入到神经网络中来降低维度, 而不是原始图像的块.
2. 使用神经网络来检测所选择的预测块.
3. 使用强化深度学习算法, 使预测结果尽可能的接近原始边界框, 这将确保算法能够提供更加精确的边界框预测.
现在, 我们并不会训练不同的神经网络来解决目标检测中的每一个问题, 而是训练一个单一的深度神经网络模型来解决所有的问题. 这样做的好处是, 神经网络中每一个小组件有助于优化这个神经网络的其他组件, 也有助于我们训练整个深度学习模型.
其输出结果是上述所有的方法中性能最好的一个方法, 结果类似于下面这个图像, 最后, 我们将会学习如何使用 Python 来创建该模型.
教程: 如何使用 Image AI 库构建一个目标检测模型
既然我们现在已经了解了什么是目标检测和解决问题的最佳方法, 那么让我们来构建一个属于自己的目标检测系统吧! 在这里, 我们使用 Image AI https://github.com/OlafenwaMoses/ImageAI 库来构建目标检测模型 -- 支持最前沿的计算机视觉任务的机器学习 Python 库.
运行一个目标检测模型来获得预测结果, 这是件相当简单的事. 我们并不需要进行复杂的脚本安装, 更不需要一个 GPU 来产生预测结果. 我们将使用上述方法五和 Image AI 库进行目标检测, 代码实现如下所述.
请注意: 在构建目标检测
模型之前, 请确保您在本地计算机上安装了 Python 的 Anaconda 版本!
第一步: 在 Python 3.6 中布置一个 Anaconda 环境.
第二步: 激活环境, 并安装必要的软件包.
第三步: 安装 Image AI 库.
第四步: 下载预先训练好的模型, 该模型是基于目标检测器 --Retina Net, 下载 Retina Net 预训练模型 https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5 .
第五步: 将下载好的文件复制到工作文件夹中.
第六步: 下载图片 https://s3-ap-south-1.amazonaws.com/av-blog-media/wp-content/uploads/2018/06/I1_2009_09_08_drive_0012_001351-768x223.png , 并命名为 image.png.
第七步: 在 Jupyter Notebook 上运行以下代码:
这将会创建一个名为 image new.png 的图像文件, 该图像中包含了边界框.
第八步: 打印图片, 代码及输出图像如下:
这样, 我们就成功构建了一个行人目标检测模型.
结语
在这篇文章中, 我们了解什么是目标检测, 以及创建一个目标检测模型的思路. 最后, 我们使用 Image AI 库成功构建了一个行人检测模型.
数十款阿里云产品限时折扣中, 赶紧点击领劵开始云上实践吧!
以上为译文.
来源: https://yq.aliyun.com/articles/604614