PaddleDetection快速上手实现吸烟检测(release/2.3最新版)

一、项目简介

  大家肯定都在商场或者火车里看到过禁止吸烟标志吧,而且现在电视里经常报道吸烟有害健康的问题,但是总有人无视,于是我们想到,可不可以训练出一个AI小助手找出吸烟的人,本项目经过数据准备、数据加载、模型训练、模型评估、模型预测的完成流程,相信小伙伴们看到最后,一定对目标检测有着很好的理解,那么话不多说,我们开始。

二、PaddleDetection介绍

  众所周知,PaddleDetection为基于飞桨PaddlePaddle的端到端目标检测套件,提供多种主流目标检测、实例分割、跟踪、关键点检测算法,配置化的网络模块组件、数据增强策略、损失函数等,推出多种服务器端和移动端工业级SOTA模型,并集成了模型压缩和跨平台高性能部署能力,帮助开发者更快更好完成端到端全开发流程。

PaddleDetection提供了目标检测、实例分割、多目标跟踪、关键点检测等多种能力

特性:

  • 模型丰富: 包含目标检测、实例分割、人脸检测等100+个预训练模型,涵盖多种全球竞赛冠军方案
  • 使用简洁:模块化设计,解耦各个网络组件,开发者轻松搭建、试用各种检测模型及优化策略,快速得到高性能、定制化的算法。
  • 端到端打通: 从数据增强、组网、训练、压缩、部署端到端打通,并完备支持云端/边缘端多架构、多设备部署。
  • 高性能: 基于飞桨的高性能内核,模型训练速度及显存占用优势明显。支持FP16训练, 支持多机训练。

模型性能概览:

各模型结构和骨干网络的代表模型在COCO数据集上精度mAP和单卡Tesla V100上预测速度(FPS)对比图。

说明:

  • CBResNet为Cascade-Faster-RCNN-CBResNet200vd-FPN模型,COCO数据集mAP高达53.3%
  • Cascade-Faster-RCNN为Cascade-Faster-RCNN-ResNet50vd-DCN,PaddleDetection将其优化到COCO数据mAP为47.8%时推理速度为20FPS
  • PP-YOLO在COCO数据集精度45.9%,Tesla V100预测速度72.9FPS,精度速度均优于YOLOv4
  • PP-YOLO v2是对PP-YOLO模型的进一步优化,在COCO数据集精度49.5%,Tesla V100预测速度68.9FPS

图中模型均可在模型库中获取

各移动端模型在COCO数据集上精度mAP和高通骁龙865处理器上预测速度(FPS)对比图。

说明:

  • 测试数据均使用高通骁龙865(4A77 + 4A55)处理器batch size为1, 开启4线程测试,测试使用NCNN预测库,测试脚本见MobileDetBenchmark
  • PP-PicoDet及PP-YOLO-Tiny为PaddleDetection自研模型,其余模型PaddleDetection暂未提供

PaddleDetection github地址:

https://github.com/PaddlePaddle/PaddleDetection

PaddleDetection 教程文档地址:

https://aistudio.baidu.com/aistudio/projectdetail/1922155?channel=0&channelType=0&shared=1

三、数据集介绍

本数据集用的是Niki_173的吸烟检测数据集,数据集是VOC格式,已经有多人引用,
其中共有783张图片,已将数据集放在data/data94796/pp_smoke.zip下,下面我们开始解压数据集

数据集链接PaddleDetection github地址:
https://aistudio.baidu.com/aistudio/datasetdetail/94796

%cd work
!unzip -oq /home/aistudio/data/data94796/pp_smoke.zip
!mv images JPEGImages

数据集介绍和查看

我们看到已经解压成功,有图片目录JPEGImages和标注文件Annotations我们随便打开一条查看
from PIL import Image

# 读取图片
png_img = Image.open('JPEGImages/smoke_a326.jpg')
png_img  # 展示图片

四、数据处理

我们可以看到数据集已经成功划分,下面我们进行训练集、验证集和测试集的划分

Paddlex划分介绍

Paddlex可以通过命令!paddlex --split_dataset --format VOC --dataset_dir work --val_value 0.2 --test_value 0.1声明数据集格式类型便捷划分数据集,本人每次划分都是用这个,所以强烈推荐给大家。这里给大家提醒几个细节
  • –format字段中必须声明数据集类型,如COCO,VOC等
  • –dataset_dir字段必须存在,不可直接声明数据集路径,本人也是在此卡了好久
  • –val_value 0.2 --test_value 0.1指划分20%为验证集,10%为测试集

