pp-vehicle简介

简介

飞桨目标检测端到端开发套件PaddleDetection正式开源车辆分析工具PP-Vehicle!该工具主要包含:提供车牌识别、车辆属性分析(颜色、车型)、车流量统计以及违章检测四大功能,兼容图片、在线视频流、视频输入,提供完善的二次开发文档教程

 

PP-vehicle是一款针对车辆分析相关场景的开源工具,产品主要围绕以下几个方面进行设计开发:

  • 实用性:针对车辆分析场景共性的底层模型进行优化迭代;针对几个高频场景进行了详细的后处理策略设计,可以满足业务的快速上线需求。同时提供丰富的二次开发教程,方便用户根据自己的业务场景进行私有化开发。

  • 泛化性:在公开数据集以及自采数据集上进行充分训练,并且提供预训练模型,覆盖车辆分析中监控视角、驾驶员视角、俯拍视角等常见相机视角。

  • 低代码:实现1行代码快速部署,支持 图片、视频、单路/多路rtsp视频流输入,修改配置文件即可快速实现策略修改以及pipeline的组合。

PP-Vehicle整体方案

 

PP-Vehicle整体分为输入、核心算法、输出三部分:

1.核心算法

主要由预训练模型以及逻辑策略组成。预训练模型主要由4个:车辆检测模型、车辆跟踪模型、车牌识别模型、车辆属性分析模型。各个模型性能见下表。

2.案例展示

2.1配置文件说明

PP-Vehicle相关配置位于deploy/pipeline/config/infer_cfg_ppvehicle.yml中,存放模型路径,完成不同功能需要设置不同的任务类型

功能及任务类型对应表单如下:

输入类型功能任务类型配置项
图片属性识别目标检测 属性识别DET ATTR
单镜头视频属性识别多目标跟踪 属性识别MOT ATTR
单镜头视频车牌识别多目标跟踪 车牌识别MOT VEHICLEPLATE

例如基于视频输入的属性识别,任务类型包含多目标跟踪和属性识别,具体配置如下:

crop_thresh: 0.5
visual: True
warmup_frame: 50
​
MOT:
  model_dir: https://bj.bcebos.com/v1/paddledet/models/pipeline/mot_ppyoloe_l_36e_ppvehicle.zip
  tracker_config: deploy/pipeline/config/tracker_config.yml
  batch_size: 1
  enable: True
​
VEHICLE_ATTR:
  model_dir: https://bj.bcebos.com/v1/paddledet/models/pipeline/vehicle_attribute_model.zip
  batch_size: 8
  color_threshold: 0.5
  type_threshold: 0.5
  enable: True

注意:

  • 如果用户需要实现不同任务,可以在配置文件对应enable选项设置为True。

  • 如果用户仅需要修改模型文件路径,可以在命令行中--config后面紧跟着 -o MOT.model_dir=ppyoloe/ 进行修改即可,也可以手动修改配置文件中的相应模型路径,详细说明参考下方参数说明文档。

2.2预测部署

1.直接使用默认路径或者examples中配置文件,或者直接在infer_cfg_ppvehicle.yml中修改配置:

# 例:车辆检测,指定配置文件路径和测试图片
python deploy/pipeline/pipeline.py --config deploy/pipeline/config/infer_cfg_ppvehicle.yml --image_file=test_image.jpg --device=gpu
​
# 例:车辆车牌识别,指定配置文件路径和测试视频
python deploy/pipeline/pipeline.py --config deploy/pipeline/config/examples/infer_cfg_vehicle_plate.yml --video_file=test_video.mp4 --device=gpu

2.使用命令行进行功能开启,或者模型路径修改:

# 例:车辆跟踪,指定配置文件路径和测试视频,命令行中开启MOT模型并修改模型路径,命令行中指定的模型路径优先级高于配置文件
python deploy/pipeline/pipeline.py --config deploy/pipeline/config/infer_cfg_ppvehicle.yml -o MOT.enable=True MOT.model_dir=ppyoloe_infer/ --video_file=test_video.mp4 --device=gpu
​
# 例:车辆违章分析,指定配置文件和测试视频,命令行中指定违停区域设置、违停时间判断。
python deploy/pipeline/pipeline.py --config deploy/pipeline/config/examples/infer_cfg_illegal_parking.yml \
                                                   --video_file=../car_test.mov \
                                                   --device=gpu \
                                                   --draw_center_traj \
                                                   --illegal_parking_time=3 \
                                                   --region_type=custom \
                                                   --region_polygon 600 300 1300 300 1300 800 600 800

 

