亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」

本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

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

发布时间:2022-11-01
分享到:

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

发布时间:2022-11-01
分享到:

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

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

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

  • 车辆检测:ssd_traffic
  • 车牌检测:platedetect
  • 车牌识别:platenum

让我们开始吧!

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

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

下载预建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卡。

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

https://github.com/AlbertaBeef/vitis_ai_cpp_examples

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

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

第 3 步 - platedetect示例的概述
为了实现车牌识别示例,我们修改了一个现有的示例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);
}

这段代码的可视化表示如下图所示:

我们可以看到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

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

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

第 4 步 -创建车牌识别应用程序
我们可以使用这个通用的main_for_video_demo(),使用一个定义我们修改过的用例的自定义类,如下图所示:

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

  • 车辆检测:ssd_traffic
  • 车牌检测:platedetect
  • 车牌识别:platenum

下图说明了此示例的修改后的代码:

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

~/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

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”

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

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

你将如何解决这个问题?

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

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

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

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

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论