转载请注明作者和出处:https://blog.csdn.net/qq_28810395
运行平台: Windows 10
AIstudio官网:https://aistudio.baidu.com/ --飞桨领航团AI达人创造营

公共场所吸烟检测与EasyEdge部署

  公共场所进行吸烟检测,如果发现有吸烟行为,及时警告并记录。

一、项目背景

  吸烟有害健康

  为减少和消除烟草烟雾危害,保障公众健康,根据国务院立法工作计划,2013年卫生计生委启动了《公共场所控制吸烟条例》起草工作。按照立法程序的有关要求,在总结地方控烟工作经验的基础上,深入调研,广泛征求了工业和信息化部、烟草局等25个部门,各省级卫生计生行政部门、部分行业协会及有关专家的意见,经不断修改完善,形成了《公共场所控制吸烟条例(送审稿)》。送审稿明确,所有室内公共场所一律禁止吸烟。此外,体育、健身场馆的室外观众坐席、赛场区域;公共交通工具的室外等候区域等也全面禁止吸烟。

  但,仍存在公共场合吸烟问题,为此一种无人化、智能化吸烟检测装置的需求迫在眉睫。

二、数据集简介

  本次数据集从浆友公开数据集中获取。

  具体链接为:https://aistudio.baidu.com/aistudio/datasetdetail/94796。

  此处可细分,如下所示:

本项目使用的吸烟检测数据集已经按VOC格式进行标注,目录情况如下:

 dataset/                        ├── annotations/    ├── images/

三、模块导入

  PaddleX。

  项目环境:Paddle 2.1.0

 !pip install paddlex==1.3.11!pip install paddle2onnx

四、解压数据集

# 进行数据集解压
!unzip -oq /home/aistudio/data/data102810/pp_smoke.zip -d /home/aistudio/dataset

五、数据处理和数据清洗

# 这里修改.xml文件中的<path>元素
!mkdir dataset/Annotations1
import xml.dom.minidom
import ospath = r'dataset/Annotations'  # xml文件存放路径
sv_path = r'dataset/Annotations1'  # 修改后的xml文件存放路径
files = os.listdir(path)
cnt = 1for xmlFile in files:dom = xml.dom.minidom.parse(os.path.join(path, xmlFile))  # 打开xml文件,送到dom解析root = dom.documentElement  # 得到文档元素对象item = root.getElementsByTagName('path')  # 获取path这一node名字及相关属性值for i in item:i.firstChild.data = '/home/aistudio/dataset/JPEGImages/' + str(cnt).zfill(6) + '.jpg'  # xml文件对应的图片路径with open(os.path.join(sv_path, xmlFile), 'w') as fh:dom.writexml(fh)cnt += 1
# 这里修改.xml文件中的<failname>元素
!mkdir dataset/Annotations2
import xml.dom.minidom
import ospath = r'dataset/Annotations1'  # xml文件存放路径
sv_path = r'dataset/Annotations2'  # 修改后的xml文件存放路径
files = os.listdir(path)for xmlFile in files:dom = xml.dom.minidom.parse(os.path.join(path, xmlFile))  # 打开xml文件,送到dom解析root = dom.documentElement  # 得到文档元素对象names = root.getElementsByTagName('filename')a, b = os.path.splitext(xmlFile)  # 分离出文件名afor n in names:n.firstChild.data = a + '.jpg'with open(os.path.join(sv_path, xmlFile), 'w') as fh:dom.writexml(fh)
# 这里修改.xml文件中的<name>元素
!mkdir dataset/Annotations3
#!/usr/bin/env python2
# -*- coding: utf-8 -*-import os
import xml.etree.ElementTree as ETorigin_ann_dir = '/home/aistudio/dataset/Annotations2/'# 设置原始标签路径为 Annos
new_ann_dir = '/home/aistudio/dataset/Annotations3/'# 设置新标签路径 Annotations
for dirpaths, dirnames, filenames in os.walk(origin_ann_dir):   # os.walk游走遍历目录名for filename in filenames:# if os.path.isfile(r'%s%s' %(origin_ann_dir, filename)):   # 获取原始xml文件绝对路径,isfile()检测是否为文件 isdir检测是否为目录origin_ann_path = os.path.join(origin_ann_dir, filename)   # 如果是,获取绝对路径(重复代码)new_ann_path = os.path.join(new_ann_dir, filename)tree = ET.parse(origin_ann_path)  # ET是一个xml文件解析库,ET.parse()打开xml文件。parse--"解析"root = tree.getroot()   # 获取根节点for object in root.findall('object'):   # 找到根节点下所有“object”节点name = str(object.find('name').text)  # 找到object节点下name子节点的值(字符串)# 如果name等于str,则删除该节点if (name in ["smoke"]):#   root.remove(object)pass# 如果name等于str,则修改nameelse:object.find('name').text = "smoke"tree.write(new_ann_path)#tree为文件,write写入新的文件中。
#删除冗余文件并修改文件夹名字
!rm -rf dataset/Annotations
!rm -rf dataset/Annotations1
!rm -rf dataset/Annotations2
!mv dataset/Annotations3 dataset/Annotations
!mv dataset/images dataset/JPEGImages
#在原始数据集中,存在.jpg文件和.xml文件匹配不对等的情况,这里我们根据.jpg文件名删除了在Annotations文件夹中无法匹配的.xml文件,
#使得.jpg和.xml能够一一对应。
import os
import shutil
path_annotations = 'dataset/Annotations'
path_JPEGImage = 'dataset/JPEGImages'
xml_path = os.listdir(path_annotations)
jpg_path = os.listdir(path_JPEGImage)
for i in jpg_path:a = i.split('.')[0] + '.xml'if a in xml_path:passelse:print(i)os.remove(os.path.join(path_JPEGImage,i))
#划分数据集
#基于PaddleX 自带的划分数据集的命令,数据集中训练集、验证集、测试集的比例为7:2:1。
!paddlex --split_dataset --format VOC --dataset_dir /home/aistudio/dataset/ --val_value 0.2 --test_value 0.1

