×

边缘AI套件上的立体视觉深度感知

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

李鸿洋

分享资料个

描述

介绍

Edge AI Kit 使用双摄像头来实现深度感知或距离识别应用。

poYBAGSBLcqARlzoAA0tNgYanM8325.jpg
 

立体视觉应用程序检测两个摄像头图像中的人脸,然后计算每个摄像头图像中的 ROI(感兴趣区域)之间的差异。此差异用于计算对象与相机的距离。

设置

根据此处的说明设置 Edge AI 套件

您还可以在Edge AI Kit Linux 用户手册中找到更多详细信息

要使用 StereoVision 应用程序,您需要使用外部显示器(随附的 LVDS 触摸屏或 HDMI 显示器)。将键盘和鼠标连接到 Edge AI 套件。

图像

该应用程序已经为您构建并包含在开箱即用的图像中。如果您更愿意构建自己的版本,请查看项目为 Edge AI 套件构建支持 ML 的 Yocto 图像(即将推出)。

从“参考设计”选项卡下的Avnet Boards页面下载带有应用程序的图像。解压缩它(您应该以 a.wic 图像结尾)。

使用 Balena Etcher 或类似软件将映像刷入 SD 卡。

相机校准

我们需要校准我们的相机以确保它们捕获的图像正确对齐。这个过程涉及从不同角度拍摄棋盘图案,然后使用这些图像计算相机参数。

棋盘在这里: https: //github.com/Avnet/stereovision-app/blob/main/documentation/Checkerboard-A4-25mm-8x6.pdf

图像必须以 A4 格式打印。将它贴在坚硬的背衬上,例如卡片纸。如果背衬比棋盘略大,那么在您左右移动它时有空间可以抓住它是最简单的。棋盘大小对于距离测量至关重要。如果您的电路板尺寸不一样,您必须调整文件“calibration.cpp”中的相应变量并重建 Qt 应用程序。

有关相机校准的更多详细信息,请参见使用 OpenCV 进行相机校准使用 OpenCV 进行相机校准

运行应用程序

设置并启动 Edge AI Kit 后,它应该会打开 Wayland Desktop。

在 Wayland 桌面上打开一个终端。输入命令:

stereovision

这将打开 stereovision Qt 应用程序。

1. 选择“开始”开始摄像头串流。

如果出现错误,请运行命令“systemctl stop ap1302-stream 以确保摄像头已停止,或执行第3.3.5 节中的故障排除步骤。

2. 选择“拍照”拍摄校准照片。放置棋盘,使其在两个相机的框架内建议至少拍摄 8 张校准照片,棋盘位于任一相机框架的角落(但在两个相机中始终完全在框架中)。

相机的内部和外部参数将保存在位于项目根目录的“camera_data”文件夹中的“left.yml”、“right.yml”和“stereo.yml”文件中。注意:如果您编辑校准图像的路径或名称,您需要调整文件“calibration.cpp”中的相应变量。

3. 选择“校准”以校准应用程序。

 
 
 
poYBAGSBLdCAMf-AAAEF656YlEE552.png
 
1 / 2
 

4. 选择“人脸检测”开始检测人脸。这也将选择校正(例如,相机已根据棋盘进行校准)。您也可以在没有人脸检测的情况下运行校正来测试校准。

 
 
 
poYBAGSBLdWALKxCAAEajkb7o04692.png
 
1 / 2以米为单位的人脸检测
 

申请详情

人脸检测模型是MediaPipeTensorFlow Lite模型,使用NNAPI 委托在 NPU 上加速

视差计算是使用 OpenCV 完成的。遗憾的是,Avnet i.MX 8M Plus Edge AI 套件上集成的神经处理单元 (NPU) 提供的加速不支持 openCV 。

测量距离的过程包括两个步骤:

1.人体检测。

2. ROI(人体区域)的视差计算

该应用程序使用人工神经网络检测人脸,并使用 SURF 方法在立体图像中选择对应的人脸特征点。距离是根据特征点的差异计算的。

人体检测

运行网络所需的 tflite 模型文件位于应用程序代码的“dnnData”文件夹中。您可以从 MediaPipe 查看最新的人脸检测模型

此应用程序支持两种模式:“近距离”和“全范围”,前者适用于距离相机 2 米以内的人脸,后者适用于距离相机 5 米以内的人脸。如果使用其他模型,请根据相应的描述文件如face_detection_full_range_common.pbtxtModel card适配代码中FaceOptions的参数。

了解神经网络的边界框输出一文解释了如何使用模型和设置人脸检测参数。

视差计算

视差是指立体对的左右图像中两个对应点之间的距离。校正图像(相机标定)中某个点的视差可用于计算该点在现实世界中的坐标。

pYYBAGSBLdeAWZeFAAA-SK90F50026.jpg
 

校准后,一对特征点的两个特征点在理论上具有相同的图像 v 坐标。在这种情况下,视差是指左右图像中两个对应点之间的 u 坐标差异。一旦计算出差异,就可以计算现实世界中的 Z 坐标,因为其他参数可以在文件“camera_data/stereo.yml”中获得。

左图中检测到的每张人脸都将与右图中的人脸进行匹配。如果两个面块的宽度、高度和 v 坐标相同,则它们将被视为匹配。一旦面部匹配,将计算它们的视差以计算距离。

调整参数

可以调整以下参数以调整模型在不同条件下的准确性:

  • ConfidenceThresh [0.01, 1.0] :该变量定义人脸检测的最小置信度。只有检测到的置信度高于阈值的人脸才会被处理。
  • FaceOverlapThresh [0.01, 1.0] : 为了提高精度,检测到的重叠面将被视为一个面。该变量定义最大重叠。重叠超过阈值的两个对象将被视为一个对象。
  • Disparity_Y Thresh [0, 100] :变量定义v方向视差差的阈值,用于人脸匹配。
  • Width_Rel_Thresh [0.01, 1.0] :变量定义人脸块宽度相对偏差的阈值。0.1 表示如果高度差超过 10%,则左右框架中的人脸块将不会相互匹配。
  • Height_Rel_Thresh [0, 10] :变量定义人脸块高度相对偏差的阈值。0.1 表示如果高度差超过 10%,则左右框架中的人脸块将不会相互匹配。
  • SkipFrame [0, 20] : 为了加速计算,不是所有的帧都会被处理。如果变量设置为 4,则每 4 帧只处理一帧。

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

评论(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:'边缘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);