使用Python中的ImageAI进行对象检测

使用Python中的ImageAI进行对象检测

由Kaizong Ye,Liao Bao撰写

对象检测的两个主要目标包括:

  • 识别图像中存在的所有对象
  • 筛选出关注的对象

在本文中,您将看到如何在Python中执行对象检测。

用于对象检测的深度学习

深度学习技术已被证明可解决各种物体检测问题。

×

从简单的图像分类到三维姿势预测 (3D-pose estimation),计算机视觉 (Computer Vision) 领域一直不缺乏有趣的问题,其中就包括对象/目标检测 (Object Detection)。和许多其他的计算机视觉问题一样,对象检测仍然没有一个显而易见的最优方法,这意味着这个领域还有很多潜力。首先让我们快速了解一下这个领域中最常见的问题。

对象检测与其他计算机视觉问题

分类 (Classification)

分类问题是计算机视觉中最著名的问题,它是识别出图像的类别,比如人、兔子、猫咪等等。在学术界使用的最流行的数据集之一是ImageNet,由数百万个分类图像组成,并在ImageNet大规模视觉识别挑战 (ILSVRC) 的年度竞赛中使用。近年来,分类模型的精确度已经超过了人类的肉眼,所以这个问题已算是基本解决了的。

图像分类的例子(99%概率恐龙,1%的概率公鸡)

定位 (Localization)

定位是在图像中找到某个对象的位置,和分类有些类似。定位有很多实际应用。例如,智能裁剪 (Smart Cropping) ——基于对象所在的位置裁剪图像,或者常规的对象提取之后再用其他方法做进一步处理。它可以与分类结合定位对象,然后将其分类为多种可能的类别之一。

图像定位的例子

实例/目标分割 (Instance/Object Segmentation)

实例分割不仅要在图像中找到对象,而且要找到每个被检测到的对象的像素掩码。

对象检测 (Object Detection)

定位和分类可以迭代起来,最终在一张图片汇总对多个对象进行检测和分类。对象检测是在图像上发现和分类一个变量的问题。对象检测与定位、分类相比,重要的区别是这个“变量”。对象检测的输出长度是可变的,因为检测到的对象的数量会根据图像的不同而变化。在本文中,我们将深入了解对象检测的实际应用、作为机器学习的对象检测的主要问题是什么、以及深度学习如何在这几年里解决这个问题。

对象检测的例子(检测到四个小恐龙宝宝)

对象检测的实际运用

尽管对象检测仍然是一个新工具,但是它已经有许多有用有趣的应用了——

人脸识别 (Face Detection)

自21世纪初以来,就出现了一些有人脸自动对焦功能的照相机。虽然这是一个较窄的对象检测问题,但它的方法同样适用于其他类型的对象,之后会详述。

计数 (Counting)

计数是一个简单但经常被忽略的对象检测应用。现实中我们需要计算机具有计数人、汽车、花朵甚至是微生物的能力,并应用于不同类型的系统。随着视频监控设备的不断涌现,利用计算机视觉将原始信息转换成结构化数据的机会比以往任何时候都要多。

视觉搜索引擎 (Visual Search Engine)

一个很好的例子是Pinterest的视觉搜索引擎,它使用对象检测构造数据通道从而对图像不同部分建立索引。比如,当你搜索一个特定的钱包时,你可以找到不同情境下使用这个钱包的图片。这比仅仅找到类似的图像(如谷歌图片的反向搜索引擎)要强大得多。

论文(Jing, Yushi, et al. "Visual Search at Pinterest.")中的Pinterest例子

航拍图像分析 (Aerial Image Analysis)

在如今这个有着廉价无人机和(还算)廉价的卫星发射的时代,我们的世界拥有了前所未有之多的数据。现在已经有公司使用Planets和Descartes Labs等公司的卫星图像,应用对象检测来计算汽车、树木和船只的数量。这促使了从前不可能(或者非常昂贵)的高质量数据,现在有了普遍的应用。
一些公司使用无人机,自动探测难以到达的地方(BetterView),或者进行通用的对象检测分析(TensorFlight)。还有一些公司在不需要人工干预的情况下,解决了对象检测和定位的问题。

TensorFlight对汽车、树木和行人检测

对象检测的困难与挑战

这一部分,让我们开始深入了解对象检测的主要问题。

可变数量的对象 (Variable number of objects)

我们之前提到了关于对象数量可变的问题,但我们却没讲它为什么是一个问题。在训练机器学习模型时,通常需要将数据表示为固定大小的向量。但是,由于图片中对象的数量事先不知道,所以我们不知道正确的输出维度。因此需要一些后期处理,这增加了模型的复杂性。
一般使用滑动窗口的方法来处理可变数量的对象,通过滑动固定大小的窗口,在所有的地方生成固定大小的特征。在得到这些被过滤后的特征之后,一些被丢弃,另一些被合并以生成最终的结果。
这里有个滑动窗口的例子:滑动窗口的动图。

