前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在NVIDIA Jetson开发套件上快速构建一个实时中文车牌检测和识别应用

在NVIDIA Jetson开发套件上快速构建一个实时中文车牌检测和识别应用

作者头像
GPUS Lady
发布2021-07-12 17:09:58
1.9K0
发布2021-07-12 17:09:58
举报
文章被收录于专栏:GPUS开发者GPUS开发者

这是NVIDIA在2021年初公布的一个开源项目,用NVIDA Jetson设备上的DeepStream视频分析套件实现“车牌识别”的功能,这是个实用性非常高的应用,能应用在各类小区门禁管理、停车场管理、道路违章等使用场景。

这个项目还有一个非常重要的特色,就是支持中国(文)机动车牌的识别,本文就专门针对中文车牌识别的部分,带着大家走过一遍,项目内容中有些需要改进的部分,在本文中也都一一说明,现在先简单了解一下这个项目的执行原理。

Highlight

本系列总共包括三部分:

1. 在Jetson上用DeepStream识别中文车牌

2.用NVIDIA TLT训练LPD(License Plate Detection)模型,负责获取车牌位置

3用NVIDIA TLT训练LPR(License Plate Recognition)模型,负责识别车牌内文字

本篇内容是让大家能快速体验一下,如何利用NVIDIA NGC上已经训练好的LPD与LPR两个深度学习模型,立即在Jetson上的DeepStream实现“中文车牌识别”的功能,不过这个模型目前还不能识别电动车的绿色车牌,因此还有很大的改善空间。

要点讲解

对DeepStream有初步了解的人应该都知道,这套工具支持“分级模型(grade model)”组合检测与分类的功能,这个特性就能将车牌识别的应用拆解成三大部分,

1. 一级PGIE:这是DeepStream的主模型,以“Car”为检测(detection)目标

2. 二级SGIE:这里以“车牌位置检测(LPD)”的模型,在PGIE所找到的“Car”范围内,定位出“车牌”的标框位置。

3. 三级SGIE:从二级SGIE得到的车牌图形中,执行“车牌内容识别(LPR)”任务,并将识别的文字回传。

要知道这样三级模型叠加处理,是一件困难度极高的任务,但却是DeepStream非常基本的功能,后面执行过程你就能发现竟然如此简单就能执行。

1. 安装与验证DeepStream开发套件5.0.1版本:

用TF卡作为存储的Jetson Nano(含2GB)与Xavier NX的刷机镜像,都已经与安装好DeepStream,只要使用的Jetpack版本 >= 4.4就行,如果不放心的话,也可以在指令视窗执行以下指令进行确认:

$ dpkg -ldeepstream-5.0

出现以下信息能验证是5.0.1版本的DeepStream。

要确认DeepStream是否安装完成,可以用编译好的deepstream-test1-app这个执行工具进测试,但是必须在

/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test1

这个路径下执行。

这个指令需要输入一个H264格式的视频文件,我们直接使用系统预安装的VisionWorks下面的的视频文件就行,例如/usr/share/visionworks/sources/data/pedestrians.h264文件。

请执行以下指令进行测试:

$ cd /opt/nvidia/deepstream/deepstream/sources 
$ cd apps/sample_apps/deepstream-test1
$ ln -s /usr/share/visionworks/sources/data/pedestrians.h264 test.h264
$ deepstream-test1-app test.h264

能正常执行就表示DeepStream 5.0.1安装完整。

2. 下载 tlt-converter工具:

因为后面要下载的模型,使用NVIDIA TLT迁移学习工具所训练的etlt中间文件,我们必须在Jetson上用tlt-converter将.etlt模型转成TensorRT加速引起,这样才能被DeepStream调用。

由于我们使用的设备,是安装Jetpack 4.5版本的Jetson系列,包括AGX Xavier、Xavier NX、Jetson Nano与Jetson Nano 2GB等四种,因此选择支持Jetpack的版本就可以,下载链接在https://developer.nvidia.com/cuda102-trt71-jp45,下载后解压缩就能看到tlt-converter这个工具。

3.下载项目与模型:

  • 克隆开源项目的代码,请执行以下指令:
$ git clone https://github.com/NVIDIA-AI-IOT/deepstream_lpr_app.git
  • 下载所需要的模型,在项目内已经建立好download.ch.sh脚本
$ cd deepstream_lpr_app
$ ./download_ch.sh

