基于Cascade-RCNN模型的智慧城市车辆检测

   日期:2023-09-02     浏览:3    

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 文件中,解压到合适路径即可使用。

数据集由于不可开源,需要开发者通过以下流程自行处理:

  1. 发邮件申请:https://www.aicitychallenge.org/2022-data-access-instructions/

  2. 下载后跟踪官方给的检测结果生成 json 格式数据集,或者自行标注。数据处理参考:x2coco.py

  3. 将生成后的标注和对应的数据,放到 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
|   ...

补充:COCO 数据标注文件介绍

4. 模型选择

PaddleDetection 中可选择不同版本的模型,该案例中选择了 Cascade-RCNN 检测模型,其中 backbone ResNet50_vd 为例。基于 COCO2017 目标检测数据集,COCO mAP 可达 42.1%。选择 Cascade-RCNN 的原因:

  1. 二阶段模型比一阶段模型有更好的效果,本案例演示以效果为主;

  2. Cascade-RCNN 采用级联的优化方式,达到不断优化预测结果的目的;

  3. Cascade-RCNN与一般级联方法不同,采用了不同IOU阈值确定的正负样本上训练;

  4. 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,用于服务端模型部署

总体上分为三步:

  1. 创建PaddlePredictor,设置所导出的模型路径

  2. 创建输入用的 PaddleTensor,传入到 PaddlePredictor 中

  3. 获取输出的 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介绍


 
 
更多>同类产业范例库

推荐产业范例库
点击排行

北京人工智能高质量数据集服务平台

创新数据服务,积极推进数据拓展应用

关于我们

联系我们