【百度AI Studio】利用PaddleDetection框架的行车检测

一、项目简介

项目背景:

该项目着眼于基于视觉深度学习的自动驾驶场景,旨在对车载摄像头采集的视频数据进行道路场景解析,为自动驾驶提供一种解决思路。利用轻量级检测模型PP-PicoDet完成车辆检测实现一种高效高精度的道路场景解析方式,从而实现真正意义上的自动驾驶,减少交通事故的发生,保障车主的人身安全。

项目意义:

在行车检测方面,现有检测模型可以实现多种类型的车辆检测,然而,一方面,检测模型在速度和精度上存在矛盾,对于精度较高的模型,如两阶段检测网络Faster R-CNN,其FPS较低,无法满足实时检测,因此其商用价值受到很大限制。另一方面,对于道路场景的目标检测,许多数据集会对场景中很多类型的目标进行标注,然而,经过我们的实践和观察,使用这种数据集训练模型并不能带来很好的效果。由于目标类别本身存在多样性,例如各式各样的货车,电瓶车,亦或是各式各样的路标和交通灯等,这会对模型的学习造成混淆,最终导致模型在现实场景中对很多目标造成误判,极大的影响模型在现实中的应用。为解决这两个问题,我们在本项目中使用飞桨开源的轻量检测网络PicoDet作为检测模型,在检测速度和检测精度上实现了较好的权衡。另外,我们对大规模道路场景数据集的标签进行了重构处理,仅学习数据集中的汽车类型,保证足以商用的准确率和召回率,对于其他类别,暂时当做背景类,后续可以再使用初始模型重新对背景类中的部分或全部目标进行训练,让不同模型各司其职,专注于不同目标来降低错误率,提高泛化能力。

二、数据集介绍

数据集地址BDD100K 自动驾驶数据集

视频数据: 超过1,100小时的100000个高清视频序列在一天中许多不同的时间,天气条件,和驾驶场景驾驶经验。视频序列还包括GPS位置、IMU数据和时间戳。

道路目标检测:2D边框框注释了100,000张图片,用于公交、交通灯、交通标志、人、自行车、卡车、摩托车、小汽车、火车和骑手。

实例分割:超过10,000张具有像素级和丰富实例级注释的不同图像。

引擎区域:从10万张图片中学习复杂的可驾驶决策。

车道标记:10万张图片上多类型的车道标注,用于引导驾驶

 

三、技术路线

1、PaddleDetection简介:

PaddleDetection 为基于飞桨的端到端目标检测套件,内置30+模型算法及300+预训练模型,覆盖目标检测、实例分割、跟踪、关键点检测等方向,其中包括服务器端和移动端高精度、轻量化产业级 SOTA 模型、冠军方案和学术前沿算法,并提供即插即用的垂类场景预训练模型,覆盖人、车等20+场景,提供配置化的网络模块组件、十余种数据增强策略和损失函数等高阶优化支持和多种部署方案,在打通数据处理、模型开发、训练、压缩、部署全流程的基础上,提供丰富的案例及教程,加速算法产业落地应用。

PaddleDetection模块式地提供YOLOE,EfficientDet等10余种目标检测算法、ResNet-vd,MobileNetV3等10余种backbone,以及sync batch norm, IoU Loss、可变性卷积等多个扩展模块,这些模块可以定制化地自由组合,灵活配置;同时预置提供100余种训练好的检测模型。

PP-YOLOE 是一款高精度推理速度快的检测模型,包含骨干网络 CSPRepResNet、特征融合 CSPPAN、轻量级 ET-Head 和改进的动态匹配算法 TAL(Task Alignment Learning)等模块, 并且根据不同的应用场景设计了一系列模型,即 s/m/l/x。

PP-YOLOE 的全系列模型从精度速度性价比来看达到工业界最优。具体来说,PP-YOLOE-l 在 COCO test-dev 上 AP 可达51.4,在 V100 上速度可达78.1 FPS,使用 TensorRT FP16 进行推理,在 V100 上速度可达149FPS。

