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

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

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

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

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

ImageAI就应运而生了。

01、ImageAI让代码变得简洁

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

Github地址:

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

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

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

02、准备工作

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

在你的电脑上安装Python

安装ImageAI,配置依赖环境

下载目标检测模块文件

运行样例代码(只需10行)

下面一步步详细展开:

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

链接地址:

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

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 文件,然后转移到相应的文件夹下,执行如下命令即可安装:

pip install imageai-2.0.2-py3-none-any.whl

.whl文件链接地址:

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

链接地址:

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

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

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

FirstDetection.py:

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行代码的工作原理:

from imageai.Detection

import ObjectDetectionimport

osexecution_path = os.getcwd()

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

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模型的路径;在第四行中将模型加载到目标检测类的实例中;在第五行中调用检测函数,并将文件输入输出路径作为参数传入。

for eachObject in detections:

print(eachObject["name"] , " : " , eachObject["percentage_probability"] )

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

05、自定义目标检测

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

extract_detected_objects=True

传入

detectObjectsFromImage

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

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数组的形式返回图像

python包裹和运费_这个Python库真的太好用了,10行代码就能轻松搞定目标检测相关推荐

  1. python包裹和运费_关于Python中包裹传参和解包裹的理解

    那么打印的结果呢,是这样的: 根据函数的定义,我们知道,打印的第一行是传入的参数的类型(即type),根据打印结果,我们知道这是一个tuple,即元祖类型.也就是说,当我们在调用这个方法的时候,传入的 ...

  2. 线程导入大数据入库_大数据处理及分析该怎么做?用这款数据分析软件轻松搞定...

    ​对大数据的重视让很多企业都在纷纷寻找更好的大数据处理及分析方法?这款数据分析软件轻松搞定! 一.数据采集 虽然每天互联网都会产生大量的数据,对于企业来讲,要搜集对自己企业有用的数据才是真的大数据.首 ...

  3. 10行Python代码搞定目标检测

    from imageai.Detection import ObjectDetection #导入了 ImageAI 目标检测类 import os execution_path = os.getcw ...

  4. python真的可以减少工作强度_用Python写几行代码,一分钟搞定一天工作量,同事直呼:好家伙!...

    前几天有一个读者说最近要整理几千份文件,头都要整秃了,不知道能不能用Python解决,我们来看一下,你也可以思考一下.由于涉及文件私密所以具体内容已做脱敏处理. 大概是这样,一个文件夹下有多份会议通知 ...

  5. 用Python写几行代码,一分钟搞定一天工作量,同事直呼:好家伙!

    前几天有一个读者说最近要整理几千份文件,头都要整秃了,不知道能不能用Python解决,我们来看一下,你也可以思考一下. 由于涉及文件私密所以具体内容已做脱敏处理. 大概是这样,一个文件夹下有多份会议通 ...

  6. idea uml图怎么画_有了IDEA中的这款插件,流程图、类图轻松搞定,简直神器

    总有童鞋问,这个流程图图怎么绘制的,这个UML类图用什么工具做的等等,今天给大家推荐一款idea插件PlantUml,来帮助大家快速快速完成绘制. PlantUml是什么 PlantUml是一个支持快 ...

  7. echarts 大屏可视化_看似复杂炫酷的数据可视化设计,用这波神器轻松搞定!

    数据大屏与数据可视化 数据可视化是目前对数据展示最常用的方式.数据的可视化设计有助于将复杂的数据,用最易理解的方式展示在用户的面前. 数据可视化在中后台的设计中很常见,通常主要用于分析和决策,对实时性 ...

  8. iframe带了token不显示_不就是登录吗,能有多复杂?sa-token带你轻松搞定多地登陆、单地登录、同端互斥登录...

    前言 在java的世界里,有很多优秀的权限认证框架,如Apache Shiro.Spring Security 等等.这些框架背景强大,历史悠久,其生态也比较齐全. 但同时这些框架也并非十分完美,在前 ...

  9. bmp转换tiff c++代码_如何用Java语言将图像转换为PDF?Spire.PDF for Java轻松搞定

    对于开发人员,在日常工作中经常也会处理许多文档格式,将图像转换为PDF也是常有的事.那么,在Java语言开发中,如何将图像转换为PDF呢? Spire.PDF for Java支持将多种图像格式(例如 ...

最新文章

  1. JavaScript高级应用(二)
  2. python教程:读取.dcm文件,并转化为.jpg格式
  3. ni软件可以卸载吗_最强大的电脑端卸载软件!和你想的一样吗?进来看看!
  4. 修改 Linux 主机名
  5. Mybatis 一对多关联查询collection用法
  6. 【转】在Ubuntu 12.04 上为Virtualbox 启用USB 设备支持--不错
  7. [转] WPF TextBox控件中文字实现垂直居中
  8. 用C#写XML类型的配置文件:
  9. 编程基本功:即使是脚本,也尽量减少硬代码,都使用变量
  10. 你得真心喜欢些什么,才能过好漫长的冬天
  11. MP4提取音频文件,并且转换为16KHz采样率 16 bit
  12. 机器学习之手写字体(digits)识别——利用sklearn实现
  13. 全民拼购系统介绍 全民拼购功能分析
  14. 李宏毅作业七其二 Network Compression (Knowledge Distillation)
  15. 人脸、指纹、虹膜、行为,你需要的人工智能生物识别AI数据集全在这里
  16. 王杰律师成功组建北京鸿盛律师事务所
  17. 自学c程序设计之路,谭浩强第五版,(一)程序设计与c语言
  18. 【AHOI2009】【BZOJ1800】fly 飞行棋
  19. 传感器选型(sensor)
  20. Flutter学习第十四天:Flutter类似于淘宝的首页照片墙功能,让你的界面更加美观灵活?

热门文章

  1. aix下oracle备份脚本,AIX下oracle的自动备份
  2. 关于开源产业的5个真相
  3. 转:开启nginx的gzip压缩的相关参数设置
  4. DataSet读写xml文件
  5. React学习笔记(五) 状态提升
  6. 用canvas实现手写签名功能
  7. MyBatis中![CDATA[ ]]的使用
  8. [ARC061E]すぬけ君の地下鉄旅行 / Snuke's Subway Trip
  9. Robot Framework(十二) javascript基础
  10. UVa11542 - Square(gauss)