PaddlePaddle(7)—— 项目全流程实战:公共场所吸烟检测与EasyEdge部署
转载请注明作者和出处: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桌面应用
十一、 总结
多实践尝试,一步一个脚印解决BUG,会越开越熟练。
详细的做法请查看下面参考信息链接,找原博主问答,这只做笔记记录。
十二、参考信息
- https://aistudio.baidu.com/aistudio/projectdetail/2248524(本人,欢迎fork)
PaddlePaddle(7)—— 项目全流程实战:公共场所吸烟检测与EasyEdge部署相关推荐
- 【AI Studio】飞桨图像分类零基础训练营 - 0456 - 图像分类竞赛全流程实战
前言:因为两课讲的一个比赛内容(课程里也没分页),所以我把笔记也合在一起.而且也是因为老师讲得很飘,所以我感觉我想记的东西估计不多吧.因为大部分都是新概念,所以我自己也没什么全新的理解,基本都是复制粘 ...
- Unity手机游戏开发:从搭建到发布上线全流程实战
前言: 技术书籍是学习技术知识的重要资源之一.读技术书可以帮助我们学习新技能和知识,技术书籍提供了可靠的.全面的信息,帮助我们快速学习新技能和知识.同时技术书籍有助于保持你的竞争力,因为它们提供了最新 ...
- pythonmysql部署_详解centos7+django+python3+mysql+阿里云部署项目全流程
(PS:本文假设你已经在本地联调好django和客户端,只是需要将django部署到外网) 购买阿里云服务器 到[阿里云官网],选择轻量应用服务器, 步骤如图所示: 地域随便选择哪一个,镜像的话,对比 ...
- [Pytorch图像分类全流程实战]Task06:可解释性分析
目录 前言 CAM热力图系列算法 [A]安装配置环境 [B] torchcam命令行 [C1]Pytorch预训练ImageNet图像分类-单张图像 [C2] Pytorch预训练lmageNet图像 ...
- 项目开发流程_视频网课:房地产开发项目全流程全税种税收筹划
致CFO:今天不税筹,明天就愁税 为了支持企业发展,国家出台了诸多税收优惠政策.但因不同行业税种多样,如房地产业涉税就有20余种,如何做到用好优惠政策,优化缴税结构?避免重复纳税,降低财务成本,还要合 ...
- 运放-滞回(迟滞)比较器全流程实战计算
比较器之滞回(迟滞)比较器实战计算 下面我们进行一个电池低电压保护的电路设计,其中会介绍到滞回比较器的实际用法以及详细计算推导过程. 假设我们定18.5V为电池欠压保护电压,也就是说在当前负载情况下电 ...
- 这份【互联网项目全流程表】,实在是泰裤辣!!!
互联网行业是一个快速变化的行业,作为半个互联网人.太明白用户和环境每天都在不停地变化是什么感受了. 从项目开始到项目结束,要经历立项.计划.执行.结项,项目一周一个,一周一个.(**的)为了省时间就 ...
- 项目全流程 (1/3)
目录 前言 一.环境搭建-spring 1.1 IDEA环境搭建 1.1.1 创建项目配置 1.1.2 选择Springboot版本 1.1.3 项目设置 1.1.4 导入pom.xml文件 1.1. ...
- storm throw 口袋妖怪_初版storm项目全流程自动化测试代码实现
由于项目需要,写了版针对业务的自动化测试代码,主要应用场景在于由于业务日趋复杂,一些公共代码的改动,担心会影响已有业务.还没进行重写,但知识点还是不少的与大家分享实践下.首先,介绍下整个流处理的业务流 ...
- 【Git】码云Gitee.com管理项目全流程
Gitee.com 是 OSCHINA.NET 推出的代码托管平台,支持 Git 和 SVN,提供免费的私有仓库托管.目前已有超过 500 万的开发者选择 Gitee. 官网:https://gite ...
最新文章
- TCPDUMP中文手册
- C++游戏开发需要阅读的书籍
- 为了新零售,A.O.史密斯做出一个令人吃惊的决定
- mysql多源复制脚本_Mysql多源复制
- Creating a Java VM from Android Native Code
- php320,PHP_PHP正式版-320mp3下载站
- SAP ABAP实用技巧介绍系列之已知某个signature查找定义的方法
- ai伪造论文实验数据_5篇有关AI培训数据的基本论文
- 为什么现代系统需要一个新的编程模型?
- 没有任何匹配: mod_auth_mysql 阿里云_文案丨网易云让人感触良多的文案
- 一个码砖的码农,在CSDN写一年博客,出书了?
- 一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(二)纸娃娃系统
- 使用GPS经纬度定位附近地点(某一点范围内查询)
- FineUI 后台Grid中 某列添加背景色 AspCore MVC
- 三角函数公式和图像大全
- nodejs中使用nodemon加载文件报错
- 【java实现地图经纬度逆编码】通过使用百度/高德地图的开放平台 实现经纬度与中文地址的转换(附代码方法)
- 欧洲杯上链,区块链语境下的数字化有什么不一样?
- 12-搜索前端开发-按分类搜索
- Apache安装配置(Linux)-有手就行