此外,PP-YOLOE 还避免使用诸如可变形卷积或者 Matrix NMS 之类的特殊算子,使 PP-YOLOE 全系列模型能轻松地部署在 NVIDIA V100 和 T4 这样的云端 GPU 架构、Jetson 系列的移动端 GPU 和高性能的 FPGA 开发板上。

 2、丰富的模型库:

 

  • CBResNet为Cascade-Faster-RCNN-CBResNet200vd-FPN模型,COCO数据集mAP高达53.3%。精度最高,可以打比赛
  • Cascade-Faster-RCNN为Cascade-Faster-RCNN-ResNet50vd-DCN,PaddleDetection将其优化到COCO数据mAP为47.8%时推理速度为20FPS
  • PP-YOLO:在YOLOv3上改进的模型,精度速度均优于YOLOv4,性价比高。在COCO数据集精度45.9%,Tesla V100预测速度72.9FPS。
  • PP-YOLO v2是对PP-YOLO模型的进一步优化,在COCO数据集精度49.5%,Tesla V100预测速度68.9FPS
  • PP-YOLOE是对PP-YOLO v2模型的进一步优化,在COCO数据集精度51.6%,Tesla V100预测速度78.1FPS
  • YOLOX和YOLOv5均为基于PaddleDetection复现算法
  • TTFNet:AnchorFree模型,速度很快
  • Cascade-Faster-RCNN:在两阶段RCNN基础上改进,比一些量阶段模型速度精度更好
  • 图中模型均可在模型库中获取 3、模型库链接:

3、模型库链接:

PaddleDetection代码GitHub链接:https://github.com/PaddlePaddle/PaddleDetection

PaddleDetection代码Gitee链接:PaddleDetection: PaddleDetection的目的是为工业界和学术界提供丰富、易用的目标检测模型

PaddleDetection文档链接:欢迎使用 PaddleDetection! — PaddleDetection 0.1 文档

四、环境配置

# 克隆paddledetection仓库 # gitee 国内下载比较快 !git clone https://gitee.com/paddlepaddle/PaddleDetection.git # github # !git clone https://github.com/PaddlePaddle/PaddleDetection.git

# 导入package !pip install -r ~/PaddleDetection/requirements.txt

# 继续安装依赖库 !python3 ~/PaddleDetection/setup.py install

进行依赖库的安装时,有时候会报缺少version.py文件的错误,这时候我发现只要将后面的步骤先进行,到训练的时候如果训练出错了,再重新返回来执行依赖库安装的程序,那么就可以了。(其实这个库不安装也行,到后面程序如果需要什么库,再一个一个安装即可)

五、数据准备

!unzip -oq /home/aistudio/data/data102832/bdd100kcar.zip -d /home/aistudio/PaddleDetection/dataset/bd100k
  • 接下来需要将数据集中的json文件转换为xml文件,需要用到第三方库dicttoxml,请先在终端执行以下命令:
pip install dicttoxml
# 生成train_list.txt和val_list.txt
import os
os.chdir('/home/aistudio/PaddleDetection/dataset/bd100k/')
base_dir = 'images/100k/'
label_dir = 'labels/voc_labels/'
with open('train_list.txt', 'w') as train:
    for filename in os.listdir(base_dir + 'train'):
        train.write(base_dir + 'train/' + filename + " " + label_dir + 'train/' + filename.split('.')[0] + '.xml\n')

with open('val_list.txt', 'w') as val:
    for filename in os.listdir(base_dir + 'val'):
        val.write(base_dir + 'val/' + filename + " " + label_dir + 'val/' + filename.split('.')[0] + '.xml\n')
 

在本项目中,我们使用的是bdd100k数据集,并且此数据集已经转为了VOC的数据格式,在我们生成train_list.txt和val_list.txt文件后,我们还需要到PaddleDetection/configs/datasets/voc.yml目录下,修改一下anno_path,或者将train_list.txt和val_list.txt文件改为trainval.txt和test.txt。同时我们还需要自己创建一个label_list.txt文件,文件里的内容为: bus traffic light traffic sign person bike truck motor car train rider

# 查看数据集数量
import os
os.chdir('/home/aistudio/PaddleDetection/dataset/bd100k/')
base_dir = 'images/100k/'
imgs = os.listdir(base_dir + 'train')
print('训练集图片总量: {}'.format(len(imgs)))

