Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用这个Python库,10行代码搞定图像中目标检测

用这个Python库,10行代码搞定图像中目标检测

作者头像
CDA数据分析师
发布于 2021-03-09 09:33:59
发布于 2021-03-09 09:33:59
4.4K00
代码可运行
举报
文章被收录于专栏:CDA数据分析师CDA数据分析师
运行总次数:0
代码可运行

来源:Python专栏

作者:Moses Olafenwa

原文:

https://towardsdatascience.com/object-detection-with-10-lines-of-code-d6cb4d86f606


目标检测是指计算机和软件系统对图像或场景中的目标进行定位和识别的任务。

目标检测已广泛应用于人脸检测、车辆检测、人流量统计、网络图像、安防系统和无人驾驶等多个领域。

早期目标检测的实现基于经典算法,比如流行的计算机视觉库OpenCV中支持的算法。然而,这些经典算法在不同的条件下无法获得稳定的性能。

2012年深度学习的突破性进展和迅速普及,使得R-CNN、Fast-RCNN、Faster-RCNN、RetinaNet以及快速、高度准确的SSD、YOLO等目标检测算法应运而生。

这些基于深度学习、机器学习的算法,需要一定的数学以及深度学习框架基础。有数百万的专业计算机程序员和软件开发人员想要集成和创建基于目标检测算法的新产品。同时由于理解和实际使用较为复杂,一直无法实现。如何开发出高效的目标检测代码呢?

ImageAI就应运而生了。

01 ImageAI让代码变得简洁

ImageAI是一个python库,只需要几行代码,就可以让程序员和软件开发人员轻松地将最先进的计算机视觉技术集成到他们现有的或新的应用中,ImageAI已经在Github上开源。

Github地址:

https://github.com/OlafenwaMoses/ImageAI

ImageAI目前支持使用在ImageNet-1000数据集上训练的4种不同机器学习算法进行图像预测和训练。

ImageAI还支持使用在COCO数据集上训练的RetinaNet,YOLOv3和TinyYOLOv3进行对象检测,视频检测和对象跟踪。最后,ImageAI允许训练自定义模型,以执行新目标的检测和识别。

ImageAI库有依赖其他Python库,所以在使用ImageAI开发之前还需要导入其他的包。

02 准备工作

使用ImageAI实现目标检测,只需进行以下4步:

  1. 在你的电脑上安装Python
  2. 安装ImageAI,配置依赖环境
  3. 下载目标检测模块文件
  4. 运行样例代码(只需10行)

下面一步步详细展开:

(1)从Python官网下载并安装Python3

链接地址:

https://python.org

(2)用pip命令安装以下依赖包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install tensorflow
pip install numpy
pip install scipy
pip install opencv-python
pip install pillow
pip install matplotlib
pip install h5py
pip install keras
pip3 install imageai --upgrade

注意:第一次安装ImageAI库,需要下载对应版本的.whl文件,Python3的环境需要下载imageai-2.0.2-py3-none-any.whl 文件,然后转移到相应的文件夹下,执行如下命令即可安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install imageai-2.0.2-py3-none-any.whl

.whl文件链接地址:

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

(3)下载用于目标检测的RetinaNet模型文件

链接地址:

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

03 开启10行代码的目标检测

到这里你已经安装好了所有的依赖项,可以开始编写你的第一个目标检测的代码了。

创建一个Python文件并命名(如FirstDetection.py),然后将下面的代码写入该文件。将RetinaNet模型文件和要检测的图像复制到包含Python文件的文件夹中。

FirstDetection.py:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()
detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"))

for eachObject in detections:   
    print(eachObject["name"] , " : " , eachObject["percentage_probability"] )

然后运行代码,等待结果输出。结果显示后,就可以在FirstDetection.py所在的文件夹下找到保存下来的新图像。

下面有两个新图像的示例。

目标检测前:

目标检测后:

在Spyder编译器中运行结果如下所示:

输出的目标检测精度结果:

person : 57.20391869544983

person : 52.57977843284607

person : 70.81094980239868

person : 76.99859142303467

person : 79.40077781677246

bicycle : 81.0384213924408

person : 83.66722464561462

person : 89.41188454627991

truck : 60.61040759086609

person : 69.65749859809875

bus : 97.92424440383911

truck : 83.94358158111572

car : 72.50492572784424

在Spyder编译器中运行结果如下所示:

输出的目标检测精度结果:

person : 62.45866417884827

person : 58.67737531661987

person : 69.44932341575623

person : 71.84218168258667

person : 59.53381657600403

person : 54.65759038925171

