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

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,如涉及侵权,可联系删除。

    本文转载自:电路城

    最新文章