3.方案解析

3.1车牌识别方案

  • 通过目标检测来获取图片中的车辆检测框,模型方案为pp-YOLOE-l。当输入为视频时,会基于车辆检测框,使用OC-SORT跟踪器来完成车辆多目标跟踪

  • 通过车辆检测框的坐标截取对应位置图像;

  • 使用车牌检测模型在每张车辆截图中识别车牌所在位置,同理截取车牌区域,模型方案为PP-OCRv3车牌检测模型

  • 使用字符识别模型识别车牌中的字符,模型方案为PP-OCRv3车牌识别模型

  • 此外还使用了一些优化策略提升速度以及准确率

3.2车辆属性识别方案

3.3违规检测方案

4.车辆属性识别-PaddleClas

基于paddlepaddle开元的paddleClas超轻量图像分类方案

  • 精度高的模型往往体积大,运算慢,尝尝难以满足实际部署需求

  • 找到合适的模型后,往往还需要经验丰富的工程师进行调参,费时费力。

paddlecls为了解决以上难题,让分类模型的训练和调参更加容易,总结推出了实际轻量图像分类解决方案(PULC, Practical Ultra Lightweight Classification)。pulc融合了骨干网络、数据增广、蒸馏等多种前沿算法,可以自动训练得到轻量且高精度的图像分类模型。

pulc已经验证在多个场景中有效,用超轻量模型就可以实现与SwinTransformer模型接近的精度,预测速度提升40+倍

方案主要包括4部分,分别是:PP-LCNET轻量级骨干网络、SSLD预训练权重、数据增强策略集成(EDA)和SKL-UGI知识蒸馏算法。此外,我们还采用了超参搜索的方法,高效优化训练中的超参数。

4.1案例-有人/无人分类模型

4.1.1场景介绍

模型Tpr(%)延时(ms)存储(M)策略
SwinTranformer_tiny95.6995.30111使用 ImageNet 预训练模型
MobileNetV3_small_x0_3568.252.852.6使用 ImageNet 预训练模型
PPLCNet_x1_089.572.127.0使用 ImageNet 预训练模型
PPLCNet_x1_092.102.127.0使用 SSLD 预训练模型
PPLCNet_x1_093.432.127.0使用 SSLD 预训练模型+EDA 策略
PPLCNet_x1_096.232.127.0使用 SSLD 预训练模型+EDA 策略+SKL-UGI 知识蒸馏策略

从表中可以看出,backbone 为 SwinTranformer_tiny 时精度较高,但是推理速度较慢。将 backbone 替换为轻量级模型 MobileNetV3_small_x0_35 后,速度可以大幅提升,但是会导致精度大幅下降。将 backbone 替换为速度更快的 PPLCNet_x1_0 时,精度较 MobileNetV3_small_x0_35 高 20 多个百分点,与此同时速度依旧可以快 20% 以上。在此基础上,使用 SSLD 预训练模型后,在不改变推理速度的前提下,精度可以提升约 2.6 个百分点,进一步地,当融合EDA策略后,精度可以再提升 1.3 个百分点,最后,在使用 SKL-UGI 知识蒸馏后,精度可以继续提升 2.8 个百分点。此时,PPLCNet_x1_0 达到了 SwinTranformer_tiny 模型的精度,但是速度快 40 多倍。

4.1.2数据准备

数据格式说明

PaddleClas 使用 txt 格式文件指定训练集和测试集,以有人/无人场景为例,其中需要指定 train_list.txtval_list.txt 当作训练集和验证集的数据标签,格式形如:

# 每一行采用"空格"分隔图像路径与标注
train/1.jpg 0
train/10.jpg 1
...

标注文件生成

假设数据存放路径./train,./train中包含了每个类别的数据,类别号从0开始,每个类别的文件夹中又具体的图像数据。

train
├── 0
│   ├── 0.jpg
│   ├── 1.jpg
│   └── ...
└── 1
    ├── 0.jpg
    ├── 1.jpg
    └── ...
└── ...
tree -r -i -f train | grep -E "jpg|JPG|jpeg|JPEG|png|PNG" | awk -F "/" '{print $0" "$2}' > train_list.txt

