前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ImageAI:专为没有机器学习背景的程序员设计,让你十行代码搞定对象检测

ImageAI:专为没有机器学习背景的程序员设计,让你十行代码搞定对象检测

作者头像
AiTechYun
发布2018-07-27 11:45:04
8700
发布2018-07-27 11:45:04
举报
文章被收录于专栏:ATYUN订阅号ATYUN订阅号

AiTechYun

编辑:yxy

计算机视觉是AI的一个重要领域。计算机视觉是计算机和软件系统的科学,能够识别和理解图像和场景。计算机视觉还包括图像识别,对象检测,图像生成,图像超分辨率等多个方向。由于实际使用案例数量众多,对象检测可能是计算机视觉最深刻的一个方向。在本教程中,我将简要介绍现代对象检测的概念,软件开发人员面临的挑战,我的团队提供的解决方案以及用于执行高性能对象检测的代码教程。

对象检测是指计算机和软件系统在图像或场景中定位对象并识别每个对象的能力。它已广泛用于人脸检测,车辆检测,行人计数,网络图像,安全系统和无人驾驶汽车。在实践的许多领域中,也有很多可以使用对象检测的方法。像其他任何计算机技术一样,计算机程序员和软件开发人员的努力肯定会带来创造性的、令人惊叹的对象检测应用。

在应用程序和系统中使用现代对象检测方法,以及基于这些方法构建新应用程序并不是一项简单的任务。对象检测的早期实现包括使用经典算法,比如,现阶段流行计算机视觉库OpenCV中支持的算法。然而,这些经典算法工作在不同条件下可能无法达到的足够好性能。

2012年深度学习的突破,带来了R-CNN,Fast-RCNN,Faster-RCNN,RetinaNet等现代高精度对象检测算法和方法,以及SSD和YOLO等快速高精度的对象检测算法和方法。使用这些基于机器学习或深度学习的方法和算法需要对数学和深度学习框架有足够的理解。有数百万计的专业计算机程序员和软件开发人员想要集成和创建使用对象检测的新产品。但是,由于理解并实际使用它的曲折和复杂,这种技术他们无法使用。

我的团队几个月前就意识到了这个问题,这就是为什么我(Moses Olafenwa)和John Olafenwa创建了ImageAI。ImageAI是一个Python库,它能够让程序员和软件开发人员只敲几行代码就可以轻松地将最新的计算机视觉技术集成到他们现有的或者新的应用程序中。

ImageAI链接:https://github.com/OlafenwaMoses/ImageAI

要使用ImageAI执行对象检测,你首先需要:

  1. 在你的计算机系统上安装Python
  2. 安装ImageAI及其依赖项
  3. 下载对象检测模型文件
  4. 运行示例代码(仅仅10行)

现在让我们开始吧。

1)从官方Python语言网站下载并安装Python 3

https://python.org

2)通过pip安装以下依赖项:

1. Tensorflow

pip install tensorflow

2. Numpy

pip install numpy

3. SciPy

pip install scipy

4. OpenCV

pip install opencv-python

5. Pillow

pip install pillow

6. Matplotlib

pip install matplotlib

6. H5py

pip install h5py

7. Keras

pip install keras

8. ImageAI

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

3) 通过下方链接下载用于对象检测的RetinaNet模型文件。

链接:https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5

现在,你已经安装了依赖关系,可以编写第一个对象检测的代码了。创建一个Python文件并为其命名(例如,FirstDetection.py),然后写入下方代码。将RetinaNet模型文件和要检测的图像复制到包含python文件的文件夹中。

FirstDetection.py:

代码语言:javascript
复制
from imageai.Detectionimport ObjectDetection
代码语言:javascript
复制
import os
代码语言:javascript
复制
代码语言:javascript
复制
execution_path= os.getcwd()
代码语言:javascript
复制
代码语言:javascript
复制
detector= ObjectDetection()
代码语言:javascript
复制
detector.setModelTypeAsRetinaNet()
代码语言:javascript
复制
detector.setModelPath( os.path.join(execution_path ,"resnet50_coco_best_v2.0.1.h5"))
代码语言:javascript
复制
detector.loadModel()
代码语言:javascript
复制
detections= detector.detectObjectsFromImage(input_image=os.path.join(execution_path ,"image.jpg"), output_image_path=os.path.join(execution_path ,"imagenew.jpg"))
代码语言:javascript
复制
代码语言:javascript
复制
for eachObjectin detections:
代码语言:javascript
复制
    print(eachObject["name"]+ " : " + eachObject["percentage_probability"] )

