什么是目标检测

目标检测关注图像中特定的物体目标,需要同时解决解决定位(localization) + 识别(Recognition)。相比分类,检测给出的是对图片前景和背景的理解,我们需要从背景中分离出感兴趣的目标,并确定这一目标的描述(类别和位置),因此检测模型的输出是一个列表,列表的每一项使用一个数组给出检出目标的类别和位置(常用矩形检测框的坐标表示)。

通俗的说,Object Detection的目的是在目标图中将目标用一个框框出来,并且识别出这个框中的是啥,而且最好的话是能够将图片的所有物体都框出来。

目标检测算法

目前目标检测领域的深度学习方法主要分为两类:两阶段(Two Stages)的目标检测算法;一阶段(One Stage)目标检测算法。

Two Stages

首先由算法(algorithm)生成一系列作为样本的候选框,再通过卷积神经网络进行样本(Sample)分类。也称为基于候选区域(Region Proposal)的算法。常见的算法有R-CNN、Fast R-CNN、Faster R-CNN等等。

One Stage

不需要产生候选框,直接将目标框定位的问题转化为回归(Regression)问题处理,也称为基于端到端(End-to-End)的算法。常见的算法有YOLO、SSD等等。

python实现

本文主要讲述如何实现目标检测,至于背后的原理不过多赘述,可以去看相关的论文。

ImageAI是一个简单易用的计算机视觉Python库,使得开发者可以轻松的将最新的最先进的人工智能功能整合进他们的应用。

ImageAI本着简洁的原则,支持最先进的机器学习算法,用于图像预测,自定义图像预测,物体检测,视频检测,视频对象跟踪和图像预测训练。

依赖

Python 3.5.1(及更高版本)

pip3

Tensorflow 1.4.0(及更高版本)

Numpy 1.13.1(及更高版本)

SciPy 0.19.1(及更高版本)

OpenCV

pillow

Matplotlib

h5py

Keras 2.x

安装

命令行安装

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

pip3 install .\imageai-2.1.0-py3-none-any.whl

使用

Image支持的深度学习的算法有RetinaNet,YOLOv3,TinyYoLOv3。ImageAI已经在COCO数据集上预先训练好了对应的三个模型,根据需要可以选择不同的模型。可以通过下面的链接进行下载使用:

以上模型可以检测并识别以下80种不同的目标:

person, bicycle, car, motorcycle, airplane,

bus, train, truck, boat, traffic light, fire hydrant, stop_sign,

parking meter, bench, bird, cat, dog, horse, sheep, cow,

elephant, bear, zebra, giraffe, backpack, umbrella,

handbag, tie, suitcase, frisbee, skis, snowboard,

sports ball, kite, baseball bat, baseball glove, skateboard,

surfboard, tennis racket, bottle, wine glass, cup, fork, knife,

spoon, bowl, banana, apple, sandwich, orange, broccoli, carrot,

hot dog, pizza, donot, cake, chair, couch, potted plant, bed,

dining table, toilet, tv, laptop, mouse, remote, keyboard,

cell phone, microwave, oven, toaster, sink, refrigerator,

book, clock, vase, scissors, teddy bear, hair dryer,

toothbrush

先来看看完整的代码,使用YOLOv3算法对13张照片进行目标识别。

from imageai.Detection import ObjectDetection

import os

detector = ObjectDetection()

detector.setModelTypeAsYOLOv3()

detector.setModelPath("./model/yolo.h5")

detector.loadModel()

path = os.getcwd()

input_image_list = os.listdir(path+"\pic\input")

input_image_list = sorted(input_image_list, key = lambda i:len(i),reverse = False)

size = len(input_image_list)

for i in range(size):

input_image_path = os.path.join(path+"\pic\input", input_image_list[i])

output_image_path = os.path.join(path+"\pic\output", input_image_list[i])

detections, extract_detected_objects = detector.detectObjectsFromImage(input_image=input_image_path,

output_image_path=output_image_path,

extract_detected_objects=True)