安装Paddlex

首先安装1.83以上版本的Paddlex(1.83一下版本的已经不支持此划分命令)
!pip install paddlex==2.0rc -q
%cd -
!paddlex --split_dataset --format VOC --dataset_dir work --val_value 0.2 --test_value 0.1

解压PaddleDetection

大家可以通过克隆的方式下载不过速度很慢,本人已经将最新版本PaddleDetection已经作为数据集放在data/data115509中
!unzip -oq /home/aistudio/data/data115925/PaddleDetection-release-2.3.zip

PaddleDetection版本对比

随着PaddleDetection版本的不断更新,功能也有着翻天覆地的变化,在这里本人总结总结给大家:
1、以前的PaddleDetection仅仅支持COCO数据集,但是除了COCO大多数时候还有VOC数据集,格式的转换非常让人头疼,不过新版本的PaddleDetection里面包含了各种格式数据集的配置文件,大家只要找到自己数据集的配置文件就好,所有数据配置文件在PaddleDetection-release-2.3/dataset里面
2、本项目用的是PaddleDetection-release-2.3/configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml,大家打开可以看到,里面依赖着四个小的配置文件,大家可以将不同的配置文件进行组合训练。 
3、下面给大家介绍一下配置文件里面的参数表达的意思

 '../datasets/voc.yml'主要说明了训练数据和验证数据的路径

'../runtime.yml'主要说明了公共的运行参数,比如说是否使用GPU、每多少个epoch存储checkpoint等

 './_base_/ppyolov2_r50vd_dcn.yml' 主要说明模型、和主干网络的情况。

 './_base_/optimizer_365e.yml'主要说明了学习率和优化器的配置。

'./_base_/ppyolov2_reader.yml'主要说明数据读取器配置,如batch size,并发加载子进程数等,同时包含读取后预处理操作,如resize、数据增强等等

下面我们更改数据集配置文件

我们需要将划分好的数据集以及标注文件转移到PaddleDetection-release-2.3/dataset/voc下,这样不仅整洁而且修改的配置文件较少,只需要更改路径就好,下面我们开始修改voc.yml
!mv work/test_list.txt PaddleDetection-release-2.3/dataset/voc
!mv work/val_list.txt PaddleDetection-release-2.3/dataset/voc
!mv work/train_list.txt PaddleDetection-release-2.3/dataset/voc
!mv work/labels.txt PaddleDetection-release-2.3/dataset/voc
%cd PaddleDetection-release-2.3
%%writefile configs/datasets/voc.yml
metric: VOC
map_type: 11point
num_classes: 1

TrainDataset:
  !VOCDataSet
    dataset_dir: dataset/voc
    anno_path: train_list.txt
    label_list: labels.txt
    data_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']

EvalDataset:
  !VOCDataSet
    dataset_dir: dataset/voc
    anno_path: val_list.txt
    label_list: labels.txt
    data_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']

TestDataset:
  !ImageFolder
    anno_path: dataset/voc/test_list.txt

我们在克隆PaddleDetection的同时需要安装环境依赖,否则缺少很多库

!pip install -r requirements.txt

五、模型训练

命令介绍:

  • GPU单卡训练

      export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
      python tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml
    
  • GPU多卡训练

      export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 #windows和Mac下不需要执行该命令
      python -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml
    
  • Fine-tune其他任务

使用预训练模型fine-tune其他任务时,可以直接加载预训练模型,形状不匹配的参数将自动忽略,例如:

export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
# 如果模型中参数形状与加载权重形状不同,将不会加载这类参数
python -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml -o 	pretrain_weights=output/model_final
  • 模型恢复训练

在日常训练过程中,有的用户由于一些原因导致训练中断,用户可以使用-r的命令恢复训练

export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
python tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml -r output/faster_rcnn_r50_1x_coco/10000
  • 本项目采用的是边训练边评估的模式

      export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
      python tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml --eval
    

在训练中交替执行评估, 评估在每个epoch训练结束后开始。每次评估后还会评出最佳mAP模型保存到best_model文件夹下。
如果验证集很大,测试将会比较耗时,建议调整configs/runtime.yml 文件中的 snapshot_epoch配置以减少评估次数,或训练完成后再进行评估,本项目调整为snapshot_epoch=20

