当前位置: 首页 > 编程日记 > 正文

基于 Python 环境搭建 - YOLO 实现吸烟行为监测

作者|李秋键

出品|AI科技大本营(ID:rgznai100)

引言

目标检测是一种与计算机视觉和图像处理有关的计算机技术, 用于检测数字图像和视频中特定类别的语义对象 (例如人、建筑物或汽车等), 其在视频安防,自动驾驶, 交通监控, 无人机场景分析和机器人视觉等领域有广阔的应用前景。近年来, 由于卷积神经网络的发展和硬件算力提升, 基于深度学习的目标检测取得了突破性的进展。目前, 深度学习算法已在计算机视觉的整个领域得到广泛采用, 包括通用目标检测和特定领域目标检测. 大多数最先进的目标检测算法都将深度学习网络用作其骨干网和检测网络, 分别从输入图像 (或视频), 分类和定位中提取特征。

目标检测包括分类和定位两方面。目标检测应用领域广泛,包括人脸检测、行人检测、车辆检测等。由于检测物体形状各异,实际场景存在背景复杂、遮挡严重及光照影响等问题,设计高精度的检测模型具有很大挑战。传统的目标检测算法分为3个步骤,如下图所示。

(1)候选区域选择:

通常使用滑动窗口算法,通过不同大小的滑窗在输入图像上划定目标可能存在的区域,对目标进行初步定位。

(2)特征提取:

使用局部二值模式、方向梯度直方图等算法对候选区域进行特征提取。

(3)分类:

通过支持向量机、Adaboost等算法对提取的图像特征进行分类。

传统目标检测算法没有针对性地使用滑动窗口去检测目标,不仅效率低,准确率也不高,而且人工选择的特征对于形状各异的不规则物体鲁棒性较差。随着深度学习技术的发展,利用卷积神经网络提取图像特征,从而实现目标检测,已成为机器视觉领域研究的热点之一。

目前,基于深度学习的目标检测方法主要有两大分支,分别是基于区域提取的两阶段目标检测模型和直接进行位置回归的一阶段目标检测模型。

故本项目通过采用深度学习方法实现对吸烟行为的目标检测,使用python语言搭建YOLO算法实现对吸烟行为的实时监测。其最终实现效果如下图可见:

1、基本介绍

1.1 环境要求

本次环境使用的是python3.6.5+windows平台。主要用的库有:

opencv模块。在计算机视觉项目的开发中,opencv作为较大众的开源库,拥有了丰富的常用图像处理函数库,采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上,能够快速的实现一些图像处理和识别的任务。

numpy模块。numpy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效得多(该结构也可以用来表示矩阵。

pillow模块。PIL是理想的图像存档和批处理应用程序。您可以使用库创建缩略图,在文件格式、打印图像等之间进行转换。它提供了广泛的文件格式支持、高效的内部表示和相当强大的图像处理功能。核心图像库是为快速访问以几种基本像素格式存储的数据而设计的。为通用图像处理工具提供了坚实的基础。

keras模块。Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化 。

1.2 目标检测算法介绍

深度学习目标检测算法大体上可以分为双阶段和单阶段两种,前者需要将整体分为两部分,然后生成识别框分别对两部分进行识别,后者是将整个流程放在一起直接进行检测。

双阶段目标检测算法需要先借助SelectiveSearch选出图像中的候选区域,之后还需要对候选区域进行再次检测,从而得出最后检测结果,比较常用的算法主要有OverFeat、R-CNN、MaskR-CNN等。

单阶段目标检测算法依据的是回归分析思想,所以也被称作回归分析目标检测算法。该算法之所以被称作单阶段目标检测算法是因为该算法不需要生成候选区域,而是直接对整个图像进行检测,从而获得目标位置类别和位置信息,比较常用的检测算法主要有YOLO和SSD。

其中YOLO目标检测算法是考虑到双阶段目标检测算法的检测效率比较低,所以一些学者提出了单阶段目标检测。JosephRedmon等人在2016年的时候提出了由卷积层和FC层构成的YOLO目标检测算法,先要在最顶层特征图中标出边界框,之后就可以对每个类别概率进行预测,最后再激活函数就可以得到最终信息。下图为YOLO的残差网络结构:

2、模型搭建

2.1 初始函数搭建

其中包括YOLO初始化基本参数,初始化类别、获取先验框、计算会话等。

def __init__(self, **kwargs):self.__dict__.update(self._defaults)self.class_names = self._get_class()self.anchors = self._get_anchors()self.sess = K.get_session()self.boxes, self.scores, self.classes = self.generate()
def _get_class(self):classes_path = os.path.expanduser(self.classes_path)with open(classes_path) as f:class_names = f.readlines()class_names = [c.strip() for c in class_names]return class_names
def _get_anchors(self):anchors_path = os.path.expanduser(self.anchors_path)with open(anchors_path) as f:anchors = f.readline()anchors = [float(x) for x in anchors.split(',')]return np.array(anchors).reshape(-1, 2)

2.2 YOLO网络层搭建

YOLO算法将整幅图像分为了多个网格单元,对每个网格中心目标进行检测,该算法不用生成候选区域,在一个卷积网络中就可以完成特征提取、分类回归等任务,检测过程得到了简化,检测速度也变得更快,但该算法对于小尺度目标的检测不够准确,如果图像中存在重叠遮挡等现象就可能出现遗漏。整个网络模型搭建包括DarknetConv2D、 BatchNormalization和 LeakyReLU卷积块的设置以及卷积层特征提取。

def DarknetConv2D(*args, **kwargs):darknet_conv_kwargs = {'kernel_regularizer': l2(5e-4)}darknet_conv_kwargs['padding'] = 'valid' if kwargs.get('strides')==(2,2) else 'same'darknet_conv_kwargs.update(kwargs)return Conv2D(*args, **darknet_conv_kwargs)
def DarknetConv2D_BN_Leaky(*args, **kwargs):no_bias_kwargs = {'use_bias': False}no_bias_kwargs.update(kwargs)return compose( DarknetConv2D(*args, **no_bias_kwargs),BatchNormalization(),LeakyReLU(alpha=0.1))

03、模型调用

常见的目标检测算法常分为三个步骤进行:

第一步:分类,用事前确定好的类别或实例ID对化为信息的图像结构进行描述。

第二步:检测,上一步是对整张图片内容的描述,这一步则需要选定一个物体目标进行检测,获取物体所处位置以及类别信息。

第三步:分割,这一步需要对语义和实例进行分割,并得出像素属于哪个目标物体或哪个场景的结论。

流程为调整输入图像或视频流的尺寸以满足模型规范输入大小,通过模型预测出类别、框体大小和分数。

其中模型调用显示框图代码如下:

def detect_image(self, image):boolen=Falsestart = timer()new_image_size = self.model_image_sizeboxed_image = letterbox_image(image, new_image_size)image_data = np.array(boxed_image, dtype='float32')image_data /= 255.image_data = np.expand_dims(image_data, 0)  # Add batch dimension.out_boxes, out_scores, out_classes = self.sess.run([self.boxes, self.scores, self.classes],feed_dict={self.yolo_model.input: image_data,self.input_image_shape: [image.size[1], image.size[0]],K.learning_phase(): 0})print('Found {} boxes for {}'.format(len(out_boxes), 'img'))font = ImageFont.truetype(font='font/simhei.ttf',size=np.floor(3e-2 * image.size[1] + 0.5).astype('int32'))thickness = (image.size[0] + image.size[1]) // 300small_pic=[]for i, c in list(enumerate(out_classes)):predicted_class = self.class_names[c]box = out_boxes[i]score = out_scores[i]top, left, bottom, right = boxtop = top - 5left = left - 5bottom = bottom + 5right = right + 5top = max(0, np.floor(top + 0.5).astype('int32'))left = max(0, np.floor(left + 0.5).astype('int32'))bottom = min(image.size[1], np.floor(bottom + 0.5).astype('int32'))right = min(image.size[0], np.floor(right + 0.5).astype('int32'))# 画框框label = '{} {:.2f}'.format(predicted_class, score)draw = ImageDraw.Draw(image)label_size = draw.textsize(label, font)label = label.encode('utf-8')if predicted_class=='smoke':boolen=Trueif top - label_size[1] >= 0:text_origin = np.array([left, top - label_size[1]])else:text_origin = np.array([left, top + 1])for i in range(thickness):draw.rectangle([left + i, top + i, right - i, bottom - i],outline=self.colors[c])draw.rectangle([tuple(text_origin), tuple(text_origin + label_size)],fill=self.colors[c])draw.text(text_origin, str(label,'UTF-8'), fill=(0, 0, 0), font=font)del drawend = timer()print(end - start)return image,boolen

完整代码:

链接:

‍‍‍‍https://pan.baidu.com/s/1vmjV1HwhcMOdUqFhKwH4Mg

提取码:pqsv

作者简介:

李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等。

相关文章:

Ubuntu 下安装thttpd Web服务器

不知道大家是不是真的需要用appache这么复杂的功能这么强大的web server,其实有很多时候使用webserver也只是一种远程共享访问的方式。这里,Ubuntu repository的提供了一个简单的web server,名为thttpd,即 tiny http daemon. th…

mysql 新增 删除用户和权限分配

1. 新增用户 mysql>insert into mysql.user(Host,User,Password) values("localhost","lionbule",password("hello1234")); mysql>flush privileges; 2. 修改用户密码 mysql>update mysql.user set passwordpassword(new password)…

简历空空,如何编写一个面试时能拿的出手的真实项目?

最近,新一波的秋招全面开启,各大互联网行业像腾讯、百度、美团、哔哩哔哩,都加入到招聘队伍,秋招面试也进入白热化。作为一名求职者,要想在招聘浪潮中抢先一步,锁定大厂Offer,现在就要着手准备起…

mysql通过查看跟踪日志跟踪执行的sql语句

在SQL SERVER下跟踪sql采用事件探查器,而在mysql下如何跟踪sql呢? 其实方法很简单,开启mysql的日志log功能,通过查看跟踪日志即可。 开启mysql的日志log方法: windows环境下的配置方法: 我使用的版本&#…

用thttpd做Web Server

httpd是busybox中自带的web server,功能弱,不支持认证和CGI。thttpd和boa都支持认证CGI,功能比较全,Boa是一个单任务的小型http服务器,设计的小型系统不要数据库操作,所以可以使用thttpd作为server.1. 编译thttpdccarm…

ii第六单元 文本处理工具

linux中常用的基础命令 diff 命令 patch 命令 grep 命令 Cut 命令 sort 命令 uniq 命令 tr 命令 sed 命1.diff 命令 比较两个文件的不同 用于创建补丁文件 diff -u file file.new >file.path ##生成补丁文件 yum install patch -y ##安装打补丁工具 (1&…

Powershell管理系列(十)邮件联系人及邮件用户的管理

鉴于有些用户不太熟悉邮件联系人、邮件用户的区别,博文首先介绍下用户邮箱、邮件联系人、邮件用户的概念,以下介绍部分博文摘自winos微软中文技术论坛。---------------------------------------------------------------------------------------------…

移植 thttpd Web服务器

从http://www.acme.com/software/thttpd/ 下载thttpd 到/tmp 目录当中,并解压. 编译thttpd [armlocalhost thttpd-2.25b]$ CCarm-linux-gcc ./configure --hostarm-linux [armlocalhost thttpd-2.25b]$ vi Makefile 指定静态链接二进制文件 LDFLAGS -static …

懂外语、会创作,机器高质量学习挑战均在这里实现

编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 近年来人工智能在不断的发展中,机器不仅已经学会了英语写作,也正在学习其它语言。 德国 Aleph Alpha 已经构建了世界上最强大的 AI 语言模型之一。它不仅能说流利的英语&#xf…

JPA 复杂查询 - Querydsl

添加依赖 <!--query dsl --> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>qu…

服务器端开发经验总结 Linux C语言

简介在进行服务器端开发的时候需要考虑一些算法和性能问题&#xff0c;经过了几年的开发&#xff0c;对这方面有了一些经验&#xff0c;现在写下来跟大家分享和讨论。我主要是在Linux下进行C语言的开发&#xff0c;所以后面的实现都是基于Linux操作系统并用C语言来讲解。其它平…

Backbone.js学习笔记 Hello World!

使用Backbone.js 和 MVC 架构创建一个典型的Hello world项目。虽然是“杀鸡用牛刀了”&#xff0c;毕竟是我第一次使用Backbone.js 依赖 jQuery 1.9.1Undersore.js 1.5.0Backbone.js开始 <!doctype html> <html> <head> <meta charset"utf-8"&g…

一文速览机器学习的类别(Python代码)

作者&#xff1a;泳鱼来源&#xff1a;算法进阶机器学习按照学习数据经验的不同&#xff0c;即训练数据的标签信息的差异&#xff0c;可以分为&#xff1a;*监督学习&#xff08;supervised learning&#xff09;*非监督学习&#xff08;unsupervised learning&#xff09;*半监…

Linux下分割与合并文件的方法

Linux下分割与合并文件的方法 切割合并文件在linux下用split和cat就可以完成。下面举些实例进行说明。1.文件切割文件切割模式分为两种&#xff1a; 文本文件 二进制模式。 1.1文本模式 文本模式只适用于文本文件&#xff0c;用这种模式切割后的每个文件都是可读的。文本模式又…

将网站程序放在tmpfs下

将网站程序放在tmpfs下然后用nginx直接做对外服务呢varnish或者squid都是利用内存和它的连接数来做到加速服务.但是如果是squid->nginx->fastcgi->mysql这样当中很多连接是开销在内部的连接之中而且如果客户端请求php.squid还需要将请求再转发至nginx,然后nginx再转发…

docker 连接容器

1.通过端口映射 sudo docker run -d -P training/webapp python app.py 容器有一个内部网络和IP地址&#xff08;在使用Docker部分我们使用docker inspect命令显示容器的IP地址&#xff09; -P 标记创建一个容器&#xff0c;将容器的内部端口随机映射到主机的高端口49000到4990…

新进展!英伟达用 AI 给纪录片配音,情绪语调拿捏得稳稳地

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; AI 已经将合成语音从单调的机器人电话和传统 GPS 导航系统转变为智能手机和智能扬声器中动听的虚拟助手。 虽然日常和Siri、小爱或小度等对话时声音还是很机械&#xff0c;但最新的技术进展显示&#x…

揭开Annotation的面纱

Annotation是Java5、6只后的新特征&#xff08;中文称之为注解&#xff09;&#xff0c;并且越来越多的得到了应用&#xff0c;比如Spring、Hibernate3、Struts2、iBatis3、JPA、JUnit等等都得到了广泛应用&#xff0c;通过使用注解&#xff0c;代码的灵活性大大提高。这些都是…

使用Nginx的proxy_cache缓存功能取代Squid

[文章作者&#xff1a;张宴 本文版本&#xff1a;v1.2 最后修改&#xff1a;2009.01.12 转载请注明原文链接&#xff1a;http://blog.s135.com/nginx_cache/]  Nginx从0.7.48版本开始&#xff0c;支持了类似Squid的缓存功能。这个缓存是把URL及相关组合当作Key&#xff0c;用…

oracle grant 权限

grant connect,resource,dba to user;CONNECT角色&#xff1a; --是授予最终用户的典型权利&#xff0c;最基本的 CREATE SESSION --建立会话 RESOURCE角色&#xff1a; --是授予开发人员的 CREATE CLUSTER --建立聚簇 CREATE …

技术沙龙 | TeaTalk 带你深度探索 SDN 网络技术再创新

越来越多的企业、行业和政府机关顺应企业数字化转型、云服务和国家政策等趋势将业务迁移上云。随着移动云的快速发展&#xff0c;对网络提供差异化的服务能力也提出了很多新的考验。大规模数据中心、虚拟化 SDN 网络技术及超融合软硬一体可编程设备在云网络的应用已成为行业发展…

利用windows 2003实现服务器群集的搭建与架设(一) NLB群集的创建与架设

实验场景&#xff1a;西安凌云系统高科技有限公司利用IIS搭建了一个WEB站点&#xff0c;域名为nlb.angeldevil.com。由于业务的逐渐增加&#xff0c;网站速度也越来越慢&#xff0c;而且经常出现故障&#xff0c;为公司的利益带来了很多的不便&#xff1b;公司决定使用两台WEB站…

nginx 反向代理,动静态请求分离,proxy_cache缓存及缓存清除

一&#xff0c;nginx反向代理配置 #tomcat 显然就是用户访问www.wolfdream.com(需要设置本地localhost&#xff0c;将www.wolfdream.com指向nginx所在IP)的时候(或将www.wolfdream.com直接写在nginx所在的IP地址)&#xff0c;将请求转到到后台的tomcat服务器&#xff0c;即127.…

深度强化学习的前景:帮助机器掌控复杂性

作者&#xff1a;数据实战派 来源&#xff1a;数据实战派深度强化学习&#xff0c;即机器通过测试其行为后果来学习的方法&#xff0c;是人工智能最有前途和影响力的领域之一。它将深度神经网络与强化学习结合在一起&#xff0c;可以通过训练实现多个步骤的目标。它是自动驾驶汽…

成绩转换(15)

#include<stdio.h> int main() {int n;char ch;while(scanf("%d",&n)!EOF){if(n>100||n<0) continue;if(n>90) chA;else if(n>80) chB;else if(n>70) chC;else if(n>60) chD;else chE;printf("%c\n",ch);} }转载于:https://ww…

pangolin最新版 v2.5.2.975

Pangolin是一款帮助渗透测试人员进行Sql注入测试的安全工具。 所谓的SQL注入测试就是通过利用目标网站的某个页面缺少对用户传递参数控制或者控制的不够好的情况下出现的漏洞&#xff0c;从而达到获取、修改、删除数据&#xff0c;甚至控制数据库服务器、Web服务器的目的的测试…

nginx 的proxy_cache才是王道

nginx 的proxy_cache才是性价比最高的缓存,我目前的配置是LiteSpeednginx,可以参考apachenginx将动态内容交给LiteSpeed或apache来处理,然后利用proxy_cache反向代理全部缓存在硬盘,变成静态内容,大家都知道nginx跑静态内容是有多厉害了吧,所以这样就可以小内存跑大PV.但是这样…

Android 占位符 %1$s %1$d

1、整型&#xff0c;比如“我今年23岁了”&#xff0c;这个23是整型的。在string.xml中可以这样写&#xff0c;<string name"old">我今年%1$d岁了</string> 在程序中&#xff0c;使用 [java] view plaincopy String sAgeFormat getResources().getStrin…

谁说技术男不适合养猫!90后程序员2天做出猫咪情绪识别软件

整理 | 王晓曼出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;9月1日&#xff0c;一则关于#程序员2天做出猫咪情绪识别软件#的话题登上微博热搜&#xff0c;参与阅读的人数达到了8218.1万&#xff0c;讨论次数1.3万&#xff0c;引发网友们的热议。高手在民间&#…

符合RESTful的接口规范

把api放在专属域名下&#xff0c;要带版本号 api的url中应该只有名词&#xff0c;和数据库的表或文档资源相对应&#xff1b;对资源&#xff08;collection&#xff09;的具体操作类型则由http方法动词表示 &#xff08;安全性&#xff1a;不改变资源状态&#xff0c;类似只读&…