基于PP-YOLO的雾天检测

   日期:2023-09-03     浏览:221    

   

图 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介绍


 
 
更多>同类产业范例库

推荐产业范例库
点击排行

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

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

关于我们

联系我们

合作
咨询

15911018798
数据合作联系电话

微信
联系

微信联系