基于PP-YOLO的雾天检测

   日期:2023-09-02     浏览:3    

1. 项目说明

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

  1. 目标复杂

    • 环境复杂,要适应各种能见度条件下的白天、阴天、雾天、霾天等气候环境;

    • 场景复杂,城市道路、乡村、高速公路等场景差异性较大;

  2. 样本不均衡

    • 类别多,包含:行人、骑车人、汽车、巴士、摩托车、自行车;

    • 每张图像中包含多类目标,以及各种程度的遮挡与截断;

   

图 1 - RTTS 数据集示例

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 文件中,解压到合适路径即可使用。! tar xf ~/data/data141199/PaddleDetection-release-2.4.tar
%cd ~/PaddleDetection-release-2.4/dataset/coco
! tar xf ~/data/data141199/UG2_val.tar
! mkdir annotations
! cp ~/data/data141199/rtts_100_val.json ./annotations
! mv UG2_val/* .
%cd …/…

2.3 安装依赖

开始项目前我们需要编译安装 PaddleDetection%cd ~/PaddleDetection-release-2.4
! pip install -r requirements.txt >> /dev/null
! python setup.py install >> /dev/null

3. 数据准备

3.1 数据介绍

RTTS 数据集源自 RESIDE-β 数据集,包含 4322 张真实雾天图片,作为项目训练集。另外有 100 张真实场景图片作为验证集。图像数量分布如下表所示:

数据集trainval
图像数量4322100

其中文件名带有后缀 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. 模型选择

考虑到应用场景往往需要平衡模型性能和精度,因此选取 PP-YOLO 作为项目所用模型。

PP-YOLO 是 PaddleDetection 优化和改进的 YOLOv3 的模型,其精度(COCO 数据集 mAP)和推理速度均优于 YOLOv4 模型,要求使用PaddlePaddle 2.0.2(可使用pip安装) 或适当的 develop 版本。

PP-YOLO 在 COCO test-dev2017 数据集上精度达到 45.9%,在单卡 V100 上 FP32 推理速度为 72.9 FPS, V100 上开启 TensorRT 下 FP16 推理速度为 155.6 FPS。

更多细节可前往 PaddleDetection 查看

5. 模型训练

默认 4 卡配置,如在 AI Studio 训练需要修改为单卡。

--gpus 0,1,2,3 ==> --gpus 0! bash train.sh

6. 模型评估

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

模型位置: output/ug2_ppyolo_r50vd_dcn_2x_coco! bash eval.sh

7. 模型优化

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

  1. 修改预训练模型:将ImageNet预训练改为COCO预训练模型,迁移至RTTS数据集训练可以有效提升检测;

  2. 离线数据增强;利用去雾算法对训练集进行离线的数据增广,常见去雾方法如MSBDN、Trident-Dehazing network、FFA-net等模型。这里我们选择了MSBDN模型,提前对训练集进行了去雾增强,以模拟和生成不同雾浓度下拍摄的图片,并原始训练集共同进行训练。

  3. 最终指标:

Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.380
Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.693
Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.380
Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.303
Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.476
Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.571
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.264
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.512
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.542
Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.441
Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.630
Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.727

8. 推理可视化

参考 test.sh,最终输出文件在 output 目录。! python tools/infer.py
-c configs/ppyolo/ug2_ppyolo_r50vd_dcn_2x_coco.yml
–infer_img=dataset/coco/HR/55.png
-o weights=output/ug2_ppyolo_r50vd_dcn_2x_coco/model_final

检测前

 

检测后

 

图 2 - 图片检测前后对比(取自 output 目录)

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;
// 创建一个原生的 PaddlePredictor
auto predictor =
      paddle::CreatePaddlePredictor<paddle::NativeConfig>(config);
// 创建输入 tensor
int64_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 ...

更多内容详见 > C++ 预测 API介绍


 
 
更多>同类产业范例库

推荐产业范例库
点击排行

北京人工智能高质量数据集服务平台

创新数据服务,积极推进数据拓展应用

关于我们

联系我们