其中,如果涉及更多的图片名称尾缀,可以增加 grep -E后的内容, $2 中的 2 为类别号文件夹的层级。

进入paddlecls目录

cd path_to_PaddleClas

进入 dataset/ 目录,下载并解压有人/无人场景的数据。

cd dataset
wget https://paddleclas.bj.bcebos.com/data/PULC/person_exists.tar
tar -xf person_exists.tar
cd ../

32G,这里就不做演示了

执行上述命令后,datasets/下存在person_exists 目录,该目录中具有以下数据:

├── train
│   ├── 000000000009.jpg
│   ├── 000000000025.jpg
...
├── val
│   ├── objects365_01780637.jpg
│   ├── objects365_01780640.jpg
...
├── ImageNet_val
│   ├── ILSVRC2012_val_00000001.JPEG
│   ├── ILSVRC2012_val_00000002.JPEG
...
├── train_list.txt
├── train_list.txt.debug
├── train_list_for_distill.txt
├── val_list.txt
└── val_list.txt.debug

其中 train/val/ 分别为训练集和验证集。train_list.txtval_list.txt 分别为训练集和验证集的标签文件,train_list.txt.debugval_list.txt.debug 分别为训练集和验证集的 debug 标签文件,其分别是 train_list.txtval_list.txt 的子集,用该文件可以快速体验本案例的流程。ImageNet_val/ 是 ImageNet-1k 的验证集,该集合和 train 集合的混合数据用于本案例的 SKL-UGI知识蒸馏策略,对应的训练标签文件为 train_list_for_distill.txt

4.1.3使用标准分类配置进行训练

4.1.3.1 PP-LCNet(骨干网络)

PULC采用了轻量骨干网络pp-LCNet,相比同精度竞品速度快50%,直接使用pp-LCNet训练的命令为:

export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
    --gpus="0,1,2,3" \
    tools/train.py \
        -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0_search.yaml

为了方便性能对比,paddlecls也提供了大型SwinTransformer_tiny 和轻量模型 MobileNetV3_small_x0_35 的配置文件,可以使用命令训练:

SwinTransformer_tiny:

export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
    --gpus="0,1,2,3" \
    tools/train.py \
        -c ./ppcls/configs/PULC/person_exists/SwinTransformer_tiny_patch4_window7_224.yaml

MobileNetV3_small_x0_35:

export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
    --gpus="0,1,2,3" \
    tools/train.py \
        -c ./ppcls/configs/PULC/person_exists/MobileNetV3_small_x0_35.yaml

训练得到的模型精度对比如下表。

模型Tpr(%)延时(ms)存储(M)策略
SwinTranformer_tiny95.6995.30107使用 ImageNet 预训练模型
MobileNetV3_small_x0_3568.252.851.6使用 ImageNet 预训练模型
PPLCNet_x1_089.572.126.5使用 ImageNet 预训练模型

从中可以看出,PP-LCNet 的速度比 SwinTransformer 快很多,但是精度也略低。下面我们通过一系列优化来提高 PP-LCNet 模型的精度。

摘要


PP-LCNet: 一个轻量级的卷积神经网络

PP-LCNet论文全文解析

一种基于MKLDNN加速策略的轻量级卷积神经网络,能够用于多任务的轻量级模型。能在保持延迟不变的情况下提高模型准确率。

模型评估

python3 tools/eval.py \
    -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0.yaml \
    -o Global.pretrained_model="output/PPLCNet_x1_0/best_model"

其中-o Global.pretrained_model="output/PPLCNet_x1_0/best_model" 指定了当前最佳权重所在的路径,如果指定其他权重,只需替换对应的路径即可。

模型预测

模型训练完成之后,可以加载训练得到的预训练模型,进行模型预测。在模型库的 tools/infer.py 中提供了完整的示例,只需执行下述命令即可完成模型预测:

python3 tools/infer.py \
    -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0.yaml \
    -o Global.pretrained_model=output/PPLCNet_x1_0/best_model

结果如下:

[{'class_ids': [1], 'scores': [0.9999976], 'label_names': ['someone'], 'file_name': 'deploy/images/PULC/person_exists/objects365_02035329.jpg'}]

备注:

  • 二分类默认的阈值为0.5, 如果需要指定阈值,可以重写 Infer.PostProcess.threshold ,如-o Infer.PostProcess.threshold=0.9794,该值需要根据实际场景来确定,此处的 0.9794 是在该场景中的 val 数据集在千分之一 Fpr 下得到的最佳 Tpr 所得到的。