print('------------------- %d -------------------' % int(i + 1))

for eachObject in detections:

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

print('------------------- %d -------------------' % int(i + 1))

首先第一行导入ImageAI Object Detection类,在第二行导入os库。

然后创建了ObjectDetection类的新实例,接着就可以选择要使用的算法。分别有以下三个函数:

.setModelTypeAsRetinaNet()

.setModelTypeAsYOLOv3()

.setModelTypeAsTinyYOLOv3()

选择好算法之后就要设置模型文件路径,这里给出的路径必须要和选择的算法一样。

.setModelPath()

- 参数path(必须):模型文件的路径

载入模型。

.loadModel()

- 参数detection_speed(可选):最多可以减少80%的时间,但是会导致精确度的下降。可选的值有: “normal”, “fast”, “faster”, “fastest” 和 “flash”。默认值是 “normal”。

通过os库的函数得到输入输出文件的路径等,这不是本文重点,跳过不表。

开始对图像进行目标检测。

.detectObjectsFromImage()

- 参数input_image(必须):待检测图像的路径

- 参数output_image(必须):输出图像的路径

- 参数parameter minimum_percentage_probability(可选):能接受的最低预测概率。默认值是50%。

- 参数display_percentage_probability(可选):是否展示预测的概率。默认值是True。

- 参数display_object_name(可选):是否展示识别物品的名称。默认值是True。

- 参数extract_detected_objects(可选):是否将识别出的物品图片保存。默认是False。

返回值根据不同的参数也有不同,但都会返回一个an array of dictionaries。字典包括以下几个属性:

* name (string)

* percentage_probability (float)

* box_points (tuple of x1,y1,x2 and y2 coordinates)

前面说过可以识别80种目标,在这里也可以选择只识别自己想要的目标。

custom = detector.CustomObjects(person=True, dog=True)

detections = detector.detectCustomObjectsFromImage( custom_objects=custom, input_image=os.path.join(execution_path , "image3.jpg"), output_image_path=os.path.join(execution_path , "image3new-custom.jpg"), minimum_percentage_probability=30)

首先用定义自己想要的目标,其余的目标会被设置为False。然后配合.detectCustomObjectsFromImage()进行目标检测。

主要的代码基本如上所述,接下来看结果。先看看图片中只有一个目标的效果。

------------------- 10 -------------------

dog : 98.83476495742798 : (117, 91, 311, 360)

dog : 99.24255609512329 : (503, 133, 638, 364)

dog : 99.274742603302 : (338, 38, 487, 379)

------------------- 10 -------------------

效果还是不错的。再看看如果图片中有多个目标识别的结果如何。

------------------- 4 -------------------

book : 55.76887130737305 : (455, 74, 487, 146)

book : 82.22097754478455 : (466, 11, 482, 69)

tv : 99.34800863265991 : (25, 40, 182, 161)

bed : 88.7190580368042 : (60, 264, 500, 352)

cat : 99.54025745391846 : (214, 125, 433, 332)

------------------- 4 -------------------

识别度还是很高的,背后人眼都看不清的书本都能被识别。

附录

