转载请注明作者和出处: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
五、数据处理和数据清洗
!mkdir dataset/Annotations1
import xml.dom.minidom
import os
path = r'dataset/Annotations'
sv_path = r'dataset/Annotations1'
files = os.listdir(path)
cnt = 1
for xmlFile in files:
dom = xml.dom.minidom.parse(os.path.join(path, xmlFile))
root = dom.documentElement
item = root.getElementsByTagName('path')
for i in item:
i.firstChild.data = '/home/aistudio/dataset/JPEGImages/' + str(cnt).zfill(6) + '.jpg'
with open(os.path.join(sv_path, xmlFile), 'w') as fh:
dom.writexml(fh)
cnt += 1
!mkdir dataset/Annotations2
import xml.dom.minidom
import os
path = r'dataset/Annotations1'
sv_path = r'dataset/Annotations2'
files = os.listdir(path)
for xmlFile in files:
dom = xml.dom.minidom.parse(os.path.join(path, xmlFile))
root = dom.documentElement
names = root.getElementsByTagName('filename')
a, b = os.path.splitext(xmlFile)
for n in names:
n.firstChild.data = a + '.jpg'
with open(os.path.join(sv_path, xmlFile), 'w') as fh:
dom.writexml(fh)
!mkdir dataset/Annotations3
import os
import xml.etree.ElementTree as ET
origin_ann_dir = '/home/aistudio/dataset/Annotations2/'
new_ann_dir = '/home/aistudio/dataset/Annotations3/'
for dirpaths, dirnames, filenames in os.walk(origin_ann_dir):
for filename in filenames:
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)
root = tree.getroot()
for object in root.findall('object'):
name = str(object.find('name').text)
if (name in ["smoke"]):
pass
else:
object.find('name').text = "smoke"
tree.write(new_ann_path)
!rm -rf dataset/Annotations
!rm -rf dataset/Annotations1
!rm -rf dataset/Annotations2
!mv dataset/Annotations3 dataset/Annotations
!mv dataset/images dataset/JPEGImages
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:
pass
else:
print(i)
os.remove(os.path.join(path_JPEGImage,i))
!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
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()
])
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)
num_classes = len(train_dataset.labels)
model = pdx.det.YOLOv3(num_classes=num_classes, backbone='MobileNetV3_large')
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)
八、模型导出
!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,会越开越熟练。 ??详细的做法请查看下面参考信息链接,找原博主问答,这只做笔记记录。
四、参考信息
- https://aistudio.baidu.com/aistudio/projectdetail/2248524(本人,欢迎fork)
|