这个步骤会从NGC下载三个与训练好的中文车牌识别相关的模型文件,以及其配套的相关文件,主要内容如下:

1) CAR模型:resnet18_trafficcamnet_pruned.etlt

2) LPD模型:ccpd_pruned.etlt

3) LPR模型:ch_lprnet_baseline18_deployable.etlt

脚本为这些模型、配套文件都设置好对应路径,因此简单执行就可以。

  • 转换模型:

这个步骤就要使用到前面下载的tlt-converter转换工具,先将这个工具复制到deepstream_lpr_app目录下,然后执行以下指令:

$ ./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

记住!在不同设备上必须个别执行一次转换,因为在AGX Xavier上转换好的TensorRT引擎,是不能用在Jetson Nao上面的。

执行过程不花太多时间,如果执行正常会出现以下信息:

  • 编译与执行:

将工作位置移到~/deepstream_lpr_app并执行make就可以,完整指令如下:

$ cd ~/deepstream_lpr_app && make 

到下一层deepstream_lpr_app目录用中文字典文件 dict_ch.txt置换dict.txt

$ cd deepstream_lpr_app && cp dict_ch.txt dict.txt 

执行车牌识别指令 ./deepstream-lpr-app,后面跟随的参数如下:

  • 第1个参数指定功能:1 -> 美国车牌识别、2 -> 中国车牌识别
  • 第2个参数指定输出:1 -> 输出到h264视频文件、2 -> fakesink、3 ->显示到屏幕上
  • 第3个参数指定输入.mp4视频文件,可以一次给多个
  • 第4个参数指定输出.h264视频文件

我们用手机在停车场简单录制两段30秒的短视频作为测试,您也可以比照办理。完整执行指令如下:

$./deepstream-lpr-app 2 1 0 test.mp4 out.h264

4. Debug

执行结果:无法识别,发现这里面存在bug

(1) 重新使用美国版的指令进行测试,显示能正常执行,表示代码内容应该是正确的

(2) 于是得从中文版的设定文件lpd_ccpd_config.txt、lpr_config_sgie_ch.txt里面寻找答案。

(3) 经过一番比对与测试之后,发现需要将lpd_ccpd_config.txt里第52行的“model-color-format”设定值改为“0”,然后就能执行中文车牌识别任务。

5. 显示优化

(1) 由于原始的显示部分字体非常小,因此将deepstream_lpr_app.c源代码内第182行~192行内的字体颜色与大小做些修改,您可以根据自己的喜好去调整。修改完后记得要执行“make”编译工作,才会生效。

(2) 在~/deepstream-lpr-app/model/LP/LPD的ccpd_label.txt文件中,使用简单“lpd”作为显示,可以置换成“车牌”这样显示就更容易看得清楚。

(3) 可以同时输入多个视频文件进行测试,请自行提供多个检测文件,指令如下:

$ ./deepstream-lpr-app 2 1 0 test.mp4 test1.mp4 test2.mp4 test3.mp4 
test4.mp4 test.mp4 out.h264

执行效果如下:

6. 性能优化过程:

(1) 执行过程打开jtop监控计算单元的实时性能,可以看到“NVENC”与“NVDEC”都是打开了,因为DeepStream涉及视频读入时就会调用NVDEC解码器、写入视频时就会调用NVENC编码器,因此在这方面的性能提升空间并不大。

(2) 事实上在执行过程,我们发现这个应用启动了“追踪(tracker)”功能,这很消耗计算资源,本来尝试很多方法想将这个追踪功能关闭,但是尝试失败。

(3) 我们发现在lpr_sample_tracker_config.txt文件中,在倒数第三行“ll-lib-file=”设定为NvDCF追踪器,这是追踪效果最好但性能较差的追踪器,因此我们尝试将追踪器的设定值改为“libnvds_mot_iou.so”之后,发现性能立即就提升大约30%以上。

7. 性能比较:

结束语

经过整理之后其实整个流程非常简单,虽然中文版的部分有个Bug,还好我们也都找到问题点并且解决,这样就能让这个项目很顺利地往下发展。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GPUS开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
汽车相关识别
汽车相关识别(Vehicle Optical Character Recognition,Vehicle OCR)基于行业前沿的深度学习技术,提供驾驶证识别、行驶证识别、车牌识别、车辆 VIN 码识别等多种服务,支持将图片上的文字内容,智能识别为结构化的文本,应用于车主身份认证、ETC 出行、违章识别、停车管理等多种场景,大幅提升信息处理效率。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档