调整对象检测窗口大小 (Resizing)

另一个巨大的挑战是各种可能的对象大小,即在进行分类时,既希望占图片大部分的对象进行分类,又想要找到一些可能只有12个像素、或者是原始图像一小部分的小对象。使用不同尺寸的滑动窗口可以解决这个问题,但效率很低。

建模

第三个挑战是同时解决两个问题——如何用一个简单的模型解决两种不同的需求,即定位和分类。


在了解深入学习如何应对这些挑战之前,让我们快速地回顾一下传统的对象检测方法。

传统方法

尽管有很多不同类型的方法,我们关注两个最流行并且仍然被广泛使用的传统方法。
第一个是由Paul Viola和Michael Jones在2001年的Robust Real-time Object Detection中提出的Viola-Jones框架。这种方法速度快且相对简单,可以进行实时但粗略的人脸检测,是在傻瓜相机中实现的一种算法。
我们不会详细讨论它是如何工作的或者其训练过程。总的来说,它使用Haar特征和上千个不同的简单二分分类器。这些分类器采用逐级多尺度滑动窗口,并且极快地弃用不适用的分类器。
另一种类似的传统方法是利用定向梯度 (Histogram of Oriented Gradients, HOG) 特征和支持向量机 (Support Vector Machine, SVM) 进行分类。它仍然采用多尺度滑动窗口,和Viola-Jones框架相比,虽然这个方法表现更佳,但速度要慢得多。


深度学习方法

深度学习真正改变了机器学习的游戏规则,尤其在计算机视觉领域。深度学习模型在图像分类任务中碾压了其他传统方法。
现在大家可能对对象检测的挑战以及解决方法有了更好的直觉,接下来将概述在过去的几年中深度学习方法是如何演变的。

OverFeat

第一个对象检测的深度学习方法是2013年纽约大学发表的OverFeat。他们提出了一种使用卷积神经网络的多尺度滑动窗口算法。

R-CNN (Regions with CNN features) 基于卷积神经网络特征的区域方法

加州大学伯克利分校 (UC Berkeley) 提出的R-CNN提高了对象检测~50%,一个三阶段的方法:
– 不同区域提出不同的提案,然后提取可能的对象(最常用的是选择性搜索算法);
– 用CNN从区域提取特征;
– 用SVM对区域进行分类。

R-CNN架构:Girshick, Ross, et al. "用于准确的目标检测和语义分割的丰富特征层次结构" 2014.

虽然它取得了很大的成绩,但训练R-CNN有很多问题。你必须为训练数据生成提案,再将CNN的特征提取应用到每一个区域,最后训练SVM分类器。

快速R-CNN (Fast R-CNN)

R-CNN很快就彻底升级成深度学习方法。一年后,Ross Girshick(现在在微软)发表了快速R-CNN。和R-CNN相似,它使用选择性搜索生成对象的提案。但是与R-CNN不同的是,R-CNN独立地提取各区域的所有特征,然后使用SVM分类器;Fast R-CNN在整个图片上使用CNN,然后对特征映射使用“兴趣区域” (Region of Interest, RoI) 池化,最后使用前馈网络进行分类和回归。这种方法不仅速度更快,而且具有RoI池化层和全连接层,这使模型具有端到端的可微性并且更容易训练。Fast R-CNN最大的缺点是,模型仍然依赖于选择性搜索(或其他区域方案算法),这使推断成为了它的瓶颈。

Girshick, Ross. "Fast R-CNN" 2015.

YOLO (You Only Look Once: Unified, Real-Time Object Detection) 只看一次:统一实时对象检测

不久之后,Joseph Redmon发布了统一实时对象检测 (YOLO) 的论文。YOLO提出了一种简单的卷积神经网络方法,其结果和速度都很好,并且是第一次允许实时的对象检测。

Redmon, Joseph, et al. "You only look once: Unified, real-time object detection." 2016.

更快的R-CNN (Faster R-CNN)

随后R-CNN系列迎来了第三次迭代:更快的R-CNN。它添加了区域提案网络 (Region Proposal Network, RPN),摆脱了选择性搜索算法,并可以做到端到端的训练。RPNs的任务是基于objectness分数输出对象,然后用RoI池化 (RoI Pooling) 和完全连接层分类。具体细节本文就先不涉及了。

Ren, Shaoqing, et al. "Faster R-CNN: Towards real-time object detection with region proposal networks." 2015.

SSD和R-FCN

最后,有两篇著名的论文:单镜头探测器 (Single Shot Detector, SSD),它使用了YOLO和多尺寸的卷积功能地图,达到了更好的结果和速度;以及基于区域的完全卷积网络(Region-based Fully Convolutional Networks, R-FCN),它采用了Faster R-CNN结构中的卷积网络部分。

数据的重要

