一、PP吸烟视频分析预警检测系统
项目地址:基于PP-PicoDet的【PP视频分析预警系统】 aistudio.baidu.com/aistudio/pr…
欢迎fork交流!
1.功能介绍
PP视频分析预警系统【吸烟检测】,区域内一旦检测到人员吸烟,系统立即触发报警,提醒管理人员处理。有效提高监管效率,减少安全隐患。广泛应用于仓库、公园、加油站、厨房、森林、商场等一系列禁烟场所、防火防爆场所。
2.项目背景
吸烟有害健康,而吸烟带来的安全隐患更是为公众的日常生活环境带来了巨大的威胁。据报道,全国每年的火灾中有10%以上是吸烟引发的。据上海、北京、江苏等省市统计,抽烟不慎引起的火灾占10—20%,在各种火灾原因中居第3位。传统的控烟技术手段主要以烟雾传感器为主,当传感器检测到烟雾时产生报警。但是管理人员无法对其高效的管理,不能及时取证,无法追溯,没有形成一个有效的闭环,导致控烟效果不佳,并且还会出现漏报、误报。
3.吸烟监测
PP视频分析预警系统【吸烟检测】基于飞桨自研的轻量级系列模型PP-PicoDet,对人吸烟的主要活动结合对香烟的识别,对监控区域内的人员抽烟行为进行分析,当发现异常情况系统即刻报警,提醒管理人员及时处理,接入广播系统前端可喊话提醒,真正做到事前预警、事中常态检测、事后规范管理。
4.应用场景
PP视频分析预警系统【吸烟检测】广泛应用于仓库、公园、加油站、厨房、森林、商场、地铁站以及消防楼道等一系列禁烟场所、防火防爆场所
烟头虽小,祸患无穷。PP视频分析预警系统【吸烟检测】能有效提高监管效率,减少安全隐患。可广泛部署于边缘设备上,经济、稳定、实用。
二、数据处理
1.解压缩数据
# 解压缩数据
!unzip -qoa data/data94796/pp_smoke.zip
复制代码
2.按比例划分数据集
ratio比例系数
import random
import os
#生成train.txt和val.txt
random.seed(2020)
xml_dir = '/home/aistudio/Annotations'#标签文件地址
img_dir = '/home/aistudio/images'#图像文件地址
path_list = list()
for img in os.listdir(img_dir):
img_path = os.path.join(img_dir,img)
xml_path = os.path.join(xml_dir,img.replace('jpg', 'xml'))
path_list.append((img_path, xml_path))
random.shuffle(path_list)
ratio = 0.9
train_f = open('/home/aistudio/work/train.txt','w') #生成训练文件
val_f = open('/home/aistudio/work/val.txt' ,'w')#生成验证文件
for i ,content in enumerate(path_list):
img, xml = content
text = img + ' ' + xml + '\n'
if i < len(path_list) * ratio:
train_f.write(text)
else:
val_f.write(text)
train_f.close()
val_f.close()
#生成标签文档
label = ['smoke']#设置你想检测的类别
with open('/home/aistudio/work/label_list.txt', 'w') as f:
for text in label:
f.write(text+'\n')
复制代码
3.数据查看
源数据格式为VOC格式,存储格式如下:
dataset/
├── Annotations
│ ├── xxx1.xml
│ ├── xxx2.xml
│ ├── xxx3.xml
│ | ...
├── Images
│ ├── xxx1.jpg
│ ├── xxx2.jpg
│ ├── xxx3.jpg
│ | ...
├── label_list.txt (必须提供)
├── train.txt (训练数据集文件列表, ./Images/xxx1.jpg ./Annotations/xxx1.xml)
├── valid.txt (测试数据集文件列表)
复制代码
三、环境准备
1.PP-PicoDet介绍
PaddleDetection中提出了全新的轻量级系列模型PP-PicoDet
,在移动端具有卓越的性能,成为全新SOTA轻量级模型。详细的技术细节可以参考我们的arXiv技术报告。
PP-PicoDet模型有如下特点:
- ? 更高的mAP: 第一个在1M参数量之内
mAP(0.5:0.95)
超越30+(输入416像素时)。 - ? 更快的预测速度: 网络预测在ARM CPU下可达150FPS。
- ? 部署友好: 支持PaddleLite/MNN/NCNN/OpenVINO等预测库,支持转出ONNX,提供了C++/Python/Android的demo。
- ? 先进的算法: 我们在现有SOTA算法中进行了创新, 包括:ESNet, CSP-PAN, SimOTA等等。目前
2.数据格式
目前PP-PicoDet支持 VOC 和 COCO 两种格式,可根据需要选择。
3.基线
模型 | 输入尺寸 | mAPval 0.5:0.95 |
mAPval 0.5 |
参数量 (M) |
FLOPS (G) |
预测时延NCNN (ms) |
预测时延Lite (ms) |
下载 | 配置文件 |
---|---|---|---|---|---|---|---|---|---|
PicoDet-S | 320*320 | 27.1 | 41.4 | 0.99 | 0.73 | 8.13 | 6.65 | model | log | config |
PicoDet-S | 416*416 | 30.7 | 45.8 | 0.99 | 1.24 | 12.37 | 9.82 | model | log | config |
PicoDet-M | 320*320 | 30.9 | 45.7 | 2.15 | 1.48 | 11.27 | 9.61 | model | log | config |
PicoDet-M | 416*416 | 34.8 | 50.5 | 2.15 | 2.50 | 17.39 | 15.88 | model | log | config |
PicoDet-L | 320*320 | 32.9 | 48.2 | 3.30 | 2.23 | 15.26 | 13.42 | model | log | config |
PicoDet-L | 416*416 | 36.6 | 52.5 | 3.30 | 3.76 | 23.36 | 21.85 | model | log | config |
PicoDet-L | 640*640 | 40.9 | 57.6 | 3.30 | 8.91 | 54.11 | 50.55 | model | log | config |
更多的配置
模型 | 输入尺寸 | mAPval 0.5:0.95 |
mAPval 0.5 |
参数量 (M) |
FLOPS (G) |
预测时延NCNN (ms) |
预测时延Lite (ms) |
下载 | 配置文件 |
---|---|---|---|---|---|---|---|---|---|
PicoDet-Shufflenetv2 1x | 416*416 | 30.0 | 44.6 | 1.17 | 1.53 | 15.06 | 10.63 | model | log | config |
PicoDet-MobileNetv3-large 1x | 416*416 | 35.6 | 52.0 | 3.55 | 2.80 | 20.71 | 17.88 | model | log | config |
PicoDet-LCNet 1.5x | 416*416 | 36.3 | 52.2 | 3.10 | 3.85 | 21.29 | 20.8 | model | log | config |
PicoDet-LCNet 1.5x | 640*640 | 40.6 | 57.4 | 3.10 | – | – | – | model | log | config |
PicoDet-R18 | 640*640 | 40.7 | 57.2 | 11.10 | – | – | – | model | log | config |
注意事项:
- 时延测试: 我们所有的模型都在
骁龙865(4xA77+4xA55)
上测试(4线程,FP16预测)。上面表格中标有NCNN
的是使用NCNN库测试,标有Lite
的是使用Paddle Lite进行测试。 测试的benchmark脚本来自: MobileDetBenchmark。 - PicoDet在COCO train2017上训练,并且在COCO val2017上进行验证。
- PicoDet使用4卡GPU训练(PicoDet-L-640使用8卡训练),并且所有的模型都是通过发布的默认配置训练得到。
其他模型的基线
模型 | 输入尺寸 | mAPval 0.5:0.95 |
mAPval 0.5 |
参数量 (M) |
FLOPS (G) |
预测时延NCNN (ms) |
---|---|---|---|---|---|---|
YOLOv3-Tiny | 416*416 | 16.6 | 33.1 | 8.86 | 5.62 | 25.42 |
YOLOv4-Tiny | 416*416 | 21.7 | 40.2 | 6.06 | 6.96 | 23.69 |
PP-YOLO-Tiny | 320*320 | 20.6 | – | 1.08 | 0.58 | 6.75 |
PP-YOLO-Tiny | 416*416 | 22.7 | – | 1.08 | 1.02 | 10.48 |
Nanodet-M | 320*320 | 20.6 | – | 0.95 | 0.72 | 8.71 |
Nanodet-M | 416*416 | 23.5 | – | 0.95 | 1.2 | 13.35 |
Nanodet-M 1.5x | 416*416 | 26.8 | – | 2.08 | 2.42 | 15.83 |
YOLOX-Nano | 416*416 | 25.8 | – | 0.91 | 1.08 | 19.23 |
YOLOX-Tiny | 416*416 | 32.8 | – | 5.06 | 6.45 | 32.77 |
YOLOv5n | 640*640 | 28.4 | 46.0 | 1.9 | 4.5 | 40.35 |
YOLOv5s | 640*640 | 37.2 | 56.0 | 7.2 | 16.5 | 78.05 |
4.安装
环境要求
- PaddlePaddle >= 2.1.2
- Python >= 3.5
- PaddleSlim >= 2.1.1
- PaddleLite >= 2.10
# 下载PaddleDetection源码,执行如下命令
!git clone https://gitee.com/PaddlePaddle/PaddleDetection.git -b develop --depth 1
复制代码
Cloning into 'PaddleDetection'...
remote: Enumerating objects: 1993, done.[K
remote: Counting objects: 100% (1993/1993), done.[K
remote: Compressing objects: 100% (1511/1511), done.[K
remote: Total 1993 (delta 689), reused 1118 (delta 415), pack-reused 0[K
Receiving objects: 100% (1993/1993), 175.80 MiB | 4.03 MiB/s, done.
Resolving deltas: 100% (689/689), done.
Checking connectivity... done.
复制代码
# 安装其他依赖
%cd ~/PaddleDetection
!pip install -U pip --user
!pip install -r requirements.txt
# 编译安装paddledet
!python setup.py install
!pip install paddleslim==2.1.1
复制代码
四、执行训练
1.模型选择
因为要部署在移动端,且保证速度快和精度高,因此我们选择PaddleDetection提出的全新轻量级系列模型PP-PicoDet,模型有如下特点:
- 更高的mAP: 第一个在1M参数量之内mAP(0.5:0.95)超越30+(输入416像素时)。
- 更快的预测速度: 网络预测在ARM CPU下可达150FPS。
- 部署友好: 支持PaddleLite/MNN/NCNN/OpenVINO等预测库,支持转出ONNX,提供了C++/Python/Android的demo。
- 先进的算法: 我们在现有SOTA算法中进行了创新, 包括:ESNet, CSP-PAN, SimOTA等等。
在此选择PP-PicoDet的VOC数据集训练配置
2.配置修改
(1)首先修改configs/datasets/voc.yml
metric: VOC
map_type: 11point
num_classes: 1
TrainDataset:
!VOCDataSet
dataset_dir: /home/aistudio/images
anno_path: /home/aistudio/work/train.txt
label_list: /home/aistudio/work/label_list.txt
data_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']
EvalDataset:
!VOCDataSet
dataset_dir: /home/aistudio/images
anno_path: /home/aistudio/work/val.txt
label_list: /home/aistudio/work/label_list.txt
data_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']
TestDataset:
!ImageFolder
anno_path: /home/aistudio/work/label_list.txt
复制代码
数据集包含的类别数:num_classes
包含训练集、验证集、测试集的图片路径image_dir、标注json文件路径anno_path、数据集路径dataset_dir
(2)然后修改 configs/picodet/picodet_s_320_voc.yml
预训练模型:pretrain_weights
训练超参数:epoch、batch_size、base_lr
# 已配置好,覆盖
%cd ~
cp voc.yml ~/PaddleDetection/configs/datasets/voc.yml
复制代码
3.模型训练
PaddleDetection提供了单卡/多卡训练模型,满足用户多种训练需求,具体代码如下:
# 单卡GPU上训练
%cd ~/PaddleDetection/
!export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
!python tools/train.py -c configs/picodet/picodet_s_320_voc.yml --eval
# 多卡GPU上训练
# !export CUDA_VISIBLE_DEVICES=0,1,2,3
# !python -m paddle.distributed.launch --gpus 0,1,2,3 tools/train.py \
# -c configs/picodet/picodet_l_640_coco.yml
复制代码
日志
[03/11 00:47:54] ppdet.engine INFO: Epoch: [290] [0/5] learning_rate: 0.001711 loss_vfl: 0.479042 loss_bbox: 0.254253 loss_dfl: 0.178100 loss: 0.905043 eta: 0:02:34 batch_cost: 2.7071 data_cost: 0.9844 ips: 47.2839 images/s
[03/11 00:48:10] ppdet.engine INFO: Epoch: [291] [0/5] learning_rate: 0.001386 loss_vfl: 0.477680 loss_bbox: 0.251249 loss_dfl: 0.178367 loss: 0.908022 eta: 0:02:18 batch_cost: 2.7419 data_cost: 1.0017 ips: 46.6828 images/s
[03/11 00:48:25] ppdet.engine INFO: Epoch: [292] [0/5] learning_rate: 0.001096 loss_vfl: 0.481945 loss_bbox: 0.250645 loss_dfl: 0.179363 loss: 0.913140 eta: 0:02:03 batch_cost: 2.6677 data_cost: 0.9474 ips: 47.9814 images/s
[03/11 00:48:41] ppdet.engine INFO: Epoch: [293] [0/5] learning_rate: 0.000839 loss_vfl: 0.484040 loss_bbox: 0.255441 loss_dfl: 0.178693 loss: 0.920747 eta: 0:01:47 batch_cost: 2.6138 data_cost: 0.8594 ips: 48.9717 images/s
[03/11 00:48:57] ppdet.engine INFO: Epoch: [294] [0/5] learning_rate: 0.000617 loss_vfl: 0.487185 loss_bbox: 0.259508 loss_dfl: 0.179363 loss: 0.927957 eta: 0:01:32 batch_cost: 2.7094 data_cost: 1.0264 ips: 47.2421 images/s
[03/11 00:49:15] ppdet.engine INFO: Epoch: [295] [0/5] learning_rate: 0.000428 loss_vfl: 0.487185 loss_bbox: 0.258693 loss_dfl: 0.178415 loss: 0.928867 eta: 0:01:17 batch_cost: 2.7961 data_cost: 1.2018 ips: 45.7784 images/s
[03/11 00:49:31] ppdet.engine INFO: Epoch: [296] [0/5] learning_rate: 0.000274 loss_vfl: 0.487185 loss_bbox: 0.258693 loss_dfl: 0.177018 loss: 0.924824 eta: 0:01:01 batch_cost: 2.8753 data_cost: 1.2545 ips: 44.5171 images/s
[03/11 00:49:48] ppdet.engine INFO: Epoch: [297] [0/5] learning_rate: 0.000154 loss_vfl: 0.484518 loss_bbox: 0.252453 loss_dfl: 0.176589 loss: 0.916203 eta: 0:00:46 batch_cost: 2.9412 data_cost: 1.4018 ips: 43.5202 images/s
[03/11 00:50:05] ppdet.engine INFO: Epoch: [298] [0/5] learning_rate: 0.000069 loss_vfl: 0.480916 loss_bbox: 0.249677 loss_dfl: 0.175895 loss: 0.913992 eta: 0:00:30 batch_cost: 2.9504 data_cost: 1.4170 ips: 43.3835 images/s
[03/11 00:50:22] ppdet.engine INFO: Epoch: [299] [0/5] learning_rate: 0.000017 loss_vfl: 0.483217 loss_bbox: 0.249677 loss_dfl: 0.175399 loss: 0.913660 eta: 0:00:15 batch_cost: 2.9036 data_cost: 1.2665 ips: 44.0839 images/s
[03/11 00:50:29] ppdet.utils.checkpoint INFO: Save checkpoint: output/picodet_s_320_voc
[03/11 00:50:29] ppdet.engine INFO: Eval iter: 0
[03/11 00:50:33] ppdet.metrics.metrics INFO: Accumulating evaluatation results...
[03/11 00:50:33] ppdet.metrics.metrics INFO: mAP(0.50, 11point) = 85.92%
[03/11 00:50:33] ppdet.engine INFO: Total sample number: 78, averge FPS: 19.29553460230837
[03/11 00:50:33] ppdet.engine INFO: Best test bbox ap is 0.859.
[03/11 00:50:34] ppdet.utils.checkpoint INFO: Save checkpoint: output/picodet_s_320_voc
复制代码
五、模型评估
!python -u tools/eval.py -c configs/picodet/picodet_s_320_voc.yml -o weights=output/picodet_s_320_voc/best_model.pdparams
复制代码
W0311 00:52:53.690088 19588 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0311 00:52:53.741935 19588 device_context.cc:465] device: 0, cuDNN Version: 7.6.
[03/11 00:53:13] ppdet.utils.checkpoint INFO: Finish loading model weights: output/picodet_s_320_voc/best_model.pdparams
[03/11 00:53:17] ppdet.engine INFO: Eval iter: 0
[03/11 00:53:20] ppdet.metrics.metrics INFO: Accumulating evaluatation results...
[03/11 00:53:20] ppdet.metrics.metrics INFO: mAP(0.50, 11point) = 85.92%
[03/11 00:53:20] ppdet.engine INFO: Total sample number: 78, averge FPS: 11.196457662129422
复制代码
运行耗时: 49秒620毫秒
W0311 00:52:53.690088 19588 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0311 00:52:53.741935 19588 device_context.cc:465] device: 0, cuDNN Version: 7.6.
[03/11 00:53:13] ppdet.utils.checkpoint INFO: Finish loading model weights: output/picodet_s_320_voc/best_model.pdparams
[03/11 00:53:17] ppdet.engine INFO: Eval iter: 0
[03/11 00:53:20] ppdet.metrics.metrics INFO: Accumulating evaluatation results...
[03/11 00:53:20] ppdet.metrics.metrics INFO: mAP(0.50, 11point) = 85.92%
[03/11 00:53:20] ppdet.engine INFO: Total sample number: 78, averge FPS: 11.196457662129422
复制代码
六、模型预测
1.动态图预测
在执行tools/infer.py后,在output文件夹下会生成对应的预测结果
%cd ~/PaddleDetection
!python tools/infer.py -c configs/picodet/picodet_s_320_voc.yml -o weights=output/picodet_s_320_voc/best_model.pdparams --infer_img=/home/aistudio/smoke1.jpg
复制代码
/home/aistudio/PaddleDetection
W0311 00:59:59.968083 20342 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0311 00:59:59.973002 20342 device_context.cc:465] device: 0, cuDNN Version: 7.6.
[03/11 01:00:03] ppdet.utils.checkpoint INFO: Finish loading model weights: output/picodet_s_320_voc/best_model.pdparams
[03/11 01:00:04] ppdet.engine INFO: Detection bbox results save in output/smoke1.jpg
复制代码
1. 结果展示
原图
预测图
2.模型导出
在模型训练过程中保存的模型文件是包含前向预测和反向传播的过程,在实际的工业部署则不需要反向传播,因此需要将模型进行导成部署需要的模型格式。 执行下面命令,即可导出模型
!export CUDA_VISIBLE_DEVICES=0
%cd ~/PaddleDetection/
!python tools/export_model.py \
-c configs/picodet/picodet_s_320_voc.yml \
-o weights=output/picodet_s_320_voc/best_model.pdparams \
--output_dir=inference_model
复制代码
/home/aistudio/PaddleDetection
[03/11 01:08:30] ppdet.utils.checkpoint INFO: Finish loading model weights: output/picodet_s_320_voc/best_model.pdparams
[03/11 01:08:30] ppdet.engine INFO: Export inference config file to inference_model/picodet_s_320_voc/infer_cfg.yml
W0311 01:08:34.320701 20767 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0311 01:08:34.320773 20767 device_context.cc:465] device: 0, cuDNN Version: 7.6.
[03/11 01:08:37] ppdet.engine INFO: Export model and saved in inference_model/picodet_s_320_voc
复制代码
!tree ./inference_model/picodet_s_320_voc
复制代码
./inference_model/picodet_s_320_voc
├── infer_cfg.yml
├── model.pdiparams
├── model.pdiparams.info
└── model.pdmodel
0 directories, 4 files
复制代码
预测模型会导出到inference_model/目录下,包括model.pdmodel、model.pdiparams、model.pdiparams.info和infer_cfg.yml四个文件,分别表示模型的网络结构、模型权重、模型权重名称和模型的配置文件(包括数据预处理参数等)的流程配置文件。
3.静态图预测
在终端输入以下命令进行预测,详细教程请参考Python端预测部署:
!export CUDA_VISIBLE_DEVICES=0
'''
--model_dir: 上述导出的模型路径
--image_file:需要测试的图片
--image_dir:也可以指定要测试的文件夹路径
--device:运行时的设备,可选择CPU/GPU/XPU,默认为CPU
--output_dir:可视化结果保存的根目录,默认为output/
'''
!python deploy/python/infer.py \
--model_dir=./inference_model/picodet_s_320_voc \
--image_file=/home/aistudio/smoke1.jpg \
--device=GPU
复制代码
----------- Running Arguments -----------
batch_size: 1
camera_id: -1
cpu_threads: 1
device: GPU
enable_mkldnn: False
image_dir: None
image_file: /home/aistudio/smoke1.jpg
model_dir: ./inference_model/picodet_s_320_voc
output_dir: output
reid_batch_size: 50
reid_model_dir: None
run_benchmark: False
run_mode: paddle
save_images: False
save_mot_txt_per_img: False
save_mot_txts: False
scaled: False
threshold: 0.5
trt_calib_mode: False
trt_max_shape: 1280
trt_min_shape: 1
trt_opt_shape: 640
use_dark: True
use_gpu: False
video_file: None
------------------------------------------
----------- Model Configuration -----------
Model Arch: PicoDet
Transform Order:
--transform op: Resize
--transform op: NormalizeImage
--transform op: Permute
--transform op: PadStride
--------------------------------------------
class_id:0, confidence:0.8912, left_top:[2122.73,1425.18],right_bottom:[3712.47,1949.28]
save result to: output/smoke1.jpg
------------------ Inference Time Info ----------------------
total_time(ms): 3041.3, img_num: 1
average latency time(ms): 3041.30, QPS: 0.328807
preprocess_time(ms): 3019.60, inference_time(ms): 16.80, postprocess_time(ms): 4.90
复制代码
4K的图片,推理速耗时 16.80ms ,速度相当不错。
七、总结
1.与PP-YOLOV2对比
eval结果如下,感觉不错,具体如下:
- mAP(0.50, 11point) = 85.92%
- FPS: 11.196457662129422
但是对比PP-YOLOV2 的 86.74%,还差0.82%,应该是数据增强等没做好。
2.优化方案
- 预训练模型:使用预训练模型可以有效提升模型精度,PP-PicoDet模型提供了在COCO数据集上的预训练模型
- 修改loss:将目标检测中的GIOU loss改为DIOU loss
- 修改lr:调整学习率,这里将学习率调小一半
- 修改lr再训练:当模型不再提升,可以加载训练好的模型,把学习率调整为十分之一,再训练。
项目地址:基于PP-PicoDet的【PP视频分析预警系统】 aistudio.baidu.com/aistudio/pr…
欢迎fork交流!