×

使用Vitis-AI进行车牌识别

消耗积分:0 | 格式:zip | 大小:0.00 MB | 2023-06-27

分享资料个

描述

介绍

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

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

  • 车辆检测:ssd_traffic
  • 车牌检测:platedetect
  • 牌照号码识别:platenum
pYYBAGNy7SGAIzeBAAAeV4SGzIg907.png
车牌识别 - 3 推理管道
 

让我们开始吧 !

第 1 步 - 创建 SD 卡

为以下 Avnet 平台提供了预构建的 Vitis-AI 1.3 SD 卡映像:

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

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

下载并解压后,.img 文件可以编程到 16GB 微型 SD 卡。

0.解压压缩包得到.img文件

1. 将开发板特定的 SD 卡映像编程到 16GB(或更大)的 micro SD 卡

一个。在 Windows 机器上,使用 Balena Etcher 或 Win32DiskImager(免费开源软件)

湾。在 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 步 - 克隆源代码存储库

本项目中使用的源代码可以从以下存储库中获取:

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

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

第 3 步 - 板检测示例概述

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

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

poYBAGNy7SOAHu21AABcidEoJlY169.png
 

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

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

1. 启动后,启动 dpu_sw_optimize.sh 脚本,该脚本将优化 DDR 内存的 QoS 配置

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

2. 禁用 dmesg 详细输出:

$ 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(),以及一个定义我们修改后的用例的自定义类,如下图所示:

poYBAGNy7SeADAaKAAB84LjShe0960.png
 

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

  • 车辆检测:ssd_traffic
  • 车牌检测:platedetect
  • 牌照号码识别:platenum
pYYBAGNy7SGAIzeBAAAeV4SGzIg907.png
车牌识别 - 3 推理管道
 

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

pYYBAGNy7SyAat5IAACx8WeU0hw102.png
 

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

~/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
pYYBAGNy7S6AReaeAAAtW1wh7r4890.png
./test_jpeg_platerecognition sample_platedetect.jpg
 

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

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”(注意“jing”是京的汉语拼音)
  • 编号:“2P6J2”
poYBAGNy7TCANd_RAAAZ7y1l4vk071.png
京Q - 2P6J2
 

$ 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
./test_video_platerecognition./video/plate_recognition_video.mp4
 

已知限制

本项目中实施的车牌识别适用于亚洲车牌。为了支持其他地区的车牌,还需要做额外的工作。

你会如何解决这个问题?

  • 你会用当地车牌的图像重新训练模型吗?
  • 你会使用不同的技术吗?

结论

我希望本教程能帮助您在 Avnet 平台上快速开始使用 Vitis-AI 1.3。

如果您还想看到任何其他相关内容,请在下面的评论中分享您的想法。

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !