×

使用Vitis-AI进行车牌识别

消耗积分:2 | 格式: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条评论

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

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用Vitis-AI进行车牌识别',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);