然后运行代码,等待显示在控制台中的结果。结果打印到控制台后,进入FirstDetection.py所在的文件夹,你会发现保存下来的新图像。看看下面的2个图像样本,以及在对象检测后保存新图像。

检测前:

检测后:

上图的控制台结果:

person : 55.8402955532074

person : 53.21805477142334

person : 69.25139427185059

person : 76.41745209693909

bicycle : 80.30363917350769

person : 83.58567953109741

person : 89.06581997871399

truck : 63.10953497886658

person : 69.82483863830566

person : 77.11606621742249

bus : 98.00949096679688

truck : 84.02870297431946

car : 71.98476791381836

上图的控制台结果:

person : 71.10445499420166

person : 59.28672552108765

person : 59.61582064628601

person : 75.86382627487183

motorcycle : 60.1050078868866

bus : 99.39600229263306

car : 74.05484318733215

person : 67.31776595115662

person : 63.53200078010559

person : 78.2265305519104

person : 62.880998849868774

person : 72.93365597724915

person : 60.01397967338562

person : 81.05944991111755

motorcycle : 50.591760873794556

motorcycle : 58.719027042388916

person : 71.69321775436401

bicycle : 91.86570048332214

motorcycle : 85.38855314254761

现在,我们解释一下这10行代码的工作原理。

代码语言:javascript
复制
from imageai.Detectionimport ObjectDetection
代码语言:javascript
复制
import os
代码语言:javascript
复制
代码语言:javascript
复制
execution_path= os.getcwd()

在上述3行中,我们在第一行导入了ImageAI对象检测类,在第二行导入了python的os类并在第三行定义了一个变量来保存我们的python文件。RetinaNet模型文件和图像所在的文件夹的路径。

代码语言:javascript
复制
detector= ObjectDetection()
代码语言:javascript
复制
detector.setModelTypeAsRetinaNet()
代码语言:javascript
复制
detector.setModelPath( os.path.join(execution_path ,"resnet50_coco_best_v2.0.1.h5"))
代码语言:javascript
复制
detector.loadModel()
代码语言:javascript
复制
detections= detector.detectObjectsFromImage(input_image=os.path.join(execution_path ,"image.jpg"), output_image_path=os.path.join(execution_path ,"imagenew.jpg"))

在上面的5行代码中,我们在第一行中定义了对象检测类,在第二行中将模型类型设置为RetinaNet,第三行中将模型路径设置为RetinaNet模型的路径,第四行中将模型加载到的对象检测类,然后在第五行调用检测函数并解析输入图像路径和输出图像路径。

代码语言:javascript
复制
for eachObjectin detections:
代码语言:javascript
复制
    print(eachObject["name"]+ " : " + eachObject["percentage_probability"] )

在上面的两行代码中,第一行我们迭代detector.detectObjectsFromImage函数返回的所有结果,然后在第二行中打印出在图像中检测到的每个对象上模型的名称和概率的百分比。

ImageAI支持许多强大的对象检测过程定制。比如能够提取图像中检测到的每个物体的图像。通过简单地解析detectObjectsFromImage函数中的额外参数extra_detected_objects = True,如下所示,对象检测类将为图像对象创建一个文件夹,提取每个图像,将每个图像保存到新创建的文件夹中,并返回一个包含每个图像路径的额外数组。

代码语言:javascript
复制
detections, extracted_images= detector.detectObjectsFromImage(input_image=os.path.join(execution_path ,"image.jpg"), output_image_path=os.path.join(execution_path ,"imagenew.jpg"), extract_detected_objects=True)

让我们将它应用到第一张图片,并看一下结果:

行人的所有照片都被剔除了。之所以没有包含他们,是因为这会占用不必要的空间。

ImageAI为对象检测任务的定制和产品部署提供了许多有用的功能。如:

– 调整最小概率:默认情况下,检测到概率百分比小于50的对象不会显示或报告。你可以为高确定性案例增加此值,或者在需要检测所有可能对象的情况下降低此值。

– 自定义对象检测:使用我们提供的CustomObject类,可以使检测类报告一个或几个特定对象的检测结果。

– 检测速度:通过将检测速度设置为“fast”,“faster”和“fastest”,你可以缩短检测图像所需的时间。

– 输入类型:你可以指定并解析图像的文件路径、Numpy数组或图像的文件流作为输入图像

– 输出类型:你可以指定detectObjectsFromImage函数应该以文件或Numpy数组的形式返回图像

你可以在官方GitHub中找到有关如何使用上述功能以及ImageAI中包含的其他计算机视觉功能的所有详细信息和文档。

GitHub:https://github.com/OlafenwaMoses/ImageAI

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ATYUN订阅号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档