python目标识别代码_利用ImageAI库只需几行python代码超简实现目标检测相关推荐

  1. 区块链技术实现只需180行go代码!

    区块链技术实现只需180行go代码! 通过本文,你将可以使用Go创建自己的区块链.理解哈希函数是如何保持区块链的完整性.掌握如何创造并添加新的块.实现多个节点通过竞争生成块.通过浏览器来查看整个链.了 ...

  2. bert获得词向量_只需几行 Python 代码,即可用 BERT 玩转词嵌入!

    作者 | Anirudh_S 译者 | Sambodhi 编辑 | 张之栋 AI 前线导读: 在自然语言处理领域中,诞生于 2018 年末的 BERT 非常的"火热".强悍如 BE ...

  3. python分数类_利用标准库fractions模块让Python支持分数类型的方法详解

    前言 你可能不需要经常处理分数,但当你需要时,Python的Fraction类会给你很大的帮助.本文将给大家详细介绍关于利用标准库fractions模块让Python支持分数类型的相关内容,分享出来供 ...

  4. 利用Python,简单切割音频文件,只需5行代码!

    一直在学的一套美语教程,开头有18秒的音乐,每次都要听一遍,神烦. 索性写个脚本把所有音频开头音乐全部切掉. 参考 http://blog.csdn.net/skywalkerVVV/article/ ...

  5. Python生成动态二维码,只需几行代码,这也太有意思了~

    兄der们,今天我们试试只用几行代码,生成动态二维码! 来吃够~ 模块相关 我们要用到的是,MyQR这个库, 当然,最直接的方式,就是pip install pip install MyQR 参数讲解 ...

  6. python的控件text的文本属性_只需6行Python代码就给图片加上水印——你一看就会了...

    大家在做项目开发的过程中,会不会经常遇到需要处理图片却没有快速有效的工具的情况呢?比如客户需要给图片加上水印,你可能会用到PS这些高级软件去处理,这样虽然有效果但是需要相对较长的时间:作为程序猿,你一 ...

  7. python好看图案的编程代码_只需15行Python代码,实现图像定位功能

    引言本教程使用的环境:Windows 10 + Python 3.6 数据源:The Oxford-IIIT Pet Dataset 需要的第三方库:import tensorflow as tf i ...

  8. 如何让电脑永不息屏?Python:这事我熟,只需5行代码...

    前言 最近新来的小老弟问我,按照公司规定,电脑只有十分钟就锁屏,但是他不想让电脑在空闲十分钟后锁屏. 于是我问他,是不是想挑战一下公司信息安全? 不过小老弟很机智,来了句公司信息安全大于天,他就是想让 ...

  9. 竟可如此轻松解决,PDF 转 Word只需几行 Python 代码

    PDF转Word是一个古老的话题,其难点在于建立从PDF基于元素位置的格式到Word基于内容的格式的映射. PDF文档实际并不存在段落.表格的概念,PDF转Word要做的就是将PDF文档中" ...

最新文章

  1. python 匹配字符串多个_在Python中匹配多个数据集的字符串
  2. 非常精确的测试运行时间(比clock()更精确些)
  3. python 数组 indexof_Javascript Array.lastIndexOf()方法
  4. python中变量不需要事先声明_第二章 Python 变量
  5. Codeforces 1093D Beautiful Graph
  6. java语言_JAVA语言
  7. FFMPEG的详细资料可以在它的官方网站上找到
  8. tomcat不能解析php,tomcat不支持php怎么办
  9. centos挂载windows共享目录
  10. 8_python基础—高级变量类型(字符串、列表、元组、字典、集合)
  11. LeetCode 410. Split Array Largest Sum
  12. 虚拟机中运行windows内核
  13. mstsc远程桌面全频或自定义窗口
  14. Linux 基础入门 04
  15. 分享2个ICON资源链接
  16. 五线谱软件测试初学者,学习五线谱(初学者专用).pdf
  17. java上传微博图床_php上传图片到微博图床
  18. 教你如何做好微信客户管理?做到这3点,效率翻5倍
  19. mysql——关于找不到vrcuntime140.dll与vrcuntime140_1.dll的问题
  20. 手机连接Eclipse连接不上

热门文章

  1. 前端项目 开发者环境 和 正式环境 区别
  2. 64位Windows2003 Enterprise sp2 上64位Oracle10.2.0.1升级到Oracle10.2.0.3具体步骤
  3. java实现map和object互转
  4. common lisp 学习第一天 初步接触
  5. Redis缓存,你真的懂了吗
  6. php对象比较大小,PHP 面向对象:对象的比较
  7. matlab文件序号超出511,求教一段matlab的代码 - 数学 - 小木虫 - 学术 科研 互动社区...
  8. 常用内存分配函数的说明
  9. 微信小程序测试的策略和注意事项
  10. jsonp跨域请求响应结果处理函数(python)