六、模型训练

import os
os.environ['CUDA_VISIBLE_DEVICES'] = "0"from paddlex.det import transforms
import paddlex as pdx# 定义训练和验证时的transforms
# API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/det_transforms.html
train_transforms = transforms.Compose([transforms.MixupImage(mixup_epoch=350), transforms.RandomDistort(),transforms.RandomExpand(), transforms.RandomCrop(), transforms.Resize(target_size=608, interp='RANDOM'), transforms.RandomHorizontalFlip(),transforms.Normalize()
])eval_transforms = transforms.Compose([transforms.Resize(target_size=608, interp='CUBIC'), transforms.Normalize()
])# 定义训练和验证所用的数据集
# API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/datasets.html#paddlex-datasets-vocdetection
train_dataset = pdx.datasets.VOCDetection(data_dir='/home/aistudio/dataset',file_list='/home/aistudio/dataset/train_list.txt',label_list='/home/aistudio/dataset/labels.txt',transforms=train_transforms,parallel_method='thread',shuffle=True)
eval_dataset = pdx.datasets.VOCDetection(data_dir='/home/aistudio/dataset',file_list='/home/aistudio/dataset/val_list.txt',label_list='/home/aistudio/dataset/labels.txt',parallel_method='thread',transforms=eval_transforms)# 初始化模型,并进行训练
# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
num_classes = len(train_dataset.labels)# API说明: https://paddlex.readthedocs.io/zh_CN/develop/apis/models/detection.html#paddlex-det-ppyolo
model = pdx.det.YOLOv3(num_classes=num_classes, backbone='MobileNetV3_large')# API说明: https://paddlex.readthedocs.io/zh_CN/develop/apis/models/detection.html#train
# 各参数介绍与调整说明:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.html
model.train(num_epochs=300,train_dataset=train_dataset,train_batch_size=24,eval_dataset=eval_dataset,learning_rate=0.001 / 8,warmup_steps=1000,warmup_start_lr=0.0,save_interval_epochs=1,lr_decay_epochs=[240, 270],use_vdl= True,save_dir='output/yolov3_mobilenet')
#可视化
!visualdl --logdir home/aistudio/output/yolov3_mobilenet/vdl_log --port 8001

七、模型评估

model.evaluate(eval_dataset, batch_size=1, epoch_id=None, return_details=False)

八、模型导出

#把模型导出,下载本地,然后上传到EasyEdge
!paddlex --export_inference --model_dir=/home/aistudio/output/yolov3_mobilenet/best_model --save_dir=./down_model

九、模型送到EasyEdge里面,部署APP与Window桌面应用

  EasyEdge是基于百度飞桨轻量化推理框架Paddle Lite研发的端与边缘AI服务平台,能够帮助深度学习开发者将自建模型快速部署到设备端。只需上传模型,最快2分种即可获得适配终端硬件/芯片的模型。

  只需要把导出的模型分别对应上传到EasyEdge,labels.txt这个文件就是之前数据集里面的标签文件

【第一步】

【第二步】

【第三步】

【第四步】

【第五步】

【第六步】

【第七步】

【第八步】

【第九步】

【第十步】

【第十一步】

APP端同样,按操作就可以了

十一、 总结

  多实践尝试,一步一个脚印解决BUG,会越开越熟练。
  详细的做法请查看下面参考信息链接,找原博主问答,这只做笔记记录。

十二、参考信息

  1. https://aistudio.baidu.com/aistudio/projectdetail/2248524(本人,欢迎fork)

PaddlePaddle(7)—— 项目全流程实战:公共场所吸烟检测与EasyEdge部署相关推荐

  1. 【AI Studio】飞桨图像分类零基础训练营 - 0456 - 图像分类竞赛全流程实战

    前言:因为两课讲的一个比赛内容(课程里也没分页),所以我把笔记也合在一起.而且也是因为老师讲得很飘,所以我感觉我想记的东西估计不多吧.因为大部分都是新概念,所以我自己也没什么全新的理解,基本都是复制粘 ...

  2. Unity手机游戏开发:从搭建到发布上线全流程实战

    前言: 技术书籍是学习技术知识的重要资源之一.读技术书可以帮助我们学习新技能和知识,技术书籍提供了可靠的.全面的信息,帮助我们快速学习新技能和知识.同时技术书籍有助于保持你的竞争力,因为它们提供了最新 ...

  3. pythonmysql部署_详解centos7+django+python3+mysql+阿里云部署项目全流程

    (PS:本文假设你已经在本地联调好django和客户端,只是需要将django部署到外网) 购买阿里云服务器 到[阿里云官网],选择轻量应用服务器, 步骤如图所示: 地域随便选择哪一个,镜像的话,对比 ...

  4. [Pytorch图像分类全流程实战]Task06:可解释性分析

    目录 前言 CAM热力图系列算法 [A]安装配置环境 [B] torchcam命令行 [C1]Pytorch预训练ImageNet图像分类-单张图像 [C2] Pytorch预训练lmageNet图像 ...

  5. 项目开发流程_视频网课:房地产开发项目全流程全税种税收筹划

    致CFO:今天不税筹,明天就愁税 为了支持企业发展,国家出台了诸多税收优惠政策.但因不同行业税种多样,如房地产业涉税就有20余种,如何做到用好优惠政策,优化缴税结构?避免重复纳税,降低财务成本,还要合 ...

  6. 运放-滞回(迟滞)比较器全流程实战计算

    比较器之滞回(迟滞)比较器实战计算 下面我们进行一个电池低电压保护的电路设计,其中会介绍到滞回比较器的实际用法以及详细计算推导过程. 假设我们定18.5V为电池欠压保护电压,也就是说在当前负载情况下电 ...

  7. 这份【互联网项目全流程表】,实在是泰裤辣!!!

    互联网行业是一个快速变化的行业,作为半个互联网人.太明白用户和环境每天都在不停地变化是什么感受了. ​从项目开始到项目结束,要经历立项.计划.执行.结项,项目一周一个,一周一个.(**的)为了省时间就 ...

  8. 项目全流程 (1/3)

    目录 前言 一.环境搭建-spring 1.1 IDEA环境搭建 1.1.1 创建项目配置 1.1.2 选择Springboot版本 1.1.3 项目设置 1.1.4 导入pom.xml文件 1.1. ...

  9. storm throw 口袋妖怪_初版storm项目全流程自动化测试代码实现

    由于项目需要,写了版针对业务的自动化测试代码,主要应用场景在于由于业务日趋复杂,一些公共代码的改动,担心会影响已有业务.还没进行重写,但知识点还是不少的与大家分享实践下.首先,介绍下整个流处理的业务流 ...

  10. 【Git】码云Gitee.com管理项目全流程

    Gitee.com 是 OSCHINA.NET 推出的代码托管平台,支持 Git 和 SVN,提供免费的私有仓库托管.目前已有超过 500 万的开发者选择 Gitee. 官网:https://gite ...

最新文章

  1. TCPDUMP中文手册
  2. C++游戏开发需要阅读的书籍
  3. 为了新零售,A.O.史密斯做出一个令人吃惊的决定
  4. mysql多源复制脚本_Mysql多源复制
  5. Creating a Java VM from Android Native Code
  6. php320,PHP_PHP正式版-320mp3下载站
  7. SAP ABAP实用技巧介绍系列之已知某个signature查找定义的方法
  8. ai伪造论文实验数据_5篇有关AI培训数据的基本论文
  9. 为什么现代系统需要一个新的编程模型?
  10. 没有任何匹配: mod_auth_mysql 阿里云_文案丨网易云让人感触良多的文案
  11. 一个码砖的码农,在CSDN写一年博客,出书了?
  12. 一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(二)纸娃娃系统
  13. 使用GPS经纬度定位附近地点(某一点范围内查询)
  14. FineUI 后台Grid中 某列添加背景色 AspCore MVC
  15. 三角函数公式和图像大全
  16. nodejs中使用nodemon加载文件报错
  17. 【java实现地图经纬度逆编码】通过使用百度/高德地图的开放平台 实现经纬度与中文地址的转换(附代码方法)
  18. 欧洲杯上链,区块链语境下的数字化有什么不一样?
  19. 12-搜索前端开发-按分类搜索
  20. Apache安装配置(Linux)-有手就行

热门文章

  1. 【M10】在构造方法内阻止资源泄漏
  2. 基于markdown消息类型实现钉钉报警,让感官更舒服
  3. putty远程连接以及密钥
  4. 线程管理(一)线程的创建和运行
  5. maven私服Nexus3.2的使用
  6. Unity3D 热更新方案(集合各位专家的汇总)
  7. 程序安装制作不用愁—Wise installation入门教程
  8. 【Oracle经典】132个oracle热门精品资料——下载目录
  9. 关于游戏中的材质系统
  10. vs2012 设置默认的 include 目录