×

在MaaXBoard Mini上使用Edge Impulse进行安全帽检测

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

张昂笙

分享资料个

描述

介绍

为什么选择 MaaXBoard Mini?

MaaXBoard Mini是基于 NXP 的i.MX 8M Mini 处理器的Avnet 开发板,该处理器具有四个 Cortex-A53 内核平台,每个内核的时钟频率为 1.8GHz。它具有一个 Pi hat 接口,以及四个 USB 端口、BLE 4.0、WIFI、一个 MIPI 摄像头接口和一个 MIPI 显示接口。

pYYBAGNiSRKAOenEAAEOBfAMcOE569.png
 

今年 2 月,我在几个机器学习模型上对 MaaXBoard Mini 和 8 台类似的单板计算机进行了基准测试。它在 Mobilenet SSD V.1 和 V.2 上的速度优于 Raspberry Pi 4 和 NVIDIA Jetson Nano (TF),并且在功耗方面优于除 Movidius NCS 和 MaaXBoard 之外的所有主板。

 
 
 
poYBAGNiSRSAd5brAACGBpZcXSo314.png
 
1 / 2
 

我认为它是用于机器学习的完美小型单板计算机,我想将它与Edge Impulse配对,Edge Impulse是在边缘训练机器学习的理想软件平台。

为什么要进行安全帽检测?

安全帽检测是用于建筑工地安全的有用的计算机视觉应用程序。是否有人在没有适当安全装备的情况下走进建筑工地?使用机器学习模型提醒您的施工主管注意不安全的情况。

poYBAGNiSReAcxRCAAAxNXAp-m4638.jpg
 

设置

您需要执行几个设置步骤才能让 Edge Impulse CLI 在您的 MaaXBoard 或 MaaXBoard Mini 上运行。

设置您的 MaaXBoard

您需要做的第一件事是阅读我的Headless Setup 指南,使用 Debian 操作系统设置 MaaXBoard Mini,创建一个非 root 用户,然后通过 SSH 连接。

在 Edge Impulse 上创建一个新项目

如果您还没有帐户,下一步是在Edge Impulse上创建一个帐户。

转到 Edge Impulse 中的Object Detection 项目,然后选择“clone this project”。

poYBAGNiSRmAMhhBAACel0q_al4126.png
 

在 MaaXBoard Mini 上安装 Edge Impulse Linux SDK

什么是 Edge Impulse Linux CLI 或 SDK?

Edge Impulse Linux CLI 或 SDK(文档交替使用这两个术语)是下载和运行为 linux 打包的 .eim 文件所必需的它还允许从 Web 界面连接到电路板并收集传感器数据。有四种不同的语言 SDK。在这种情况下,我们将使用node.js SDK

为 Node.js 安装 Edge Impulse CLI 和 Linux SDK

启动您的 MaaXBoard Mini 并以您在Headless Setup期间创建的非 root 用户身份登录

在您的 MaaXBoard 上安装node.js :

set -e
sudo apt install curl
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt install -y nodejs
node -v

上面的命令应该为您提供路径上的节点版本。在这种情况下,它应该是14.x

您将需要许多依赖项,包括libvips8 ,这是安装图像处理库sharp的要求安装 libvips8 需要 20 多分钟,所以喝杯茶什么的:

sudo apt install -y gcc g++ make build-essential pkg-config glib2.0-dev libexpat1-dev sox v4l-utils libjpeg62-turbo-dev
wget https://github.com/libvips/libvips/releases/download/v8.10.5/vips-8.10.5.tar.gz
tar xf vips-8.10.5.tar.gz
cd vips-8.10.5
./configure
make -j
sudo make install
sudo ldconfig

您现在可以删除压缩的安装文件夹node-v12.13.0-linux-arm64.tar.xzvips-8.10.5.tar.gz

最后,安装 edge-impulse CLI 和 Linux SDK:

sudo npm install edge-impulse-cli -g --unsafe-perm=true
sudo npm install edge-impulse-linux -g --unsafe-perm=true

如果您看到消息+ edge-impulse-linux@[VERSION]+ edge-impulse-cli@[VERSION] ,成功!Edge Impulse CLI 现在已安装在您的 MaaXBoard 上。

 
 
 
pYYBAGNiSRuATUA5AACjCi4KNXU737.png
 
1 / 3成功!
 

收集数据

在 Edge Impulse 中收集数据的主要方式有 3 种

  • 使用 Edge Impulse Linux SDK 连接开发板并通过 Web 界面收集数据
  • 收集板上的数据,并通过 GUI 上传器上传
  • 收集板上的数据,或使用现有数据集,然后使用主机 PC 上 Edge Impulse CLI 中的 Edge Impulse Uploader 上传数据。

删除示例项目中的现有数据

您之前在 Edge Impulse 中复制的项目已经有一些与之关联的数据。在开始收集数据之前,您需要将其从项目中删除。转到数据采集选项卡并选择复选标记以选择多个项目。全选并选择“删除所选内容”。在“测试数据”选项卡上执行相同的操作。

 
 
 
poYBAGNiSR6AabEqAADvJMJIunY288.png
 
1 / 3转到数据采集选项卡并选择复选标记以选择多个项目
 

将您的网络摄像头连接到 MaaXBoard Mini

我正在使用 USB 网络摄像头 - HD Pro Webcam C920 拍摄只有 320x320 像素的图像有点矫枉过正,但我​​喜欢这个,因为它有一个支架,所以我可以将它连接到三脚架上。

将您的 USB 网络摄像头连接到 MaaXBoard Mini 上的 USB 端口之一。接下来,确保您拥有网络摄像头权限。编辑/etc/rc.local文件,以在每次板子启动时授予您自己的摄像头权限:

sudo nano /etc/rc.local

exit 0rc.local中的" " 之前包含这一行

sudo chmod -R a+rwx /dev/video1

在 MaaXBoard 上,video0 是 MIPI-CSI 摄像头,video1+ 是 USB 摄像头。编辑rc.local后,运行:

sync
sudo reboot

重新登录后,您现在应该在运行时看到您拥有摄像头权限ls -l /dev/video*

pYYBAGNiSSCAT3aLAAAYqLSJUeY320.png
 

使用 Edge Impulse Linux SDKTY 收集新数据

在您的 MaaXBoard Mini 上运行 Edge Impulse Linux SDK:

edge-impulse-linux

出现提示时,登录您的 Edge Impulse 帐户并命名您的设备(我将我的设备命名为“mini”)。当您转到 Edge Impulse 上的项目页面时,您现在会看到 MaaXBoard Mini 已连接:

 
 
 
pYYBAGNiSSSAZ393AABr8jXC3DM856.png
 
1 / 3为您的设备命名
 

如果您想连接到不同的项目,您始终可以通过键入以下内容来清除您的凭据:

edge-impulse-linux --clean

您还可以通过键入ctrl-c退出 CLI

连接您的电路板后,可以直接使用 Edge Impulse 的 Web 界面从您的 MaaXBoard Mini 收集数据。Data Acquisition页面上,选择您的设备,输入标签(对于对象检测,这只是文件名,不会创建标签),选择您的传感器(选择相机)并开始采样

您将看到相机源的预览。

 
 
 
poYBAGNiSSaANI0hAAC9A-FtEcA873.png
 
1 / 2选择您的设备和传感器并开始采样!
 

使用 GUI 上传器上传数据

使用 Edge Impulse 采样数据非常有用,但它一次只能采集一张图像。由于我需要在一段时间内收集大量数据,因此最简单的方法是编写一个脚本来收集 MaaXBoard 上的数据,将其压缩,然后将其发送到我的 PC 进行上传。

在这种情况下,我将使用ffmeg库连续拍摄图像:

sudo apt install ffmpeg

创建一个名为 hardhats 的文件夹并将cd放入其中。运行如下脚本开始收集 322 像素图像(Edge Impulse 中对象检测项目中图像的最大尺寸)。

我的地下室碰巧有一个实际的建筑工地,所以我在粉刷地下室时让 ffmeg 运行,中途脱下安全帽。

mkdir hardhats
cd hardhats
nohup ffmpeg -s 320x320 -i /dev/video1 -r 2 hardhats-%04d.jpg
 
 
 
pYYBAGNiSSiABURkAAA63NFsYfE753.jpg
 
1 / 2戴着安全帽绘画
 

压缩名为hardhats的文件夹

sudo apt install zip
zip -r hardhats.zip hardhats

在我的主机 PC 上,我将压缩文件夹复制到:

scp ebv@192.168.1.14:hardhats.zip .

然后,我只需使用 Edge Impulse 界面的 Data Acquisition 选项卡上的上传按钮解压缩并上传整个文件夹:

 
 
 
poYBAGNiSSuAZ7yKAABqEsUDFwk646.png
 
1 / 2
 

使用 Edge Impulse CLI 上传数据

您还可以使用edge-uploader cli从主机轻松上传数据。这有一个额外的好处,就是能够上传已经注释的数据,只要注释的格式正确。

首先,安装 Python3 和Node.js v14 或更高版本。然后安装 CLI。在这里,我将它安装在我的 Mac 上(Linux、Windows 和 Mac 的完整说明在这里):

npm install -g edge-impulse-cli --force

要将数据上传到 Edge Impulse,请运行edge-impulse-uploader您的数据目录,例如:

edge-impulse-uploader /Users/monica/Documents/EdgeImpulseTalk/restsubset2898/output/.*jpg

这将引导您配置 CLI 以上传到所需的项目。它会让您知道文件是否成功上传。

poYBAGNiSS2ADcSiAADe9LvZ9LY478.png
 

如果要使用不同的项目重新配置 CLI,请运行:

edge-impulse-uploader --clean

注释数据

Edge Impulse 让您可以直接在 Web 界面中注释数据。单击数据点旁边的三个点,然后选择编辑标签。您还可以通过选择“标记队列”选项卡一次编辑所有未标记的图像

在图像上拖动鼠标以标记它。输入标签名称,然后单击设置标签最后,选择保存标签

 
 
 
pYYBAGNiSS-AOd_jAACfHXBBC2I460.png
 
1 / 4单击数据点旁边的三个点并选择编辑标签
 

使用现有标签上传数据

如果您选择使用预先注释的数据集或在另一个工具中注释您的数据(要了解有关注释数据的更多信息,请参阅我的项目“机器学习注释数据”),您可以通过将注释保存在单个文件中来上传注释您的主机 PC 称为bounding_boxes.labels 您可以在Edge Impulse 的文档中的“边界框”标题下查看有关 Edge Impulse 使用的特定 JSON 注释格式的更多信息

我编写了一个 python脚本来将流行的注释格式Pascal VOC转换为 Edge Impulse JSON 格式。如果您的标签是另一种格式,您可以使用 Roboflow 的有用工具将它们转换为 Pascal VOC,然后使用我的脚本将它们转换为 Edge Impulse 格式。

要上传您的注释,请将bounding_boxes.labels与您的图像放在同一文件夹中并运行边缘脉冲上传器。

 
 
 
poYBAGNiSTGAau8uAAAY4slT2zo015.png
 
1 / 3注释的文件夹结构
 

设置和训练您的模型

生成特征

现在您的图像已被标记,是时候设置训练了。为此,请转到Impulse design选项卡。在第一个子选项卡上,Create Impulse目标检测模型没有太多工作要做,因为这里的参数受到限制。

选择Image选项卡,然后单击Generate features 单击“生成特征”按钮。

 
 
 
pYYBAGNiSTSAH85pAABnGqlGSVg385.png
 
1 / 2单击“生成特征”按钮。
 

理想情况下,不同的特征应该聚集在不同的组中。如果您看到它们都聚集在一起,请检查彼此靠近的不同特征,看看您的数据是否存在问题。

 
 
 
poYBAGNiSTeAVd4qAABfN4hxxKQ909.png
 
1 / 5糟糕的数据 - 特征彼此非常接近
 

您可以将鼠标悬停在每个数据点上并单击以查看与其相关的图像。通过这样做,我能够看到中间的图像往往有非常小的注释,所以我提高了注释的最小尺寸,再次上传我的数据,这样可以获得更好的数据。

训练模型

是时候训练你的模型了。如果您熟悉 Keras,可以使用 Keras 模式来选择模型设置。从 GUI 中,您可以轻松选择不同的模型、训练周期数、学习率和分数阈值。最后,选择开始训练来训练您的模型。

pYYBAGNiSTqAI6T9AAD5lVruclg270.png
 

测试和部署您的模型

测试你的模型

训练模型后,您将看到 Precision 分数和估计的设备性能。

Edge Impulse 让您可以在板上测试您的项目。只要您的电路板已连接,您就可以使用MaaXBoard Mini的实时分类进行测试。只需像在数据采集期间一样选择您的设备,然后选择Start Sampling

 
 
 
poYBAGNiST2AVN9jAACB-IHmU90511.png
 
1 / 3选择开始采样
 

默认情况下,此处拍摄的图像会添加到测试集中。您可以通过选择“摘要”旁边的三个点并选择移动到训练集来将项目移动到训练集将其移至训练集后,它还将显示在Labeling queue下的Data Acquisition选项卡下,您可以在其中添加标签。

然后,您可以使用这些测试图像测试您的模型。要专门为测试集上传数据,您必须在上传中指定。上传您的测试数据并指定--category testing.

edge-impulse-uploader --category testing C:\Users\044560\Documents\EdgeImpulseTalk\testset\output\*.jpg

你的训练集应该是你图像的 80%,而你的测试集应该是 20%。如果您的测试集中有太多或太少的图像,您会在Data Acquisition选项卡上看到一个警告按钮。您可以通过单击它并选择Perform train / test split来修复您的拆分

 
 
 
poYBAGNiSUKAX3JDAAB6k8EaBco864.png
 
1 / 2数据采集选项卡上的警告按钮
 

您将能够在Model Testing侧边栏下看到所有测试数据。要在您的测试数据上测试您的模型,只需选择Classify all 图像分类后,您可以通过单击图像旁边的三个栏并选择“显示分类”来获得更好的视图。

在这里,您可以准确地查看模型分类错误的内容,并使用此信息来改进您的模型。例如,我的模型在这张图片中只正确分类了最大的头盔,所以我可以推断当主体太远时它的表现很差:

 
 
 
pYYBAGNiSUWAK3CVAADtF-OzHi4380.png
 
1 / 3要在您的测试数据上测试您的模型,只需选择 Classify all
 

版本控制

如果您的模型获得了不错的准确性,最好保存它的一个版本。我喜欢在版本描述中注明准确性和我使用的数据集子集,以及训练周期数和学习率:

 
 
 
pYYBAGNiSUiASyVYAACnRC_l8to879.png
 
1 / 2保存版本
 

要恢复您的项目,请单击它并选择恢复在弹出窗口中,为您的项目命名并选择Restore version Edge Impulse 会将您的版本恢复为一个全新的项目,其中包含完整的原始数据集。

 
 
 
pYYBAGNiSUuACsa7AABjgUbYMEA312.png
 
1 / 4选择恢复
 

从 CLI 运行您的项目

要实际运行您的模型,首先您必须在“部署”选项卡下构建它。选择Linux,然后选择build

poYBAGNiSU-AXiafAADB4x7jOlM509.png
选择 Linux 板,然后选择构建
 

再次运行edge-impulse-linux并连接到您的项目(如果您仍未连接)。下载模型文件并使用edge-impulse-linux-runner运行它

edge-impulse-linux
edge-impulse-linux-runner --download modelfile.eim
edge-impulse-linux-runner
 
 
 
pYYBAGNiSVGAaNxfAAB1tk7ba-g465.png
 
1 / 4下载模型文件
 

您可以通过转到终端输出 EG 中列出的 IP 地址来查看您的模型所看到的内容

http://10.0.0.79:4912

每当您的模型检测到不安全的情况时发送短信

在twilio上创建一个帐户并在“购买号码”页面上购买“发件人”电话号码以允许发送 SMS。设置一个免费帐户可为您提供 15 美元的信用额度,因此您不必花任何钱。

我从 Edge Impulse 分叉了一个简单的 web 应用程序,它运行您的模型并在每次检测到没有安全帽的人时通过 Twilio 发送文本警报。

在您的 MaaXBoard Mini 上安装 git 并克隆存储库:

sudo apt install git 
git clone https://github.com/zebular13/example-linux-with-twilio.git

将 your.eim 文件移动到 repo 文件夹中:

mv modelfile.eim example-linux-with-twilio.git/modelfile.eim

输入 repo 并安装依赖项:

cd example-linux-with-twilio.git
npm install

通过以下方式启动应用程序:

npm run build
node build/webserver-twilio.js modelfile.eim

您将在终端中看到警报,在您的网络浏览器中http://localhost:4911 ,您还将开始在手机上收到警报!

 
 
 
pYYBAGNiSVOAci07AACW6iRhLbE043.png
 
1 / 2
 

 


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

评论(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:'在MaaXBoard Mini上使用Edge Impulse进行安全帽检测',//标题 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);