> 文档中心 > 基于PP-YOLOE的雾天行人车辆目标检测

基于PP-YOLOE的雾天行人车辆目标检测


1. 项目说明

随着计算机视觉算法的快速发展,目标检测作为视觉感知的基础任务,在诸多场景中得到了广泛应用。常见的公开数据集和方法大多针对能见度良好条件下的目标检测任务而建立。然而现实应用场景却面临诸如低能见度环境等更为复杂的环境,导致拍摄图像质量下降。在雾、霾等恶劣天气条件下,城市安防、自动驾驶等应用的视觉感知和场景理解变得极为困难。这些大气现象通常会导致图像出现非线性噪声、模糊、对比度下降和亮度变暗等问题,这对目标检测任务构成了挑战。该项目旨在提高目标检测算法对雾天环境拍摄图像的鲁棒性。以我们选用的 RTTS 数据集为例,该项目的挑战在于:

目标复杂

环境复杂,要适应各种能见度条件下的白天、阴天、雾天、霾天等气候环境;
场景复杂,城市道路、乡村、高速公路等场景差异性较大;
样本不均衡

类别多,包含:行人、骑车人、汽车、巴士、摩托车、自行车;
每张图像中包含多类目标,以及各种程度的遮挡与截断;
基于PP-YOLOE的雾天行人车辆目标检测
基于PP-YOLOE的雾天行人车辆目标检测

2. 安装说明

2.1 环境说明
本示例是基于 PaddleDetection2.4 版本实现的 YOLOV3 网络,同时结合 SOTA 去雾方法 MSBDN 网络对数据进行去雾操作,并在 RTTS 数据集进行了训练。

  • PaddlePaddle 2.2

  • OS 64位操作系统

  • Python 3(3.5.1+/3.6/3.7/3.8/3.9),64位版本

  • pip/pip3(9.0.1+),64位版本

  • CUDA >= 10.1

  • cuDNN >= 7.6

2.2 解压代码

项目代码在 PaddleDetection-release-2.4.tar 文件中,数据集在 UG2_val.tar 文件中,解压到合适路径即可使用。

%cd ~/work ! tar xf ~/data/data167621/PaddleDetection-release-2.4.tar%cd ~/work/PaddleDetection-release-2.4/dataset! mkdir hazedet%cd hazedet! tar xf ~/data/data167621/UG2_train.tar! mkdir train! mv RTTS train! mv RTTS_dehaze train! tar xf ~/data/data167621/UG2_val.tar! mv UG2_val val%cd ../..

2.3 安装依赖

开始项目前我们需要编译安装 PaddleDetection

%cd ~/work/PaddleDetection-release-2.4! pip install -r requirements.txt >> /dev/null! python setup.py install >> /dev/null

3. 数据准备

3.1 数据介绍

RTTS 数据集源自 RESIDE-β 数据集,包含 4322 张真实雾天图片,作为项目训练集。另外有 100 张真实场景图片作为验证集。图像数量分布如下表所示:
基于PP-YOLOE的雾天行人车辆目标检测
其中文件名带有后缀 xxx_dehaze.png 的文件加入了 SOTA 去雾方法,如 MSBDN、Trident-Dehazing network、FFA-net 等模型,对有雾数据进行去雾,扩充数据集。方法可以参考 https://github.com/BookerDeWitt/MSBDN-DFF.git

3.2 数据结构

文件的组织结构如下(参考COCO):

>> cd dataset/hazedet>> tree|-- annotations|   |-- rtts_100_val.json|   |-- rtts.json|-- train|   |-- RTTS|   |   |-- AM_Bing_211.png|   |   |-- AM_Bing_217.png|   |   ||   |-- RTTS_dehaze||-- AM_Bing_211_dehaze.png||-- AM_Bing_217_dehaze.png|||-- val|   |-- HR|   |   |-- 0.png|   |-- 10.png|   ||-- HR_dehaze |-- 0_MSBDN.png |-- 10_MSBDN.png |

4. 模型选择

考虑到应用场景往往需要平衡模型性能和精度,我们选取了PPYOLOE模型。

PP-YOLOE是基于PP-YOLOv2的卓越的单阶段Anchor-free模型,超越了多种流行的YOLO模型。PP-YOLOE有一系列的模型,即s/m/l/x,这里我们选择的是PP-YOLOE-m模型。

PP-YOLOE-m 在 COCO test-dev2017 数据集上精度达到 49.1%,在单卡 V100 上 FP32 推理速度为 123.4FPS, V100 上开启 TensorRT 下 FP16 推理速度为208.3 FPS。

更多细节可前往 https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.4/configs/ppyolo/README_cn.md
查看

5. 模型训练

默认 8 卡配置,如在 AI Studio 使用单卡训练则需要修改train.sh文件。具体修改如下:

export CUDA_VISIBLE_DEVICES=0python -m paddle.distributed.launch --gpus 0 tools/train.py -c configs-hazedet/ppyoloe/ppyoloe_crn_m_100e_hazedet.yml --eval
! bash train.sh

6. 模型评估

基于 PaddleDetection 库,我们提供了多种预测方式,可自行选择。

模型位置: output/ppyoloe_crn_m_100e_hazedet

! bash eval.sh

7. 模型优化

本小节侧重展示在模型迭代过程中优化精度的思路:

1、Baseline:主干网络加载ImageNet预训练的CSPResNetb_m模型参数,训练100epoch后进行评估:

Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.260 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.499 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.237 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.180 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.319 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.447 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.208 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.413 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.428 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.318 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.550 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.574

2、COCO预训练模型:加载COCO预训练的ppyoloe_crn_m模型模型,并在RTTS数据集进行finetune训练。最终检测mAP获得14.7%的提升。

Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.407Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.672Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.416Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.283Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.489Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.716Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.282Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.492Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.510Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.390Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.618Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.769

3、离线数据增强;利用去雾算法对训练集进行离线的数据增广,常见去雾方法如MSBDN、Trident-Dehazing network、FFA-net等模型。
这里我们选择了MSBDN模型,离线对训练集进行了去雾增强,并与原始训练集共同进行训练,目的是通过生成不同雾浓度的图片来丰富训练集,同时通过降低浓雾样本的识别难度,加速模型收敛。最终检测mAP获得0.6%的提升。

11583  Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.41311584  Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.67211585  Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.41511586  Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.27711587  Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.51911588  Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.72611589  Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.28211590  Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.49911591  Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.51711592  Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.38711593  Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.64111594  Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.780

8. 推理可视化

参考 infer.sh,最终输出文件在 output 目录。

! python tools/infer.py \  -c configs-hazedet/ppyoloe/ppyoloe_crn_m_100e_hazedet.yml \  --infer_img=dataset/hazedet/val/HR/59.png \-o weights=output/ppyoloe_crn_m_100e_hazedet/best_model

基于PP-YOLOE的雾天行人车辆目标检测

9. 模型导出

导出推理模型

PaddlePaddle框架保存的权重文件分为两种:支持前向推理和反向梯度的训练模型 和 只支持前向推理的推理模型。二者的区别是推理模型针对推理速度和显存做了优化,裁剪了一些只在训练过程中才需要的tensor,降低显存占用,并进行了一些类似层融合,kernel选择的速度优化。因此可执行如下命令导出推理模型。

默认导出到 inference_model 目录。

# 模型导出! bash export_model.sh

10. 模型部署

使用飞桨原生推理库paddle-inference,用于服务端模型部署

总体上分为三步:

1、创建PaddlePredictor,设置所导出的模型路径
2、创建输入用的 PaddleTensor,传入到 PaddlePredictor 中
3、获取输出的 PaddleTensor ,将结果取出

#include "paddle_inference_api.h" // 创建一个 config,并修改相关设置paddle::NativeConfig config;config.model_dir = "xxx";config.use_gpu = false;// 创建一个原生的 PaddlePredictorauto predictor =      paddle::CreatePaddlePredictor<paddle::NativeConfig>(config);// 创建输入 tensorint64_t data[4] = {1, 2, 3, 4};paddle::PaddleTensor tensor;tensor.shape = std::vector<int>({4, 1});tensor.data.Reset(data, sizeof(data));tensor.dtype = paddle::PaddleDType::INT64;// 创建输出 tensor,输出 tensor 的内存可以复用std::vector<paddle::PaddleTensor> outputs;// 执行预测CHECK(predictor->Run(slots, &outputs));// 获取 outputs ...

更多内容详见 >https://www.bookstack.cn/read/paddlepaddle-v1.4/d9371ca9933605ce.md

我们以Paddle Inference的Python部署为例进行说明:

使用PaddleDetection提供的deploy/python/infer.py脚本可以对图片进行推理预测。项目中我们使用TensorRT FP16进行推理,在单卡V100上推理速度可以达到208fps。

# 推理单张图片CUDA_VISIBLE_DEVICES=0 python deploy/python/infer.py --model_dir=inference_model/ppyoloe_crn_m_100e_hazedet --image_file=dataset/hazedet/val/HR/0.png --device=gpu --run_mode=trt_fp16# 推理文件夹下的所有图片CUDA_VISIBLE_DEVICES=0 python deploy/python/infer.py --model_dir=inference_model/ppyoloe_crn_m_100e_hazedet --image_dir=dataset/hazedet/val/ --device=gpu  --run_mode=trt_fp16
# 推理单张图片! python deploy/python/infer.py --model_dir=inference_model/ppyoloe_crn_m_100e_hazedet --image_file=dataset/hazedet/val/HR/59.png --device=gpu