×

使用ML制作Pi垃圾分类器

消耗积分:0 | 格式:zip | 大小:0.50 MB | 2022-11-04

分享资料个

描述

垃圾分类器项目,被亲切地称为“它去哪儿了?!”,旨在让扔东西更快、更可靠。

该项目使用在Lobe中训练的机器学习 (ML) 模型 这是一个对初学者友好的(无代码!)ML 模型构建器,用于识别对象是否进入垃圾、回收、堆肥或危险废物。然后将该模型加载到 Raspberry Pi 4 计算机上,使其可以在任何可能找到垃圾箱的地方使用!

本教程将指导您如何使用 Python3 中的 Lobe TensorFlow 模型在 Raspberry Pi 上创建自己的垃圾分类器项目。

难度:初学者++(一些关于威廉希尔官方网站 和编码的知识很有帮助)

阅读时间:5分钟

构建时间:60 - 90 分钟

成本:~70 美元(包括 Pi 4)

在我们开始之前

此项目假设您从无头配置中完全设置的 Raspberry Pi 开始。​​​这是一个初学者友好的指南,介绍如何做到这一点。

它还有助于了解以下内容:

1.熟悉树莓派

2.阅读和编辑Python代码(你不需要从头开始编写程序,只需编辑)

3.阅读Fritzing接线图

4.使用面包板

找出你的垃圾去哪里

 

美国的每个城市(我假设是全球)都有自己的垃圾/回收/堆肥/等。采集系统。这意味着要制作准确的垃圾分类器,我们需要 1) 构建自定义 ML 模型(我们将在下一步中介绍这一点——无需代码!)和 2) 知道每块垃圾的去向。

由于我并不总是知道我用来训练模型的每个项目的正确垃圾箱,我使用了上面显示的西雅图公用事业传单,还有这个方便的“它去哪里了?” 西雅图市的查找工具!通过查找您所在城市的垃圾收集实用程序并仔细阅读其网站,查看您所在城市的可用资源。

在 Lobe 中创建自定义 ML 模型

pYYBAGNkdsKAbl5eAACvNMRtjYA983.png
 

什么是洛贝?

Lobe是一款易于使用的工具,拥有将机器学习理念变为现实所需的一切。向它展示您希望它做什么的示例,它会自动训练一个自定义机器学习模型,该模型可以为边缘设备和应用程序导出。它不需要任何经验即可开始。您可以免费在自己的计算机上进行训练!

以下是有关如何使用 Lobe 的快速概述:

1. 打开 Lobe 程序并创建一个新项目。

pYYBAGNkdsWAIDlJAADUfVRdIAg391.png
 
poYBAGNkdsiAMYcSAABY7cUfwsE614.png
 

2. 拍摄或导入照片并将它们标记为适当的类别。稍后我们将在项目的软件部分需要这些标签。

导入照片有两种方式:

  • 直接从您的计算机网络摄像头拍摄物品照片,或

从您的计算机导入现有照片(通过单张照片或文件夹/数据集上传)。

  • 请记住,照片文件夹名称将用作类别标签名称,因此请确保它与任何现有标签匹配!
  • 从您的计算机导入现有照片(通过单张照片或文件夹/数据集上传)。请记住,照片文件夹名称将用作类别标签名称,因此请确保它与任何现有标签匹配。

另外:我最终使用了这两种方法,因为您拥有的照片越多,您的模型就越准确。

poYBAGNkdsuAfWU2AAHuyNki8O0556.png
正确分类瓶盖的模型示例。
 
pYYBAGNkds6AVJokAAHiMZ65KBI527.png
误报示例。这告诉我我需要更多不同距离的瓶盖图像。
 

3.使用“播放”功能测试模型的准确性。更改距离、照明、手的位置等,以识别模型的准确位置和不准确位置。根据需要添加更多照片。

pYYBAGNkdtCAUO2gAAA6ci_t4r4055.png
 

4. 准备就绪后,以TensorFlow (TF) Lite 格式导出 Lobe ML 模型。

pYYBAGNkdtOAFY9OAAED7v0lLWI397.png
提示:为“非垃圾”创建一个类别,其中包含您空手和背景的照片。
 

提示:

在导入照片之前,列出您需要的所有类别以及如何标记它们(例如“垃圾”、“回收”、“堆肥”等)

  • 注意:使用与上面“Lobe Model Labels”照片中所示相同的标签,以减少您需要更改的代码量。
  • 在导入照片之前,列出您需要的所有类别以及如何标记它们(例如“垃圾”、“回收”、“堆肥”等)注意:使用与“Lobe”中所示相同的标签模型标签”照片,以减少您需要更改的代码量。
  • 包括一个“非垃圾”类别,其中包含照片中可能包含的任何其他内容(例如您的手和手臂、背景等)
  • 如果可能,从 Pi 相机拍照并导入 Lobe 这将大大提高模型的准确性!
  • 需要更多照片吗?查看Kaggle上的开源数据集,包括这个垃圾分类图像集!
  • 需要更多帮助?在 Reddit 上与Lobe 社区联系!