motorcycle : 65.84504842758179

bus : 99.40318465232849

car : 72.41445779800415

person : 58.32530856132507

person : 54.449981451034546

person : 80.11815547943115

person : 74.30745959281921

person : 77.78302431106567

person : 71.15439772605896

bicycle : 69.92427110671997

person : 66.17957353591919

bicycle : 90.50283432006836

motorcycle : 94.09030675888062

04

代码解读

下面来解释一下这10行代码的工作原理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from imageai.Detection 

import ObjectDetectionimport 

osexecution_path = os.getcwd()

在以上3行代码中,在第一行导入了ImageAI的目标检测类;在第二行导入了Python的os类;在第三行中定义了一个变量,保存Python文件、RetinaNet模型文件以及图像所在文件夹的路径。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
detector=ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()
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
代码运行次数:0
运行
AI代码解释
复制
for eachObject in detections:
    print(eachObject["name"] , " : " , eachObject["percentage_probability"] )

在以上两行代码中,第一行用来对detector.detectObjectsFromImage 函数返回的所有结果进行迭代,第二行用来输出图片中检测到的每个目标的名字及其概率。

05

自定义目标检测

除此外,ImageAI也支持强大的自定义目标检测。其中之一是能够提取图像中检测到的每个物体。只需要将参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
extract_detected_objects=True

传入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
detectObjectsFromImage

函数中,如下所示,目标检测类将为图像对象创建一个文件夹,提取每个图像,将每个子图像保存到创建的新文件夹中,并返回一个包含每个图像路径的数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

将其应用到第一张图片上,得到如下结果:

所有行人都被很好地提取了出来,为了节约空间这里只显示了一部分。

06

ImageAI的其他功能

ImageAI提供了许多功能,可用于目标检测任务的自定义和部署。其支持的功能包括:

  • 调整最小概率:默认情况下,概率小于50%的物体不会显示。对于需要高精度的情况,可以增加此值;对于需要检测所有可能对象的情况,可以减少此值。
  • 自定义目标检测:通过提供的CustomObject类,可以使检测类检测一个或几个特定目标。
  • 检测速度:通过将检测速度设置为“fast”、“faster”或“fastest”,可以减少检测图像所需的时间。
  • 输入类型:可指定并解析图像的文件路径,以Numpy数组或图像文件流作为输入
  • 输出类型:可指定detectObjectsFromImage函数以文件或Numpy数组的形式返回图像

以上便是ImageAI这个目标检测库的介绍和演示。

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

本文分享自 CDA数据分析师 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
安装Docker启动失败,A dependency job for docker.service failed.
用户1392128
2024/01/08
9930
(centos7)安装elasticsearch6.4.2
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/09/18
4260
centos7 minimal 虚拟机 配置网络
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/09/18
1.1K0
centos7 minimal  虚拟机 配置网络
CentOS7 Python 前期准备1——开启SSH,Xshell链接
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
MyJie
2019/11/20
8400
CentOS7 Python 前期准备1——开启SSH,Xshell链接
centos7-关闭防火墙
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/09/17
1.5K0
(centos7)安装java1.8
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/09/18
8020
centos7 启动docker失败的解决
控制端使用yum install docker安装完成docker后启动docker失败,出现以下信息:
用户1212940
2022/04/13
9610
centos7 启动docker失败的解决
B站:5. docker 启动 mongodb
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/11/04
4770
快速学习Docker-Docker基本概念与安装
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/11/04
3580
centos7搭建dns服务器dnsmasq
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/11/12
1.3K0
Centos7下rc.local文件开机不执行…
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
拓荒者
2019/09/12
1.3K0
Centos7下rc.local文件开机不执行…
Centos7安装时遇到的问题及解决方法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
云雀叫了一整天
2019/10/22
1.1K0
Centos7安装时遇到的问题及解决方法
centos7-gitlab平台搭建
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/09/17
6130
(centos)mongo的安装和基本使用
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/09/18
6380
springboot工程maven打包时,如果有依赖工程总是报找不到,解决办法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
用户1212940
2019/11/21
4.3K1
B站:3.搭建MySQL server
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/11/04
6160
腾讯云服务器Linux系统--安装Tomcat
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
营琪
2019/11/04
36.3K1
(centos)yum配置保存package包
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/09/18
7490
一行命令安装docker和docker-compose(CentOS7)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
程序员欣宸
2019/10/22
9930
CentOS7默认安装的/home中转移空间到根目录
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
拓荒者
2019/08/22
2.4K0
相关推荐
安装Docker启动失败,A dependency job for docker.service failed.
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验