点击查看系列文章目录
0 背景
车牌识别是一个常见的功能需求,NVIDIA 也提供了相应的解决方案,并且部署在 deepstream 中,支持 TLT 迁移学习,训练自己的模型。本文对该模型的使用方法做一个介绍。
项目地址: https://github.com/NVIDIA-AI-IOT/deepstream_lpr_app
测试环境:Jetson Xavier, Jetpack 4.4, deepstream5.0.1
1 项目介绍
如图所示,基于 deepstream 5.0.1 搭建 pipeline 如下,完成端到端车牌识别功能,即输入视频流,经过硬件解码、合流、推理、渲染等过程,得到视频中的车牌号
主要包括三个模型:车辆检测模型(PGIE)、车牌检测模型(SGIE)、车牌识别模型(SGIE),对应的模型路径如下:
- Car detection model https://ngc.nvidia.com/catalog/models/nvidia:tlt_trafficcamnet
- LPD (car license plate detection) model https://ngc.nvidia.com/catalog/models/nvidia:tlt_lpdnet
- LPR (car license plate recognization/text extraction) model https://ngc.nvidia.com/catalog/models/nvidia:tlt_lprnet
关于三种模型的信息如下
模型名称 | 网络架构 | 类别数 | 准确率 | 功能 |
---|---|---|---|---|
TrafficCamNet | DetectNet_v2-ResNet18 | 4 | 83.5%mAP | 车辆检测及跟踪 |
License Plate Detection | DetectNet_v2-ResNet18 | 1 | 98%mAP | 车牌检测及定位 |
License Plate Recognition | Tuned ResNet18 | 36(US)/68(CH) | 97%(US)/99%(CH) | 字符识别 |
项目支持在 Jetson 以及 dGPU 上部署,并且同时支持中文车牌识别和英文车牌识别(美国),检测性能如下
设备 | 输入路数 | batch size | 合计FPS |
Jetson Nano | 1 | 1 | 9.2 |
Jetson NX | 3 | 3 | 80.31 |
Jetson Xavier | 5 | 5 | 146.43 |
T4 | 14 | 14 | 447.15 |
2 项目部署
了解了关于项目的介绍,接下来进行实地部署测试,本文以中文车牌识别为例,测试环境是 Jetson Xavier
git clone https://github.com/NVIDIA-AI-IOT/deepstream_lpr_app.git
cd deepstream_lpr_app/
模型下载及转换(模型下载过程中,如果网速较慢,可以直接到 NGC 对应的模型地址手动下载,然后放到对应的目录即可)
./download_ch.sh
// DS5.0.1 gst-nvinfer cannot generate TRT engine for LPR model, so generate it with tlt-converter
./tlt-converter -k nvidia_tlt -p image_input,1x3x48x96,4x3x48x96,16x3x48x96 models/LP/LPR/ch_lprnet_baseline18_deployable.etlt -t fp16 -e models/LP/LPR/lpr_ch_onnx_b16.engine
其中 tlt-converter 工具可以直接在官网下载
Platform | Compute | Link |
---|---|---|
x86 + GPU | CUDA 10.2/cuDNN 8.0/TensorRT 7.1 | link |
x86 + GPU | CUDA 10.2/cuDNN 8.0/TensorRT 7.2 | link |
x86 + GPU | CUDA 11.0/cuDNN 8.0/TensorRT 7.1 | link |
x86 + GPU | CUDA 11.0/cuDNN 8.0/TensorRT 7.2 | link |
Jetson | JetPack 4.4 | link |
Jetson | JetPack 4.5 | link |
模型准备好之后,models 目录结构如下
.
├── LP
│ ├── LPD
│ │ ├── ccpd_cal.bin
│ │ ├── ccpd_label.txt
│ │ ├── ccpd_pruned.etlt
│ │ └── ccpd_pruned.etlt_b16_gpu0_int8.engine
│ └── LPR
│ ├── ch_lprnet_baseline18_deployable.etlt
│ ├── labels_ch.txt
│ └── lpr_ch_onnx_b16.engine
└── tlt_pretrained_models
└── trafficcamnet
├── resnet18_trafficcamnet_pruned.etlt
├── resnet18_trafficcamnet_pruned.etlt_b1_gpu0_int8.engine
└── trafficnet_int8.txt
然后准备编译测试
make
cd deepstream-lpr-app
cp dict_ch.txt dict.txt
./deepstream-lpr-app 2 2 0 ch_car_test.mp4 ch_car_test.mp4 output.264
其中,deepstream-lpr-app 的参数含义如下
Usage: ./deepstream-lpr-app [1:us model|2: ch_model] [1:file sink|2:fakesink|3:display sink] [0:ROI disable|0:ROI enable] <In mp4 filename> <in mp4 filename> ... <out H264 filename>
注意:
- 目前只支持 mp4 文件输入以及 H264 文件输出
- 车辆检测和车牌检测模型是 INT8 格式,字符识别是 FP16 格式
运行后会保存检测结果视频,输出到 output.264 文件中,用 VLC 等软件可以打开查看,官方检测效果如图所示
我实际测试时,对中文车牌的识别效果一般,主要是测试场景与模型训练场景差异较大,提供的模型是在 CCPD 数据集上训练的,如果要想在自己的场景中有一个好的检测效果,需要用 TLT 工具进行迁移训练,这块的内容不再继续展开,参考下边的方法即可。
TLT 训练:https://ngc.nvidia.com/catalog/models/nvidia:tlt_lprnet