建造它:硬件!

pYYBAGNkdteAKUTWAAYO9TZ8IsU775.jpg
 

1. 小心地将 Pi 相机连接到 Pi(访问Pi Foundation 入门指南了解更多信息)。

poYBAGNkdtqAbL2YAAJJPoQrUA8174.jpg
 

2. 按照接线图将按钮和 LED 连接到 Pi GPIO 引脚。

  • 按钮:将按钮的一个引脚连接到 GPIO 引脚 2。通过电阻器将另一个引脚连接到 GPIO GND 引脚。
  • 黄色 LED :将正极(较长)腿连接到 GPIO 引脚 17。通过电阻器将另一腿连接到 GPIO GND 引脚。
  • 蓝色 LED :将正极连接到 GPIO 引脚 27。通过电阻器将另一条连接到 GPIO GND 引脚。
  • 绿色 LED :将正极连接到 GPIO 引脚 22。通过电阻器将另一条连接到 GPIO GND 引脚。
  • 红色 LED:将正极连接到 GPIO 引脚 23。通过电阻器将另一条连接到 GPIO GND 引脚。
  • 白色 LED :将正极连接到 GPIO 引脚 24。通过电阻器将另一条连接到 GPIO GND 引脚。

3. 建议在焊接或永久连接之前在面包板上测试您的威廉希尔官方网站 并运行程序。为此,我们需要编写并上传我们的软件程序,所以让我们进行下一步吧!

编码:软件!

1. 在您的 PC 上,打开WinSCP 并连接到您的 Pi。在 Pi 的主目录中创建一个 Lobe 文件夹,并在该目录中创建一个模型文件夹。

2. 将生成的 Lobe TF 文件夹内容拖到 Pi 上。记下文件路径:/home/pi/Lobe/model

3. 在 Pi 上,打开终端并通过运行以下 bash 命令下载适用于 Python3 的 lobe-python 库:

pip3 install https://dl.google.com/coral/python/tflite_runtime-2.1.0.post1-cp37-cp37m-linux_armv7l.whl
pip3 install lobe
pYYBAGNkdt6AYPZBAAGZwAoZkOM056.png
 

4. 从此repo下载垃圾分类器代码 (rpi_trash_classifier.py)到 Pi 上(单击“代码”按钮,如图 1 所示)。

  • 喜欢复制/粘贴?在此处获取原始代码。
  • 喜欢下载到您的计算机上?将存储库/代码下载到您的计算机上,然后通过 WinSCP(或您首选的远程文件传输程序)将 Python 代码传输到 Pi。

5. 将硬件连接到 Pi 的 GPIO 引脚后,通读示例代码并根据需要更新任何文件路径:

  • 第 29 行:Lobe TF 模型的文件路径
  • 第 47 和 83 行:通过 Pi 相机捕获的图像的文件路径

6. 如有必要,更新代码中的模型标签以与您的 Lobe 模型中的标签完全匹配(包括大小写、标点符号等):

  • 第 57 行:“垃圾”
  • 第 60 行:“回收”
  • 第 63 行:“堆肥”
  • 第 66 行:“危险废物设施”
  • 第 69 行:“不是垃圾!”

7. 在终端窗口中使用 Python3 运行程序:

python3 rpi_trash_classifier.py

测试它:运行程序!

poYBAGNkduCAMCj-AABCnNvXb-g902.png
 

计划概述

首次运行程序时,加载 TensorFlow 库和 Lobe ML 模型需要一些时间。当程序准备好捕捉图像时,状态灯(白色 LED)将闪烁。

拍摄图像后,程序会将图像与 Lobe ML 模型进行比较并输出结果预测(第 83 行)。输出决定打开哪个灯:黄色(垃圾)、蓝色(回收)、绿色(堆肥)或红色(危险废物)。

如果没有任何指示灯亮,状态指示灯返回脉冲模式,则表示拍摄的图像“不是垃圾”,即重新拍照!

捕获图像

按下按钮捕获图像。请注意,您可能需要按住按钮至少 1 秒,程序才能注册按下。建议拍摄一些测试图像,然后在桌面上打开它们以更好地了解相机视图和框架。

为了让用户有时间定位物体并调整相机的光线水平,大约需要 5 秒才能完全捕捉到图像。您可以在代码中更改这些设置(第 35 和 41 行),但请记住,Pi Foundation 建议至少 2 秒来调整光照水平。

故障排除

最大的挑战是确保捕获的图像符合我们的预期,因此请花一些时间查看图像并将预期结果与指示 LED 输出进行比较。如有必要,您可以将图像传递给 Lobe ML 模型,以进行直接推理和更快的比较。

需要注意的几点:

  • TensorFlow 库可能会抛出一些警告消息——这是示例代码中使用的版本的典型情况。
  • 预测标签必须与 led_select() 函数中所写的完全一致包括大小写、标点符号和间距。如果您有不同的 Lobe 型号,请务必更改这些设置。
  • Pi 需要稳定的电源。Pi 的电源灯应该是明亮的、稳定的红色。
  • 如果一个或多个 LED 未按预期亮起,请使用以下命令强制它们亮起进行检查:
red_led.on()

(可选)构建它:完成您的威廉希尔官方网站 !

pYYBAGNkduWAOFvOAAeaK2o-6FM166.jpg
 

现在我们已经测试并在必要时调试了我们的项目,使其按预期工作,我们准备焊接我们的威廉希尔官方网站 !

注意:如果您没有烙铁,您可以跳过此步骤。一种替代方法是在电线连接处涂上热胶(此选项将允许您稍后修复/添加/使用东西,但更容易损坏),或使用环氧树脂或类似的永久性胶水(此选项将更耐用但这样做后您将无法使用威廉希尔官方网站 或可能的 Pi)

快速评论我的设计选择(照片 1):

  • 我为 LED 和 Pi GPIO 选择了母跳线,因为它们允许我移除 LED 并交换颜色或在需要时移动它们。如果您想使连接永久化,您可以跳过这些。
  • 同样,我为按钮选择了 JST 连接器。

继续建设!

1. 将每根母跳线切成两半(是的,全部剪掉!)。使用剥线钳,去除大约 1/4 英寸(1/2 厘米)的电线绝缘层。

poYBAGNkdumAS84oAAWnCWBDUVs004.jpg
 

2. 对于每个 LED,将 220Ω 电阻器焊接到负(较短)腿。

pYYBAGNkdu-AXDVXAAZcU0GzNbc785.jpg
 

3. 剪下一小块约 1" (2cm) 的热缩管,然后将 LED 和电阻连接处推过。确保另一个电阻支脚可以接触到,然后加热热缩管直到它固定接头。

poYBAGNkdveASTmmAAhGqbW8sQ4703.jpg
 

4. 将每个 LED 插入一对母跳线。

poYBAGNkdv2AMFGOAAmfG687QBk696.jpg
 

5.标记跳线(例如用胶带),然后将跳线焊接到印刷威廉希尔官方网站 板 (PCB) 上。使用 perma Proto 板,您可以使用在面包板设置中使用的相同位置。

6. 接下来,使用(切割)母跳线将每个 LED 连接到其各自的 Pi GPIO 引脚。焊接并标记跳线,以便裸金属通过 PCB 连接到正极 LED 腿。

注意:焊接此线的位置取决于您的 PCB 布局。您也可以将此线直接焊接到正极 LED 跳线上。

poYBAGNkdwSAbpX5AAffEzYwE9Q593.jpg
 

7. 将 220Ω 电阻器焊接到 JST 连接器的负极(黑色)端。

8. 将 JST 连接器和电阻器焊接到按钮上。

9. 连接按钮连接器和 GPIO 引脚之间的 M-to-F 跳线(提醒:黑色为 GND)。

10. 将连接 PCB 涂上热胶或环氧树脂,以获得更安全的连接。

注意:如果您选择使用环氧树脂,将来您可能无法将 Pi 的 GPIO 引脚用于其他项目。如果您对此感到担忧,请添加 GPIO 带状电缆并将跨接线连接到该电缆。

(可选)构建它:案例!

为您的树莓派创建一个外壳,将相机、按钮和 LED 固定到位,同时保护树莓派。

设计您自己的外壳或按照下面的构建说明快速制作纸板外壳的原型!

poYBAGNkdwqAHz1_ABBIk6iKNbo244.jpg
 

在小纸板箱的顶部,追踪按钮、状态灯、识别灯和 pi 摄像头窗口的位置。

  • 注意:Pi 相机窗口应约为 3/4" x 1/2"。

2.用你的精密刀,切掉痕迹。

  • 注意:您可能需要随时测试尺寸
poYBAGNkdxOAR3IJAAusVySa_I0312.jpg
 

3. 可选:给外壳涂漆!我选择了喷漆:)

poYBAGNkdxuAThjUABSvpnJGxLs933.jpg
 

4.为Pi相机剪出一个矩形“窗口”盖并粘在盒子内侧

pYYBAGNkdyCAALWqAAangf3C6D8056.jpg
 

5. 最后,切出 Pi 电源线的插槽。

  • 建议首先安装所有电子设备,以找到 pi 电源线插槽的最佳位置。

安装和部署!

poYBAGNkdyOAECL4AAEYhexTMjI531.jpg
 

而已!您已准备好安装和部署您的项目!将外壳放在垃圾桶上方,插入 Pi,然后运行程序以获得更快、更可靠的减少浪费的方法。耶!

往前走

  • 通过Lobe Reddit 社区与其他人分享您的项目和想法!
  • 查看Lobe Python GitHub 存储库,了解有关如何使用 Python 部署更广泛的 Lobe 项目的一般概述
  • 问题或项目请求?对此项目发表评论或直接与我们联系:AskAMaker@microsoft.com

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

评论(0)
发评论

下载排行榜

全部0条评论

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

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"//m.obk20.com/www/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.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:'使用ML制作Pi垃圾分类器',//标题 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:"https://www.elecfans.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);