1. 项目说明
《“十四五”国家信息化规划》提出,“完善城市信息模型平台和运行管理服务平台,探索建设数字孪生城市。实施智能化市政基础设施建设和改造,有效提升城市运转和经济运行状态的泛在感知和智能决策能力。
然而,城市中出行及运输是生活中不可或缺的重要环节,担负起了资源配给,高效运作,如今在城市飞速发展的过程中,人工智能承担着持续提高效率的关键,许多智能化信息互通技术应运而生。其中,车辆检测技术是整个城市智能信息化系统中最基础,也是最重要的模块。车辆检测模型效果如下:
图 1 - 车辆检测模型效果
方案难点:
城市道路路况复杂,要适应白天、黑夜、雾天和雨天等
监控摄像头按照差异大、目标尺寸差异大等
2. 安装说明
2.1 环境要求
本示例是基于 PaddlDetection 2.4 版本实现的 Cascade-RCNN,并提供了基于 COCO 数据集的 ResNet50_vd 的预训练模型,在 AI CITY 2022 数据集进行了训练。
PaddlePaddle 2.2.2
Python 3(3.5.1+/3.6/3.7/3.8/3.9)
CUDA >= 10.1
cuDNN >= 7.6
2.2 解压代码
项目代码在 PaddleDetection.tar
文件中,解压到合适路径即可使用。
数据集由于不可开源,需要开发者通过以下流程自行处理:
发邮件申请:https://www.aicitychallenge.org/2022-data-access-instructions/
下载后跟踪官方给的检测结果生成 json 格式数据集,或者自行标注。数据处理参考:x2coco.py
将生成后的标注和对应的数据,放到
dataset
目录下,比如:dataset/aicity
# 如果希望解压到其他目录
#可选择其他路径(默认 /home/aistudio )
%cd ~
! tar xf ~/data/data141427/PaddleDetection.tar
%cd ~/PaddleDetection# 安装库
! pip install -r requirements.txt
3. 数据准备
3.1 数据介绍
本案例使用数据集为 CityFlowV2,该数据集只能用于学术研究等非商业用途,包含了 46 个摄像头总计 3 个多小时的视频数据。
CityFlowV2 数据集的使用需按照地址自行申请
申请数据后,可以采用ffmpeg将视频转为图片:
./ffmpeg -i ${VIDEO_PATH} -f image2 -vf fps=fps=0.5 -qscale:v 2 ${SAVE_PATH}/%04d.jpg
3.2 数据结构
首先我们看一下文档树结构(COCO 格式)。
data/coco/ ├── annotations │ ├── instances_train2014.json │ ├── instances_train2017.json │ ├── instances_val2014.json │ ├── instances_val2017.json | ... ├── train2017 │ ├── 000000000013.jpg │ ├── 000000580008.jpg | ... ├── val2017 │ ├── 000000000125.jpg │ ├── 000000000256.jpg | ...
4. 模型选择
PaddleDetection 中可选择不同版本的模型,该案例中选择了 Cascade-RCNN 检测模型,其中 backbone ResNet50_vd 为例。基于 COCO2017 目标检测数据集,COCO mAP 可达 42.1%。选择 Cascade-RCNN 的原因:
二阶段模型比一阶段模型有更好的效果,本案例演示以效果为主;
Cascade-RCNN 采用级联的优化方式,达到不断优化预测结果的目的;
Cascade-RCNN与一般级联方法不同,采用了不同IOU阈值确定的正负样本上训练;
Cascade-RCNN相比faster rcnn系列的2阶段检测方法,在COCO数据集上有更高的指标。
5. 模型训练
在启动模型训练之前,可以配置 train.py
文件中相关内容, 包括 VisualDL 的使用,是否同步验证(eval)数据等。
同时,开发者应该按照以下步骤完成 yml 文件的配置。# 拷贝一份原有配置,方便下面修改
! cd configs/cascade_rcnn &&
cp cascade_rcnn_r50_vd_fpn_ssld_1x_coco.yml cascade_rcnn_r50_vd_fpn_ssld_1x_aicity.yml修改 cascade_rcnn_r50_vd_fpn_ssld_1x_aicity.yml
中的数据项, 将 ../datasets/coco_detection.yml
替换为 ../datasets/aicity_detection.yml
_base_: [ '../datasets/coco_detection.yml', // ==> '../datasets/aicity_detection.yml', '../runtime.yml', '_base_/optimizer_1x.yml', '_base_/cascade_rcnn_r50_fpn.yml', '_base_/cascade_fpn_reader.yml', ] pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet50_vd_ssld_v2_pretrained.pdparams weights: output/cascade_rcnn_r50_vd_fpn_ssld_1x_coco/model_final ResNet: depth: 50 variant: d norm_type: bn freeze_at: 0 return_idx: [0,1,2,3] num_stages: 4 lr_mult_list: [0.05, 0.05, 0.1, 0.15] `` #拷贝一份原有配置,方便下面修改 ! cd configs/datasets && cp coco_detection.yml aicity_detection.yml修改 `aicity_detection.yml` 中的数据路径和标注:dataset_dir: dataset/aicity, anno_path: annotations/aicity_train.json eval 和 test 同样也对应修改。
metric: COCO
num_classes: 1
TrainDataset:
!COCODataSet
image_dir: .
anno_path: annotations/train_plus_cls1.json // ==> anno_path: annotations/aicity_train.json
dataset_dir: dataset/track3 // ==> dataset_dir: dataset/aicity
data_fields: [‘image’, ‘gt_bbox’, ‘gt_class’, ‘is_crowd’]
evalDataset:
!COCODataSet
image_dir: .
anno_path: annotations/test_cls1.json // 同 TrainDataset anno_path
dataset_dir: dataset/track3 // 同 TrainDataset dataset_dir
TestDataset:
!ImageFolder
anno_path: annotations/test_cls1.json // 同 TrainDataset anno_path
dataset_dir: dataset/track3 // 同 TrainDataset dataset_dir
因此在开始训练时需要到把 `--gpus 0,1,2,3` 改为 `--gpus 0` ```sh !bash train.sh
Configuration Arguments
backend: auto
elastic_server: None
force: False
gpus: 0,1,2,3
heter_devices:
heter_worker_num: None
heter_workers:
host: None
http_port: None
ips: 127.0.0.1
job_id: None
log_dir: ./cascade-rcnn-det/
np: None
nproc_per_node: None
run_mode: None
scale: 0
server_num: None
servers:
training_script: tools/train.py
training_script_args: [’-c’, ‘configs/cascade_rcnn/cascade_rcnn_r50_vd_fpn_ssld_1x_aicity.yml’, ‘–eval’]
worker_num: None
workers:
6. 模型评估
考虑到 aicity 数据的不可开源,这里需要开发者自行根据数据做处理。
评估脚本可以参考 `eval.sh````
CUDA_VISIBLE_DEVICES=0
python tools/eval.py
-c configs/cascade_rcnn/cascade_rcnn_r50_vd_fpn_ssld_1x_aicity.yml
-o weights=output/cascade_rcnn_r50_vd_fpn_ssld_1x_aicity/best_model.pdparams
7. 推理可视化
还是以 U-HRNet-W18-small
为例,我们选用训练时的数据集配置和得到的最优模型。输出路径默认为output/result
。```sh
! bash infer.sh
<img width='49%' height='49%' src='https://ai-studio-static-online.cdn.bcebos.com/78d86e61dbfa4f8ca86af359b6e5d838a4a9a8080c61428a837b4e710eeabecc' /> <img width='49%' height='49%' src='https://ai-studio-static-online.cdn.bcebos.com/4394a8c67a164d6289a3b104d6afa377b773f522fc0c4054a84552e98c9d25e3' /> </div> <div style='display: flex; justify-content: space-between; margin: 16px 0;'> <img width='49%' height='49%' src='https://ai-studio-static-online.cdn.bcebos.com/e21b4a5ac4294da797d332e54936e3bdaffe969a542443eb85b4734f1c7ff226' /> <img width='49%' height='49%' src='https://ai-studio-static-online.cdn.bcebos.com/7867aa5de9484f8aa301dc7d9f402858af9ce36c1f75441f9849ccdf348b2148' /> </div> <div style='display: flex; justify-content: space-between; margin: 16px 0;'> <img width='49%' height='49%' src='https://ai-studio-static-online.cdn.bcebos.com/b87c3165b9d94ed19f02595b5dcaa640820f43ecd4754943a56206115f3f31bb' /> <img width='49%' height='49%' src='https://ai-studio-static-online.cdn.bcebos.com/8b426c245bd3463faaabf9e0858d3f0899456f7570a04e4e88f2260578bac509' /> </div> <div style='display: flex; justify-content: space-between; margin: 16px 0;'> <img width='49%' height='49%' src='https://ai-studio-static-online.cdn.bcebos.com/2e91a805074344fc88264c70cb69cbbc4801e0537c444386bbc2884d070ea453' /> <img width='49%' height='49%' src='https://ai-studio-static-online.cdn.bcebos.com/9e7d1a3e084a4314b704befe22fc45ff13e561a456b0425aa0f6ca064255d97e' /> </div> <div style='display: flex; justify-content: space-between; margin: 16px 0;'> <img width='49%' height='49%' src='https://ai-studio-static-online.cdn.bcebos.com/42133022570c45449e67e58cb155c1054828449f411341b9b837f7c256dc2824' /> <img width='49%' height='49%' src='https://ai-studio-static-online.cdn.bcebos.com/c9221c40187540b6ba59826350a8b2703813afb8011c468b8012733572f92116' /> </div> <p style='text-align: center;'>图 2 - 原始图片(左)与推理图片(右)</p>
8. 模型导出
导出推理模型
PaddlePaddle框架保存的权重文件分为两种:支持前向推理和反向梯度的训练模型 和 只支持前向推理的推理模型。二者的区别是推理模型针对推理速度和显存做了优化,裁剪了一些只在训练过程中才需要的tensor,降低显存占用,并进行了一些类似层融合,kernel选择的速度优化。因此可执行如下命令导出推理模型。
模型默认保存在 output/cascade_rcnn_r50_vd_fpn_ssld_1x_aicity
目录下。! bash export_model.sh关于 PaddleSeg 的更多细节,可参考 PaddleSeg 全流程跑通
9. 模型部署
使用飞桨原生推理库paddle-inference,用于服务端模型部署
总体上分为三步:
创建PaddlePredictor,设置所导出的模型路径
创建输入用的 PaddleTensor,传入到 PaddlePredictor 中
获取输出的 PaddleTensor ,将结果取出
#include "paddle_inference_api.h" // 创建一个 config,并修改相关设置paddle::NativeConfig config; config.model_dir = "xxx"; config.use_gpu = false;// 创建一个原生的 PaddlePredictorauto predictor = paddle::CreatePaddlePredictor<paddle::NativeConfig>(config);// 创建输入 tensorint64_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介绍