4.1.3.2 SSLD预训练权重

SSLD是百度自研的半监督蒸馏算法,在imagenet数据集上,模型精度可以提升3-7个点。我们发现,使用SSLD预训练权重,可以有效提升应用分类模型的精度。此外,在训练中使用更小的分辨率,可以有效提升模型精度。同时,我们也对学习率进行了优化。 基于以上三点改进,我们训练得到模型精度为 92.1%,提升 2.6%。

4.1.3.3 EDA数据增强策略

数据增强是视觉算法中常用的优化策略,可以对模型精度有明显提升。除了传统的

RandomCrop,RandomFlip 等方法之外,我们还应用了 RandomAugment 和 RandomErasing, 由于这两种数据增强对图片的修改较大,使分类任务变难,在一些小数据集上可能会导致模型欠拟合,我们将提前设置好这两种方法启用的概率。 基于以上改进,我们训练得到模型精度为 93.43%,提升 1.3%。

4.1.3.4 SKL-UGI模型蒸馏

模型蒸馏是一种可以有效提升小模型精度的方法,本文选择 ResNet101_vd 作为教师模型进行蒸馏。为了适应蒸馏过程,我们在此也对网络不同 stage 的学习率进行了调整。基于以上改进,我们训练得到模型精度为 95.6%,提升 1.4%。

教师模型训练

复用 ppcls/configs/PULC/person_exists/PPLCNet/PPLCNet_x1_0.yaml 中的超参数,训练教师模型,训练脚本如下:

export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
    --gpus="0,1,2,3" \
    tools/train.py \
        -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0.yaml \
        -o Arch.name=ResNet101_vd

验证集的最佳指标为 0.96-0.98 之间,当前教师模型最好的权重保存在 output/ResNet101_vd/best_model.pdparams

蒸馏训练

配置文件ppcls/configs/PULC/person_exists/PPLCNet_x1_0_distillation.yaml提供了SKL-UGI知识蒸馏策略的配置。该配置将ResNet101_vd当作教师模型,PPLCNet_x1_0当作学生模型,使用ImageNet数据集的验证集作为新增的无标签数据。训练脚本如下:

export CUDA_VISIBLE_DEVICES=0,1,2,3
python3 -m paddle.distributed.launch \
    --gpus="0,1,2,3" \
    tools/train.py \
        -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0_distillation.yaml \
        -o Arch.models.0.Teacher.pretrained=output/ResNet101_vd/best_model

验证集的最佳指标为 0.95-0.97 之间,当前模型最好的权重保存在 output/DistillationModel/best_model_student.pdparams

4.1.3.5 总结

经过以上方法优化,PP-LCNet最终精度达到 95.6%,达到了大模型的精度水平。我们将实验结果总结如下表:

模型Tpr(%)延时(ms)存储(M)策略
SwinTranformer_tiny95.6995.30107使用 ImageNet 预训练模型
MobileNetV3_small_x0_3568.252.851.6使用 ImageNet 预训练模型
PPLCNet_x1_089.572.126.5使用 ImageNet 预训练模型
PPLCNet_x1_092.102.126.5使用 SSLD 预训练模型
PPLCNet_x1_093.432.126.5使用 SSLD 预训练模型+EDA 策略
PPLCNet_x1_095.602.126.5使用 SSLD 预训练模型+EDA 策略+SKL-UGI 知识蒸馏策略

4.1.3.6模型推理

paddle inference是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力。相比于直接基于预训练模型进行预测,Paddle Inference可使用 MKLDNN、CUDNN、TensorRT 进行预测加速,从而实现更优的推理性能。更多关于 Paddle Inference 推理引擎的介绍,可以参考 Paddle Inference官网教程

基于训练得到的权重导出inference模型

此处,我们提供了将权重和模型转换的脚本,执行该脚本可以得到对应的 inference 模型:

python3 tools/export_model.py \
    -c ./ppcls/configs/PULC/person_exists/PPLCNet_x1_0.yaml \
    -o Global.pretrained_model=output/DistillationModel/best_model_student \
    -o Global.save_inference_dir=deploy/models/PPLCNet_x1_0_person_exists_infer

执行完该脚本后会在 deploy/models/ 下生成 PPLCNet_x1_0_person_exists_infer 文件夹,models 文件夹下应有如下文件结构:

├── PPLCNet_x1_0_person_exists_infer
│   ├── inference.pdiparams
│   ├── inference.pdiparams.info
│   └── inference.pdmodel

python预测引擎推理

# 使用下面的命令使用 GPU 进行预测
python3.7 python/predict_cls.py -c configs/PULC/person_exists/inference_person_exists.yaml
# 使用下面的命令使用 CPU 进行预测
python3.7 python/predict_cls.py -c configs/PULC/person_exists/inference_person_exists.yaml -o Global.use_gpu=False

输出结果如下。

objects365_02035329.jpg:    class id(s): [1], score(s): [1.00], label_name(s): ['someone']

备注: 二分类默认的阈值为0.5, 如果需要指定阈值,可以重写 Infer.PostProcess.threshold ,如-o Infer.PostProcess.threshold=0.9794,该值需要根据实际场景来确定,此处的 0.9794 是在该场景中的 val 数据集在千分之一 Fpr 下得到的最佳 Tpr 所得到的。

5.车牌识别-PaddleOCR

车牌识别难点:

  • 车牌在图像中的尺度差异大、在车辆上的悬挂位置不固定

  • 车牌图像质量层次不齐: 角度倾斜、图片模糊、光照不足、过曝等问题严重

  • 边缘和端测场景应用对模型大小有限制,推理速度有要求

针对以上问题, 本例选用 PP-OCRv3 这一开源超轻量OCR系统进行车牌识别系统的开发。基于PP-OCRv3模型,在CCPD数据集达到99%的检测和94%的识别精度,模型大小12.8M(2.5M+10.3M)。基于量化对模型体积进行进一步压缩到5.8M(1M+4.8M), 同时推理速度提升25%。

paddle_车牌识别.ipynb

6.车辆检测-PP-YOLOE

PP-YOLOE是基于PP-YOLOv2的单阶段Anchor-free模型。PP-YOLOE有一系列的模型,即s/m/l/x,可以通过width multiplier和depth multiplier配置。

模型数据集类别数mAPval 0.5:0.95下载链接配置文件
PP-YOLOE-lBDD100K-DET1035.6下载链接配置文件
PP-YOLOE-lBDD100K-MOT833.7下载链接配置文件
PP-YOLOE-lUA-DETRAC451.4下载链接配置文件
PP-YOLOE-lPPVehicle9cls940.0下载链接配置文件
PP-YOLOE-sPPVehicle9cls935.3下载链接配置文件
PP-YOLOE-lPPVehicle163.9下载链接配置文件
PP-YOLOE-sPPVehicle161.3下载链接配置文件

pp-yoloE.ipynb

7.参考文章

“看”车,有TA就够了!车辆分析工具PP-Vehicle开源上新!

https://gitee.com/zhonglongshen/PaddleClas#/zhonglongshen/PaddleClas/blob/release/2.5/docs/zh_CN/training/PULC.md

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Bit-vehicle 测试集是一种用于测试和评估无人驾驶车辆性能的数据集。它包含了大量的图像、视频和传感器数据,涵盖了各种驾驶场景和交通条件。Bit-vehicle 测试集的目的是帮助开发者和研究人员改进和优化无人驾驶车辆的感知、决策和控制能力。 Bit-vehicle 测试集有几个主要的特点。首先,它覆盖了不同的天气条件,包括阳光明媚、多云、阴雨等。这样的多样性可以测试无人驾驶车辆在各种不同的光照和天气状况下的性能。其次,该测试集包含了各种驾驶场景,如城市街道、高速公路、乡村道路等。这样的场景多样性可以测试无人驾驶车辆在不同环境下的适应性和应对能力。此外,Bit-vehicle 测试集还包括了一些特殊且复杂的交通状况,如道路施工、交通堵塞等,以测试无人驾驶车辆在挑战性情况下的表现。 使用 Bit-vehicle 测试集,开发者和研究人员可以进行无人驾驶车辆的感知和决策算法测试、性能评估和对比实验。他们可以根据测试集提供的数据来训练和验证自己的模型,以改进和优化车辆的行为。此外,Bit-vehicle 测试集还可以为无人驾驶车辆的安全性评估和认证提供参考。通过对车辆在不同场景和条件下的表现进行综合评估,可以更好地了解车辆的潜在风险和安全隐患,为无人驾驶车辆行业的发展提供有力的支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值