imgs = os.listdir(base_dir + 'val')
print('验证集图片总量: {}'.format(len(imgs)))

imgs = os.listdir(base_dir + 'test')
print('测试集图片总量: {}'.format(len(imgs)))
!pip install pycocotools

这一步是如果依赖库安装步骤出了问题无法解决,那么就单独下载下pycocotools这个库,因为我们训练需要用到~

六、数据预处理

sample_transforms:

  • Decode: {}
  • RandomCrop: {}
  • RandomFlip: {prob: 0.5}
  • RandomDistort: {} batch_transforms:
  • BatchRandomResize: {target_size: [576, 608, 640, 672, 704], random_size: True, random_interp: True, keep_ratio: False}
  • NormalizeImage: {is_scale: true, mean: [0.485,0.456,0.406], std: [0.229, 0.224,0.225]}
  • Permute: {}
  • PadGT: {}
  • RandomCrop:随机裁剪图像。
  • RandomFlip:实现图像的随机翻转(翻转概率为0.5)。
  • RandomDistort:以一定的概率对图像进行随机像素内容变换,可包括亮度、对比度、饱和度、色相角度、通道顺序的调整,模型训练时的数据增强操作。
  • BatchRandomResize:对一个批次中的图片随机指定尺寸,范围是[576, 608, 640, 672, 704],插值方式为随机插值,进行多尺度训练。
  • Normalize:图像归一化,均值默认为[0.485, 0.456, 0.406]。长度应与图像通道数量相同。标准差默认为[0.229, 0.224, 0.225]。长度应与图像通道数量相同。

七、模型训练

本项目使用的配置文件是~/PaddleDetection/configs/picodet/picodet_xs_416_coco_lcnet.yml

包含的配置文件如下:

 

BASE: [ '../datasets/voc.yml', '../runtime.yml', 'base/picodet_v2.yml', 'base/optimizer_200e.yml', 'base/picodet_416_reader.yml', ]

  • 训练阶段采用的学习率衰减策略为余弦衰减,最大迭代轮次为200,由于该数据集只进行二分类,即汽车和背景类,观察vdl模型基本收敛即可停止训练。

# 开始训练
%cd ~/PaddleDetection
!python3 tools/train.py -c configs/picodet/picodet_xs_416_coco_lcnet.yml --eval \
     --use_vdl True \
     --vdl_log_dir output/vdl_picodet_xs/ \
     -o use_gpu=true

切记,如果我们要训练自己的数据集,那么一定要到configs配置文件里面找到自己所训练的文件,将路径改为自己的数据集路径。以我的举例子,那么我们就要到 configs/picodet/picodet_xs_416_coco_lcnet.yml这个路径下,将_BASE_: [ '../datasets/voc.yml', '../runtime.yml', 'base/picodet_v2.yml', 'base/optimizer_300e.yml', 'base/picodet_416_reader.yml', ]里面的../datasets/voc.yml',改为自己数据集所在的路径。

八、模型评估

# 评估 默认使用训练过程中保存的best_model
# -c 参数表示指定使用哪个配置文件
# -o 参数表示指定配置文件中的全局变量(覆盖配置文件中的设置),需使用单卡评估
%cd ~/PaddleDetection
!python tools/eval.py -c configs/picodet/picodet_xs_416_coco_lcnet.yml \
    -o weights=PaddleDetection/output/picodet_xs_416_coco_lcnet/best_model.pdparams \
    -o use_gpu=true

训练完成以后,我们就需要用训练完成后保存的best_model.pdparams文件进行评估,最后会评估出模型的mAP,也就是均值平均精度,以及模型的平均FPS(帧率)。从这个结果上,我们就可以大致看出本次训练的效果如何。然后再考虑要不要换个模型试试或者改变部分参数进行重新训练。

九、模型测试

动态图测试