!export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
!python tools/train.py -c configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml --eval

六、模型评估

  • 默认将训练生成的模型保存在当前output文件夹下

      export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
      python tools/eval.py -c configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml -o weights=output/ppyolov2_r50vd_dcn_voc/best_model.pdparams
    
!export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
!python tools/eval.py -c configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml -o weights=output/ppyolov2_r50vd_dcn_voc/best_model.pdparams

七、模型预测

python tools/infer.py -c configs/yolov3/yolov3_mobilenet_v1_roadsign.yml --infer_img=demo/000000570688.jpg -o 	weights=https://paddledet.bj.bcebos.com/models/yolov3_mobilenet_v1_roadsign.pdparams
  • 本项目用的是设置参数预测

      export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
      python tools/infer.py -c configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml \
                  --infer_img demo/test5.JPG \
                  --output_dir=infer_output/ \
                  --draw_threshold=0.5 \
                  -o weights=output/ppyolov2_r50vd_dcn_voc/179.pdparams \
                  --use_vdl=Ture
    
  • –draw_threshold 是个可选参数. 根据 NMS 的计算,不同阈值会产生不同的结果 keep_top_k表示设置输出目标的最大数量,默认值为100,用户可以根据自己的实际情况进行设定。

  • 这里需要大家注意–infer_img与demo/test5.JPG \之间是空格不是等号。

  • 为了和实际应用接近,本人从相册里拿来一张图片使用,预测结果在infer_output中

!export CUDA_VISIBLE_DEVICES=0 #windows和Mac下不需要执行该命令
!python tools/infer.py -c configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml \
                    --infer_img demo/test3.JPG \
                    --output_dir=infer_output/ \
                    --draw_threshold=0.5 \
                    -o weights=output/ppyolov2_r50vd_dcn_voc/179.pdparams \
                    --use_vdl=Ture

查看预测结果

预测结果在PaddleDetection-release-2.3/infer_output/test3.JPG下
from PIL import Image

# 读取图片
png_img = Image.open('infer_output/test3.JPG')
png_img  # 展示图片

八、视频预测

模型导出

视频预测和图片预测不同,视频预测需要先将模型导出,然后才能视频预测,采用如下命令声明权重文件以及导出地址
!python tools/export_model.py -c configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml --output_dir=./inference_model \
-o weights=output/ppyolov2_r50vd_dcn_voc/best_model.pdparams
!python tools/export_model.py -c configs/ppyolo/ppyolov2_r50vd_dcn_voc.yml --output_dir=./inference_model \
_voc.yml --output_dir=./inference_model \
 -o weights=output/ppyolov2_r50vd_dcn_voc/best_model.pdparams

开始视频预测

预测结果保存在新建的目录PaddleDetection-release-2.3/home/aistudio下,读者自行下载查看
!python deploy/python/infer.py --model_dir=inference_model/ppyolov2_r50vd_dcn_voc  --video_file=demo/RPReplay_Final1636444986.MP4 --output_dir=home/aistudio --device=GPU  --thresh=0.2

九、总结与升华

亮点总结

  本项目使用11月初刚刚更新的PaddleDetection-release-2.3版本进行训练,在精度90%的基础上实现了图片和视频的预测,在项目里,不仅将各个格式的数据集的使用方法进行了介绍和说明,同时将PaddleDetection的不同版本的区别以及各个模型的性能比较进行对比。希望读者在模型选择时自行斟酌。

项目魔改

下面是本项目可以更改的思路

  • 可以用PaddleSeg将烟头进行分割,然后换上其他图片
  • 数据集可以增加刀具等尖锐物品数据集,应用在地铁或火车等安检场景
  • 训练时可以更换更好的预训练模型,增加精度
  • 可以将导出的模型文件model.pdmodel和model.pdiparams部署在趣味体验馆上,或者部署在EasyDL上

参考地址:

https://aistudio.baidu.com/aistudio/projectdetail/2278846?shared=1

个人简介

本人来自江苏科技大学本科三年级,刚刚接触深度学习不久希望大家多多关注

感兴趣的方向:目标检测,强化学习,自然语言处理、

个人链接:
马骏骁

https://aistudio.baidu.com/aistudio/personalcenter/thirdview/824948

请点击此处查看本环境基本用法.

Please click here for more detailed instructions.

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