正如我在对深度学习的一点看法中所写的那样,深度学习是非常依赖于海量的数据的。在对象检测的研究中,数据同样扮演着非常重要(有时却被低估)的角色。每当一个新的数据集发布后,就会有雨后春笋般的论文发布和新的模型或模型改进。不幸的是,并没有那么多的数据集用于对象检测。公司可能不愿意免费捐赠它们拥有的数据,而大学也没有这么多的资源。

一些用于对象检测的数据集

结论

综上所述,很多对象检测的新方法和新应用推动了深度学习最前沿的科技发展。本文只是对象检测的概述,希望能给大家带来一些新鲜有用的知识。
鄙人不是专业的翻译官,很多地方可能翻译得不够信达雅,希望看官见谅。谢谢支持!


我们将了解ImageAI的确切含义以及如何使用它执行对象检测。

图像AI

ImageAI是一个Python库,旨在使开发人员能够使用几行简单的代码来构建具有独立的深度学习和计算机视觉功能的应用程序和系统。ImageAI包含Python实现的几乎所有最新的深度学习算法,例如TinyYOLOv3。

ImageAI利用了几种脱机工作的API-它具有对象检测,视频检测和对象跟踪API,无需访问互联网即可调用它们。ImageAI利用了预先训练的模型,可以轻松地进行定制。


课程

R语言数据分析挖掘必知必会

从数据获取和清理开始,有目的的进行探索性分析与可视化。让数据从生涩的资料,摇身成为有温度的故事。

立即参加

设置环境

要使用ImageAI,您需要安装一些依赖项。第一步是在计算机上安装Python。

TensorFlow

$ pip install tensorflow

OpenCV

$ pip install opencv-python

keras

$ pip install keras

imageAI

$ pip install imageAI

现在下载TinyYOLOv3模型文件,该文件包含将用于对象检测的分类模型。

使用ImageAI执行对象检测

现在,让我们看看如何实际使用ImageAI库。我将逐步解释如何使用ImageAI构建第一个对象检测模型。

第1步

我们的第一个任务是创建必要的文件夹。对于本教程,我们需要以下文件夹:

  • 对象检测:根文件夹
  • 模型:存储预先训练的模型
  • 输入:存储要在其上执行对象检测的图像文件
  • 输出:存储带有检测到的对象的图像文件

创建文件夹后,Object detection文件夹应包含以下子文件夹:

├── input
├── models
└── output

3 directories, 0 files

第2步

打开用于编写Python代码的首选文本编辑器,然后创建一个新文件detector.py

第3步

ObjectDetection从ImageAI库导入类。

from imageai.Detection import ObjectDetection

第四步

现在,您已经导入了imageAI库和ObjectDetection该类,下一步是创建该类的实例ObjectDetection,如下所示:

detector = ObjectDetection()

第5步

让我们从输入图像,输出图像和模型指定路径。

model_path = "./models/yolo-tiny.h5"
input_path = "./input/test45.jpg"
output_path = "./output/newimage.jpg"

第6步

我们现在可以从该类中调用各种函数。该类包含以下功能调用预先训练模式:setModelTypeAsRetinaNet()setModelTypeAsYOLOv3(),和setModelTypeAsTinyYOLOv3()

就本教程而言,我将使用预训练的TinyYOLOv3模型,因此,我们将使用该setModelTypeAsTinyYOLOv3()函数加载模型。

detector.setModelTypeAsTinyYOLOv3()

步骤7

接下来,我们将调用函数setModelPath()。此函数接受一个字符串,其中包含预训练模型的路径:

detector.setModelPath(model_path)

步骤8

此步骤loadModel()detector实例中调用函数。它使用setModelPath()类方法从上面指定的路径加载模型。

detector.loadModel()

步骤9

要检测图像中的对象,我们需要detectObjectsFromImage使用detector在上一节中创建的对象来调用函数。

此函数需要两个参数:input_imageoutput_image_pathinput_image是我们正在检测的图像所在的路径,而output_image_path参数是将图像与检测到的对象一起存储的路径。此函数返回一个字典,其中包含图像中检测到的所有对象的名称和百分比概率。

detection = detector.detectObjectsFromImage(input_image=input_path, output_image_path=output_path)

第10步

可以通过遍历字典中的每个项目来访问字典项目。

for eachItem in detection:
    print(eachItem["name"] , " : ", eachItem["percentage_probability"])

在输出中,您可以看到每个检测到的对象的名称及其百分比概率,如下所示:
输出

car  :  54.72719073295593
car  :  58.94589424133301
car  :  62.59384751319885
car  :  74.07448291778564
car  :  91.10507369041443
car  :  97.26507663726807
car  :  97.55765795707703
person  :  53.6459743976593
person  :  56.59831762313843
person  :  72.28181958198547

原始图片:

原始图像“ test45”如下所示:

带有对象检测的图像:

检测到对象后,生成的图像如下所示:

可以看到ImageAI在图像中成功识别了汽车和人员。

结论

对象检测是最常见的计算机视觉任务之一。本文通过示例说明如何使用ImageAI库在Python中执行对象检测。


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds