×

使用Edge Impulse和Nvidia Jetson的面罩检测器

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

岳臻俊

分享资料个

我们可以看到图像中每个感兴趣的边界框,并为它们分配一个类标签。物体检测最常见的应用是人脸识别、口罩检测等。因此,我们将构建一个口罩检测器来检测人是否戴口罩。在 COVID 情况下,为了解决当前场景的问题,使用技术将自动执行检测任务,并避免手动检查违规者。

在今天的教程中,我们将学习如何使用强大的云平台Edge Impulse构建我们自己的口罩检测模型,通过该平台我们在 NVIDIA Jetson 板上部署经过训练的模型,并将其与 CSI 摄像头传感器连接以捕获实时图像。本教程可以应用来自您自己的图像数据集的数据集或来自Kaggle的标记公共数据集。图像数据集有两个类,分别是with_maskwithout_mask

在本教程结束时,您将能够:

使用Edge Impulse平台收集用于实时检测的良好数据集

数据标注

使用Edge Impulse训练口罩检测模型

在 NVIDIA Jetson 板上部署对象检测

要求

我们的项目将需要以下内容:

所需硬件:

NVIDIA Jetson 板(这里我们将使用Xavier NX 开发工具包

笔记本电脑或独立 PC

对于实时摄像头演示,需要 Raspberry Pi 摄像头模块等摄像头。在这里,我们将使用Arducam Complete High Quality Camera Bundle

所需软件:

边缘脉冲帐户。

一些TinyML和深度学习的经验是有帮助的,但不是必需的。

要无头运行 NVIDIA Jetson Nano 板(不带显示器),请从您的笔记本电脑设置 SSH 访问或 RDP 连接。

熟悉Linux命令行,bash之类的shell,nano之类的编辑器。

NVIDIA Jetson Xavier NX 开发者套件

在这里,我将使用 Nvidia Xavier NX 板。与 Jetson Nano 相比,Xavier NX 的速度要快两到七倍,具体取决于应用。

poYBAGNYtz-AN2nHAA5oN4VLs5I553.jpg

在 NVIDIA Jetson 主板上安装 Edge Impulse

Edge Impulse是一个基于云的平台。使用 Edge Impulse 平台,用户无需深入了解编程或 AI、ML 概念即可训练他们的 AI、ML 模型。

要使用Edge Impulse训练机器学习模型,请创建一个Edge Impulse帐户,验证您的帐户,然后开始一个新项目。

在开始任何事情之前,最好更新所有内容。您可以通过输入以下命令来做到这一点。

 

sudo apt-get update
sudo apt-get upgrade

 

同样在我们开始之前,将您的相机模块连接到您的 Nvidia Jetson 板上的 CSI 端口。然后,要在 Nvidia Jetson 板上使用 Edge Impulse,您首先必须安装 Edge Impulse 及其依赖项。

从终端运行:

 

wget -q -O - https://cdn.edgeimpulse.com/firmware/linux/jetson.sh | bash

 

您应该得到如下所示的响应。

 

+ edge-impulse-linux@1.3.3
added 347 packages from 416 contributors in 68.138

 

现在,使用以下命令运行 Edge Impulse:

 

edge-impulse-linux

 

您将被要求登录您的 Edge Impulse 帐户。然后系统会要求您选择一个项目,最后选择一个麦克风和摄像头以连接到该项目。

 

Edge Impulse Linux client v1.3.3
? What is your user name or e-mail address (edgeimpulse.com)? 
com
? What is your password? [hidden]

? Select a microphone (or run this command with --disable-microphone to skip sel
ection) jetson-xaviernx - jetson-xaviernx-ape
[SER] Using microphone hw:1,0
[SER] Using camera CSI camera starting...
[SER] Connected to camera
[WS ] Connecting to wss://remote-mgmt.edgeimpulse.com
[WS ] Connected to wss://remote-mgmt.edgeimpulse.com
? What name do you want to give this device? Jetson
[WS ] Device "Jetson" is now connected to project "shakhizat-project-1"
[WS ] Go to https://studio.edgeimpulse.com/studio/45666/acquisition/training to build your machine learning model!

 

现在,您已在 Nvidia Jetson 板上成功安装 Edge Impulse。

如果一切正常,您应该在 Edge Impulse 的设备部分看到以下内容:

pYYBAGNYt0KAfqyvAAHGOzWhdcA737.png

数据收集

对于这个口罩检测项目,我们应该收集模仿真实情况的图像数据集。我们应该为每个班级收集足够的图像。您可以使用手机、Nvidia Jetson 板来收集样本,也可以将图像上传到边缘脉冲帐户。

要加载样本,请单击Edge Impulse 的数据采集部分。

poYBAGNYt0aAdch0AAI65nHNAXA520.png

然后,单击让我们收集一些数据按钮。

由于我们要训练和测试图像数据集,我们应该将其拆分为 80-20。

pYYBAGNYt0qAfBuvAANBo3Vv3sI612.png

对于面罩检测,我们需要我们的边界框来分类我们的类。因此,我们需要使用 Edge Impulse 标注工具对图像进行标注。

poYBAGNYt0-AcSWDAAOghwoXIEg745.png

1 / 2

如果您有很多图像和类,则此过程需要时间。

理想情况下,建议从Kaggle获取面罩数据集。这个用于机器学习的数据集以及它们的 PASCAL VOC 格式的边界框已经过注释。Pascal VOC 是一个 XML 文件,不像 COCO 有一个 JSON 文件,后者已成为对象检测标签的常见交换格式。但是,Edge Impulse使用 JSON 格式的另一种格式。您可以使用此python 脚本将注释从 Pascal VOC 转换为Edge Impulse格式。

完整的项目可以从这里找到,Peter Ing实施。一探究竟。

训练模型

现在我们已经收集了口罩样本,我们可以将它们传递给神经网络并开始训练过程以自动检测一个人是否戴口罩。所以打开 Edge Impulse 的Impulse设计部分。

当我们的数据集准备好后,现在我们将为我们的数据创建一个脉冲。为此,请转到创建冲动部分。

poYBAGNYt1KAApT9AAJG3loN34o847.png

单击添加处理块。

poYBAGNYt1WAQ_g6AAM7Rb4kIgk687.png

选择图像选项。

pYYBAGNYt1qAFSsXAAKd_r02tac217.png

然后,单击一个学习块并添加对象检测选项。

pYYBAGNYt16AK7zzAAK5l2OzTXk742.png

将其重命名为面罩检测,然后单击保存脉冲按钮。

poYBAGNYt2KAYzpmAAMi-0WmAK4022.png

接下来,转到Impulse design菜单项下的Images部分,然后单击Generate Features选项卡,然后单击Generate features按钮。

之后,点击Impulse design 菜单项下的Face mask detection部分,然后点击页面底部的Start training按钮。在这里,我们使用了默认的MobileNetV2 。如果需要,您可以使用不同的训练模型。

pYYBAGNYt2iAA9s_AALcp9WBv6k166.png

训练输出:

 

Creating job... OK (ID: 2325943)
Scheduling job in cluster...
Job started
Splitting data into training and validation sets...
Splitting data into training and validation sets OK
Training model...
Training on 129 inputs, validating on 33 inputs
Building model and restoring weights for fine-tuning...
Finished restoring weights
Fine tuning...
Attached to job 2325943...
Epoch 1 of 50, loss=1.0996249, val_loss=1.2549742
Epoch 2 of 50, loss=0.5730881, val_loss=1.0309869
Epoch 3 of 50, loss=0.37260413, val_loss=0.88406265
Epoch 4 of 50, loss=0.2732575, val_loss=0.8300728
Epoch 5 of 50, loss=0.21881193, val_loss=0.7985368
Epoch 6 of 50, loss=0.1842412, val_loss=0.77767074
Epoch 7 of 50, loss=0.15971155, val_loss=0.75798315
Epoch 8 of 50, loss=0.141622, val_loss=0.74178046
Epoch 9 of 50, loss=0.12764679, val_loss=0.7201556
Epoch 10 of 50, loss=0.124089435, val_loss=0.7229701
Epoch 11 of 50, loss=0.13733643, val_loss=0.6930027
Epoch 12 of 50, loss=0.10552671, val_loss=0.68260795
Epoch 13 of 50, loss=0.09776387, val_loss=0.6571001
Epoch 14 of 50, loss=0.09269215, val_loss=0.65096503
Epoch 15 of 50, loss=0.08853194, val_loss=0.6398335
Epoch 16 of 50, loss=0.08513473, val_loss=0.6339971
Epoch 17 of 50, loss=0.08155578, val_loss=0.6237093
Epoch 18 of 50, loss=0.07958686, val_loss=0.62563324
Epoch 19 of 50, loss=0.08469187, val_loss=0.60824037
Epoch 20 of 50, loss=0.106107965, val_loss=0.65657234
Epoch 21 of 50, loss=0.08075548, val_loss=0.60204226
Epoch 22 of 50, loss=0.06780515, val_loss=0.61008215
Epoch 23 of 50, loss=0.07962225, val_loss=0.6042041
Epoch 24 of 50, loss=0.07898002, val_loss=0.62557745
Epoch 25 of 50, loss=0.07712146, val_loss=0.6038083
Epoch 26 of 50, loss=0.059002914, val_loss=0.604347
Epoch 27 of 50, loss=0.060714073, val_loss=0.598505
Epoch 28 of 50, loss=0.056586243, val_loss=0.6049032
Epoch 29 of 50, loss=0.06364094, val_loss=0.5943693
Epoch 30 of 50, loss=0.0693655, val_loss=0.6258873
Epoch 31 of 50, loss=0.06930919, val_loss=0.5844879
Epoch 32 of 50, loss=0.055322483, val_loss=0.60721684
Epoch 33 of 50, loss=0.053181175, val_loss=0.5940475
Epoch 34 of 50, loss=0.071890086, val_loss=0.6106543
Epoch 35 of 50, loss=0.09753211, val_loss=0.63664484
Epoch 36 of 50, loss=0.063474864, val_loss=0.5776911
Epoch 37 of 50, loss=0.056974597, val_loss=0.5894003
Epoch 38 of 50, loss=0.05551439, val_loss=0.5942682
Epoch 39 of 50, loss=0.07409478, val_loss=0.5911636
Epoch 40 of 50, loss=0.0580862, val_loss=0.61330724
Epoch 41 of 50, loss=0.057891976, val_loss=0.58406746
Epoch 42 of 50, loss=0.052040614, val_loss=0.61015534
Epoch 43 of 50, loss=0.051715873, val_loss=0.5831931
Epoch 44 of 50, loss=0.052400388, val_loss=0.6184015
Epoch 45 of 50, loss=0.057132762, val_loss=0.5842898
Epoch 46 of 50, loss=0.061072033, val_loss=0.6269493
Epoch 47 of 50, loss=0.0581602, val_loss=0.6031094
Epoch 48 of 50, loss=0.051550377, val_loss=0.6048402
Epoch 49 of 50, loss=0.05313967, val_loss=0.6296155
Epoch 50 of 50, loss=0.050658334, val_loss=0.6037806
Finished fine tuning
Checkpoint saved
Finished training
Creating SavedModel for conversion...
Attached to job 2325943...
Converting TensorFlow Lite float32 model...
Converting TensorFlow Lite int8 quantized model with int8 input and float32 output...
Calculating performance metrics...
Calculating inferencing time...
Attached to job 2325943...
Job completed

 

训练过程完成后,我们可以将训练好的Edge 脉冲图像分类模型部署到 NVIDIA Jetson 板上。

下面的结果可视化:

在本教程中,您学习了如何使用Edge Impulse构建图像数据集,如何构建用于检测这些图像中的面罩的机器学习模型,以及如何将该模型部署到 NVIDIA Jetson 板等边缘设备并在其中进行测试一个真实的时间。简而言之,Edge Impulse是非编码人员开发机器学习模型的绝佳平台。强烈推荐。

参考

边缘脉冲对象检测初学者指南

在 Raspberry Pi 上使用 Edge Impulse TinyML 进行对象分类

 

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

评论(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:'使用Edge Impulse和Nvidia Jetson的面罩检测器',//标题 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);