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

什么是目标检测

目标检测关注图像中特定的物体目标,需要同时解决解决定位(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 -------------------

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

附录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Winodws live writer

发布一篇试试。 转载于:https://www.cnblogs.com/DotNetCSharp/p/4742956.html

java里面value_「Java基础知识」Java中包含哪些运算符

原标题:「Java基础知识」Java中包含哪些运算符在Java中包含的运算符有:算数运算符,逻辑运算符,关系运算符等。算数运算符也就是我们平时的加减乘除余等操作:在Java中都是将右边的值赋值给左边,所以一般格式…

三元组法矩阵加法java_计算机视觉学习笔记(2.1)-KNN算法中距离矩阵的计算

本笔记系列以斯坦福大学CS231N课程为大纲,海豚浏览器每周组织一次授课和习题答疑。具体时间地点请见微信公众号黑斑马团队(zero_zebra)和QQ群(142961883)发布。同时课程通过腾讯课堂(百纳公开课)进行视频直播.欢迎参与…

[转]Java常用概念解答

1. 事务是什么? 事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、 一致性、隔离性和持久性)属性,只有这样才能成为一个事务: 原子性 事务必须是原子…

idea maven创建java项目_新版本IntelliJ IDEA 构建maven,并用Maven创建一个web项目(图文教程)...

之前都没试过用maven来管理过项目,但是手动找包导包确实不方便,于是今天用2016版的IDEA进行了maven的初尝试。打开IDEA,创建新项目:然后选择Maven,以及选择自己电脑的jdk:接下来自定义GroupId以及ArtifactI…

Linux 格式化磁盘命令mkfs

linux格式化磁盘命令mkfs指令:mkfs使用权限 : 超级使用者使用方式 : mkfs [-V] [-t fstype] [fs-options] filesys [blocks] [-L Lable]说明 : 建立 linux 档案系统在特定的 partition 上参数 :device : 预备检查的硬盘 partition…

servlet 返回可访问文件_JavaWeb技术(4):Servlet的理解(上)

我们在开发中无时无刻都在与Servlet进行接触,只是因为框架的封装性,我们很少直接地去操作servlet,但再怎么封装,基本的思路都不会变化,变得只是实现的方式,Servlet是什么:网上的回答基本是Servl…

java ldap 分页_具有从属引用的 LDAP 分页查询未正确处理

具有从属引用的 LDAP 分页查询未正确处理09/14/2020本文内容本文提供了一些方法来避免使用从属引用的 LDAP 分页查询未正确处理的问题。原始产品版本: Windows 8原始 KB 编号: 2561166症状你有一个应用程序,使用 ldap_search_ext 或 ldap…

js分家效应

(原创文章,转载请注明出处) 有继承,那么就有分家。让我们看以下例子。 var parents function(){}parents.prototype.money 200;var children function(){}children.prototype new parents();var parent new parents();var ch…

如何设置打印的时候不加上页面链接_excel表格的这10个打印小技巧,办公室财务人员记得收藏...

打印工作表是日常工作中最常见的一个工作,也是Excel在工作中最常用的一个地方,如何做到快速准确地打印文件呢。今天文理会计小编给大家从网上整理了几个打印文件的小技巧。1、打印标题打印的工作表的数据有好多页的时候,为了查看方便&#xf…

java sql objects_第十五章-简书.sql

-- ## 练习1-- 1. 创建一个视图,通过该视图可以查询到工资在2000-5000内并且姓名中包含有A的员工编号,姓名,工资。create or replace view viewSal2k_5kas select empno,ename,sal from empwhere sal between 2000 and 5000and ename like %A…

rabbitmq 拉取消息太慢_面试官:消息队列这些我都要问

作者:mousycodersegmentfault.com/a/1190000021054802消息队列连环炮项目里怎么样使用 MQ 的?为什么要使用消息队列?消息队列有什么优点和缺点?kafka,activemq,rabbitmq,rocketmq 都有什么去呗?如何保证消息队列高可用…

java 星期顺序_第8周 【项目3-顺序串算法】

/**Copyright (c)2017,烟台大学计算机与控制工程学院*All rights reservrd.*作者:李欣豪*完成时间:2017年12月14日*版本号:v1.0*问题描述:采用顺序存储方式存储串,实现下列算法并测试:(1)试编写算法实现将…

[ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify uniq

angularjs 使用ng-repeat报错 <div ng-init"words [高校,高校,高校]" ng-repeat"word in words">{{word}} </div> [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use track by expression to specify unique keys 发现是因为相…

java 并列排名,178. 分数排名

题目描述编写一个 SQL 查询来实现分数排名。如果两个分数相同&#xff0c;则两个分数排名(Rank)相同。请注意&#xff0c;平分后的下一个名次应该是下一个连续的整数值。换句话说&#xff0c;名次之间不应该有“间隔”。-----------| Id | Score |-----------| 1 | 3.50 || 2 |…

编写高质量代码改善C#程序的157个建议——建议130:以复数命名枚举类型,以单数命名枚举元素...

建议130&#xff1a;以复数命名枚举类型&#xff0c;以单数命名枚举元素 枚举类型应该具有负数形式&#xff0c;它表达的是将一组相关元素组合起来的语义。比如&#xff1a; enum Week{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday} 在这里&#xff0c;Week对于星…

python 定义变量_第三章(第2节):变量和常量

变量的概念基本上和初中代数的方程变量是一致的&#xff0c;只是在计算机程序中&#xff0c;变量不仅可以是数字&#xff0c;还可以是任意数据类型&#xff0c;比如我们上节课刚刚学过的基本数据类型或者我们后面要学的自定义数据类型。所谓常量就是不能改变的变量&#xff0c;…

OpenStack Weekly Rank 2015.08.24

Module  Reviews  Drafted Blueprints  Completed Blueprints  Filed Bugs  Resolved Bugs Cinder  5      1          1            6       13 Swift   10     N/A         N/A           8   …

php如何判断是否新数据类型,php中如何判断变量的数据类型呢?

摘要:下文讲述PHP中判断变量数据类型的方法分享&#xff0c;如下所示&#xff1b;实现思路:方式1&#xff1a;使用gettype函数返回变量的数据类型gettype函数可返回"boolean”、“integer”、“double”(float类型会返回“double”&#xff0c;而非“float”)、“string”…

pytorch卷积神经网络_资源|卷积神经网络迁移学习pytorch实战推荐

点击上方“AI遇见机器学习”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达一、资源简介这次给大家推荐一篇关于卷积神经网络迁移学习的实战资料&#xff0c;卷积神经网络迁移学习简单的讲就是将一个在数据集上训练好的卷积神经网络模型通过简单的调整快速移…