# 测试 -c 参数表示指定使用哪个配置文件
# -o 参数表示指定配置文件中的全局变量(覆盖配置文件中的设置)
# --infer_dir 参数指定预测图像所在文件夹路径
# --infer_img 参数指定预测图像路径
# --output_dir 输出结果文件夹路径
# 预测结束后会在output文件夹中生成一张画有预测结果的同名图像
%cd ~/PaddleDetection
!python tools/infer.py -c configs/picodet/picodet_xs_416_coco_lcnet.yml \
--infer_dir=dataset/bd100k/images/100k/test \
--output_dir=dataset/result \
-o use_gpu=true \
-o weights=output/picodet_xs_416_coco_lcnet/best_model.pdparams

 测试集效果:

 在预测的步骤中,我遇到了KeyError:10的错误,请教后发现意思是字典索引错误,没有该key,这时候我们只需要根据报错所在的文件位置,然后找到那一行代码,使用.get("key","None"),使它不报错,不影响我们后面程序的执行即可,因为我发现这个错误并不影响预测,如果有小伙伴有更好的解决方法可以反馈。

静态图测试


# 将训练好的模型导出为静态图
%cd ~/PaddleDetection
!python tools/export_model.py -c configs/picodet/picodet_xs_416_coco_lcnet.yml \
              -o weights=output/picodet_xs_416_coco_lcnet/best_model.pdparams \
              --output_dir=inference

 导出文件结构如下

inference/picodet_xs_416_coco_lcnet |--infer_cfg.yml |--model.pdmodel |--model.pdiparams |--model.pdiparams.info

 

Picodet静态图性能测试 在这里,随机从20000张测试集中选择1000张图片进行性能测试,测试环境包括以下三种配置:

CPU+4 Thread
CPU+MKL+4 Thread
GPU

# 随机采样
import shutil
import os
import numpy as np
data_dir = "dataset/bd100k/images/100k/test/"
pathlist= os.listdir(data_dir)
t = np.random.choice(pathlist, size=1000, replace=False)

for path in t:
    src = data_dir + path
    dst = "dataset/static_test/" + path
    shutil.copy(src, dst)

 如果执行随机采样的时候,dataset目录里面没有static_test这个文件,那么可以自己创建此文件夹,用来存储采样后的数据。

# CPU测试推理模型(不开启mkldnn加速)
!python deploy/python/infer.py --model_dir=inference/picodet_xs_416_coco_lcnet \
            --image_dir dataset/static_test \
            --output_dir dataset/static_result \
            --device=CPU --batch_size=1 \
            --cpu_threads=4

# CPU测试推理模型(开启mkldnn加速)
!python deploy/python/infer.py --model_dir=inference/picodet_xs_416_coco_lcnet \
            --image_dir dataset/static_test \
            --output_dir dataset/static_result \
            --device=CPU --batch_size=1 \
            --cpu_threads=4 \
            --enable_mkldnn=True
# GPU测试推理模型
!python deploy/python/infer.py --model_dir=inference/picodet_xs_416_coco_lcnet \
            --image_dir dataset/static_test \
            --output_dir dataset/static_result \
            --device=GPU --batch_size=1
            

测试结果如下:

picodet_xs_416_coco_lcnetpreprocess_time(ms)inference_time(ms)postprocess_time(ms)average latency time(ms)
CPU17.50168.900.10186.47
CPU+MKL18.4018.800.1037.20
GPU15.4015.300.00

 可以看到,picodet_xs_416_coco_lcnet在开了MKL加速后推理速度快了约89%,而GPU模式下相比于MKL加速的CPU模式推理速度快了约21%。由此,在硬件只提供CPU的情况下,开启MKL加速可以大大提高推理速度,如果提供GPU,那么将会使得推理速度进一步大幅提升。

 另外,开启MKL加速对前处理和后处理影响不大,然而,开启GPU加速则对前后处理和模型推理都有较大的提升。

项目总结:

  • 利用PP-PicoDet在大规模车辆数据集BDD100k上进行了50个epoch的预训练,并导出了静态模型,分别在CPU、CPU+MKL、GPU模式下进行了测试,并得出了比较结果。\
  • 通过此次项目,虽然说最后得到的效果不是很好,但是也让我这个新手对AI Studio平台有了更深一步的了解,也学会了Notebook的正确使用方式。\
  • 同时我也认识了很多十分优秀的创作者,一起分享经验,特别是导师的指导,让我避开了好多坑,省了不少时间~ \
  • 希望以后更加努力,争取创造出优质的文章。

                
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心无旁骛~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值