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

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
  • 14
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
基于Yolov5的雾天行人车辆检测可以通过以下步骤实现: 1.准备数据集:收集并标注雾天环境下的行人车辆图像数据集。 2.训练模型:使用Yolov5算法对数据集进行训练,得到行人车辆目标检测模型。 3.模型测试:使用训练好的模型对新的雾天环境下的图像进行目标检测。 具体实现步骤如下: 1.安装Yolov5:在终端中输入以下命令安装Yolov5。 ```shell git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt ``` 2.准备数据集:收集并标注雾天环境下的行人车辆图像数据集。将数据集划分为训练集和测试集,并将其放置在相应的文件夹中。 3.训练模型:在终端中输入以下命令训练模型。 ```shell python train.py --img 640 --batch 16 --epochs 100 --data data.yaml --cfg models/yolov5s.yaml --weights '' --name yolov5s_results ``` 其中,--img指定输入图像的大小,--batch指定批量大小,--epochs指定训练轮数,--data指定数据集的配置文件,--cfg指定模型的配置文件,--weights指定预训练模型的权重文件,--name指定训练结果的保存文件夹。 4.模型测试:在终端中输入以下命令测试模型。 ```shell python detect.py --weights runs/train/yolov5s_results/weights/best.pt --img 640 --conf 0.4 --source test/images/ ``` 其中,--weights指定训练好的模型的权重文件,--img指定输入图像的大小,--conf指定置信度阈值,--source指定测试集的图像文件夹。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值