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 文件中,解压到合适路径即可使用。
UG2_train.tar下载地址:https://bj.bcebos.com/ai-studio-online/d400fea9e5014fdfb5d592ac5bcb1de1d1fd0054452a4f36be22a4dda0f21d63?authorization=bce-auth-v1%2F5cfe9a5e1454405eb2a975c43eace6ec%2F2022-09-05T07%3A55%3A48Z%2F-1%2F%2Fbec2436ebc44f1f1b30ae937e5527974726564ccb1caff6697e6c16d2375f0c7&responseContentDisposition=attachment%3B%20filename%3DUG2_train.tar
UG2_val.tar下载地址:https://bj.bcebos.com/ai-studio-online/b31c6d112f124fee8ad9c67cf332cbde0c3b3bb24aed4de4b3a2b498128c6455?authorization=bce-auth-v1%2F5cfe9a5e1454405eb2a975c43eace6ec%2F2022-09-05T07%3A55%3A48Z%2F-1%2F%2F22e1a3002d0bde1a293ec961045f5cc4e5bdd673cfe251dc5c84bf68172e964b&responseContentDisposition=attachment%3B%20filename%3DUG2_val.tar
PaddleDetection-release-2.4.tar下载地址:https://bj.bcebos.com/ai-studio-online/a9bf30649ffe431cbca10ba792cc0ae618dfaf9a212d4f6fa60ce3cad111f807?authorization=bce-auth-v1%2F5cfe9a5e1454405eb2a975c43eace6ec%2F2022-09-05T07%3A55%3A48Z%2F-1%2F%2F253f03c5bb39604e04882b8f88f587a80707720935130cfafd8777b1ab535e0a&responseContentDisposition=attachment%3B%20filename%3DPaddleDetection-release-2.4.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 张真实场景图片作为验证集。图像数量分布如下表所示:
其中文件名带有后缀 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=0
python -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.407
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.672
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.416
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.283
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.489
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.716
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.282
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.492
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.510
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.390
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.618
Average 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.413
11584 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.672
11585 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.415
11586 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.277
11587 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.519
11588 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.726
11589 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.282
11590 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.499
11591 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.517
11592 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.387
11593 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.641
11594 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
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 ...
更多内容详见 >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