跳转到主要内容

基于Vitis-AI的车牌识别系统

Vitis-AI提供了大量的预构建模型。这个项目描述了如何利用这些模型来实现车牌识别。

Xilinx模型包含许多预先构建的卷积神经网络模型。

本项目利用了其中的几个模型,以便实现一个用于车牌识别的多推理应用程序。

<li>车辆检测:ssd_traffic</li>
<li>车牌检测:platedetect</li>
<li>车牌识别:platenum</li>
<center><img src="https://cdn.eetrend.com/files/2022-11/wen_zhang_/100565551-278049-1.png…; alt=""></center>

让我们开始吧!

<strong>第 1 步 - 创建SD卡</strong>
为以下Avnet平台提供了预建的Vitis-AI 1.3 SD卡镜像:

<li>u96v2_sbc_base: Ultra96-V2开发板</li>
<li>uz7ev_evcc_base: ultraze - ev SOM (7EV) + FMC载波卡</li>
<li>uz3eg_iocc_base: ultraze - eg SOM (3EG) + IO载波卡</li>

下载预建SD卡图像的链接可在此找到:

Vitis- ai 1.3 Avnet Vitis平台流程:https://avnet.me/vitis-ai-1.3-project

下载和提取之后。img文件可以编程到16GB的micro SD卡上。

1. 解压缩存档以获得.img文件
2. 将单板特定的SD卡图像编程到16GB(或更大)的micro SD卡中
3.在Windows机器上,使用Balena Etcher或Win32DiskImager(免费开源软件)
4.在linux机器上,使用“Balena Etcher”或“dd”工具

$ sudo dd bs=4M if=Avnet-{platform}-Vitis-AI-1-3-{date}.img of=/dev/sd{X} status=progress conv=fsync

其中{X}是一个较小的大小写字母,用于指定SD卡的设备。您可以使用“df -h”来确定哪个设备对应您的SD卡。

<strong>第 2 步 - 克隆源代码存储库</strong>
本项目中使用的源代码可以从以下存储库中获得:

https://github.com/AlbertaBeef/vitis_ai_cpp_examples

如果你有一个活跃的互联网连接,你可以简单地克隆储存库到你的嵌入式平台的根目录:

$ cd ~
$ git clone https://github.com/AlbertaBeef/vitis_ai_cpp_examples

<strong>第 3 步 - platedetect示例的概述</strong>
为了实现车牌识别示例,我们修改了一个现有的示例platedetect,该示例可以在以下目录中找到:

~/Vitis-AI/demo/Vitis-AI-Library/samples/platedetect

如果我们查看test_jpeg_platedetect.cpp源代码,我们可以看到它非常小:

int main(int argc, char *argv[]) {
string model = argv[1];
return vitis::ai::main_for_jpeg_demo(
argc, argv,
[model] {
return vitis::ai::PlateDetect::create(model);
},
process_result, 2);
}

这段代码的可视化表示如下图所示:
<center><img src="https://cdn.eetrend.com/files/2022-11/wen_zhang_/100565551-278050-2.png…; alt=""></center>

我们可以看到main函数使用了通用的main_for_jpeg_demo()函数,并将提供create()和run()方法的PlateDetect类的实例以及process_result()函数传递给它。

该示例可以使用以下命令运行:

1. 在引导之后,启动dpu_sw_optimization .sh脚本,该脚本将优化DDR内存的QoS配置

$ cd ~/dpu_sw_optimize/zynqmp
$ source ./zynqmp_dpu_optimize.sh

2. 关闭dmesg verbose输出:

$ dmesg -D

3.使用以下参数启动platedetect应用程序:

为第一个参数指定“sample_platedetect.jpg”

$ cd ~/Vitis-AI/demo/Vitis-AI-Library/samples/platedetect
$ ./test_jpeg_platedetect sample_platedetect.jpg

应用程序将在以下文件中生成输出:

sample_platedetect_result.jpg

在这一点上有两点值得注意:

<li>车牌检测模型假设它处理的图像中有一个车牌(在此模型之前需要一个额外的车辆检测步骤)</li>
<li>platedetect模型只提供车牌的位置,而不提供车牌号码(在该模型之后需要一个附加号码识别步骤)</li>

<strong>第 4 步 -创建车牌识别应用程序</strong>
我们可以使用这个通用的main_for_video_demo(),使用一个定义我们修改过的用例的自定义类,如下图所示:
<center><img src="https://cdn.eetrend.com/files/2022-11/wen_zhang_/100565551-278051-3.png…; alt=""></center>

对于车牌识别示例,使用三个模型来实现3推理管道:

<li>车辆检测:ssd_traffic</li>
<li>车牌检测:platedetect</li>
<li>车牌识别:platenum</li>
<center><img src="https://cdn.eetrend.com/files/2022-11/wen_zhang_/100565551-278052-4.png…; alt=""></center>

下图说明了此示例的修改后的代码:
<center><img src="https://cdn.eetrend.com/files/2022-11/wen_zhang_/100565551-278053-5.png…; alt=""></center>

源代码可以在以下位置找到:

~/vitis_ai_cpp_examples/platerecognition/test_jpeg_platerecognition.cpp
~/vitis_ai_cpp_examples/platerecognition/test_video_platerecognition.cpp

1. 构建车牌识别应用程序

$ cd ~/vitis_ai_cpp_examples/platerecognition
$ ./build.sh

2. 在图像上启动车牌识别应用程序

$ cp ~/Vitis-AI/demo/Vitis-AI-Library/samples/platedetect/sample_platedetect.jpg .
$ export PLATERECOGNITION_DEBUG=TRUE
$ ./test_jpeg_platerecognition sample_platedetect.jpg
<center><img src="https://cdn.eetrend.com/files/2022-11/wen_zhang_/100565551-278054-6.png…; alt=""></center>

PLATERECOGNITION_DEBUG环境变量,当设置为TRUE时,将显示由3推理管道生成的信息:

Frame 1
SSD : label=1 x,y,w,h=2,1,272,304 confidence=0.906937
PlateDetect : x,y,w,h=103,257,63,21 confidence=0.99977
PlateNum : size=288,96 color=Blue number=[jingQ2P6J2]

注意,PlateNum模型输出编号有两部分:

区域:“京Q”
数量:“2 p6j2”
<center><img src="https://cdn.eetrend.com/files/2022-11/wen_zhang_/100565551-278055-7.png…; alt=""></center>

3.在视频上启动车牌识别应用

$ cd ~/vitis_ai_cpp_examples/platerecognition
$ export DISPLAY=:0.0
$ xrandr--output DP-1 --mode 800x600
$ unset PLATERECOGNITION_DEBUG
$ ./test_video_platerecognition./video/plate_recognition_video.mp4
<center><img src="https://cdn.eetrend.com/files/2022-11/wen_zhang_/100565551-278056-8.png…; alt=""></center>

<strong>遗留的问题</strong>
本项目实现的车牌识别适用于亚洲车牌。为了支持来自其他地区的车牌,还需要进行额外的工作。

你将如何解决这个问题?

<li>你能用当地车牌图像重新训练这些模型吗?</li>
<li>你会用不同的技巧吗?</li>

<strong>结论</strong>
到这就结束了,我希望本文将帮助您快速开始使用Avnet平台上的Vitis-AI 1.3。

如果您对此项目有任何想法、意见或问题,请在下方留言。

以上内容翻译自网络,原作者:Mario Bergeron,如涉及侵权,可联系删除。

本文转载自:<span id="profileBt"><a href="https://www.cirmall.com/articles/37087/">电路城</a></span&gt;