×

Kindbot:家庭花园自动化中心开源

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

张艳

分享资料个

描述

查看Remyx.ai的新功能

Kindbot的黎明

2018 年初,我们开始开发一种植物监测器,以探索加州本土种植的大麻。大麻花的平均价值为320 盎司,在理想的生长条件下需要几个月的时间才能长成。

通常,家庭种植爱好者会搭建小空间或帐篷,在那里他们可以悬挂 HID/LED 灯、用于通风的风扇、用于温度控制的空调和用于水培的灌溉泵。

 
典型的种植帐篷示例
 

种植者通常依靠计时器来协调所有这些设备的调度,而过热往往是维持有助于花卉茁壮成长的稳定性的挑战。

除了这些设备之外,种植优质农产品还需要一些生物学和植物科学领域的知识。论坛和昂贵的应用程序有助于填补知识空白,但建议很少是按需提供的,而且由于顾问对问题的描述方式存在偏见或提供建议的人的经验,这些建议往往是错误的。

环境控制器技术面向定价和用户体验假设方面的商业应用。

在 Kindbot 中,我们开发了一个系统来维持理想的生长条件,该系统利用环境控制和植物健康诊断中的深度学习。

为了使 Kindbot 成为功能最强大且易于使用的环境控制器,我们使用简单的硬件设计并通过 picamera 促进计算机视觉。

最终,我们拥有理想的平台来支持:

  • 保持稳定、最佳的环境控制
  • 通过移动应用程序远程访问照片和仪表板
  • 丰富的数据记录和智能通知

构建 Kindbot

我们从紧凑而灵活的 Raspberry Pi Zero 微控制器开始,探索了一系列大气传感器,包括DHT11 Si7021 BME280 ,然后才选择后者。

至少,我们需要温度和湿度读数。根据这些值,我们求助于 Arrhenius 方程来计算蒸气压亏缺(VPD)。该统计数据提供了一个参考框架,根据驱动植物光合作用的物理压力将温度和湿度背景化。

 
poYBAGSBOY-ANwY2AAEfiUL5zHM80.jpeg
 

根据这一统计数据,我们可以针对不同的范围以最佳方式支持自然生长周期。

通过使用sqlite3记录我们的传感器数据,我们发现一些零星的读数异常异常。对于一个健壮的控制器,我们需要意识到这种错误。

由于我们的目标是保持稳定的生长条件,因此我们采用了一个简单的“时间上的温度连续性”假设。简而言之,我们忽略在短时间内偏差太大的读数。

一旦我们可以信任并记录我们的读数,我们就可以启动一个slackbot来报告当前状况,当状况超出目标范围时使用twilio发送短信通知,或通过电子邮件发送报告以获得概览以检查任何指示问题的异常情况.

在设计 Kindbot 时,我们测试了 YL-69 传感器来探测土壤湿度,并测试了TSL-2561来测量光强度,然后更多地使用相机来简化设备配置文件。

在我们努力控制最重要的环境参数的过程中,我们甚至开发了一个姊妹设备 Budtender,用于执行 pH 控制和营养素自动计量。

在强调现代消费电子美学优于传统环境控制器设备的同时,我们探索了与智能家居设备的集成。我们已经尝试使用 VUI 运行带有 Alexa Smart Home Skills 和flask-assistant Google Home Assistant Actions的flask-ask服务器。

 
Alexa,告诉 Kindbot 展示我的成长!
 

最终,我们的目标是实现一个非常简单的设计,并在 iOS 和 android 中采用我们的 UI mobile。

Kindbot酷

最后,我们想要的不仅仅是日志记录和通知,我们还想要控制。一个简单的想法是定期检查最新的温度读数,并根据温度是否超过预定阈值应用简单的“开-关”决策。在我们在 N 分钟后重新评估之前,该决定将告知我们的 AC 是否正在运行下一个周期。然而,这通常会导致不希望的温度波动。

标准方法是使用PID控制。这里是对用于调整 PID 模型的启发式方法的一个很好的概述。通过一些试验和错误,我们可以在 74 F 的设定点附近实现合理的稳定性,而不会在每天早上开灯时出现过多的超调。

 
pYYBAGSBOZGANRBJAACCRESouac458.png
 

我们还通过将我们的温度控制问题重新定义为强化学习范式中的游戏来探索深度学习的应用

例如,假设将代理置于一个环境中,在该环境中允许的操作是在下一个 N 分钟周期内打开或关闭空调。在每个周期开始时,我们都会评估我们的状态,其中还可能包括温度、湿度和任何其他重要的、最近的环境统计数据。

然后,如果我们达到目标,在一个小的公差范围内加上或减去设定点,我们的代理就会得到奖励。另一方面,如果温度超出可接受的公差范围,我们的智能体就会受到与这种差异程度成正比的惩罚。

像上面这样的代理可以在线方式学习策略函数,以使用REINFORCE算法(即策略梯度)来专门化环境控制。

 
pYYBAGSBOZOAIX6YAADmlwISW5M543.png
NO AC:使用简单的风扇进行温度控制
 

Kindbot 通过控制温度及其变化来帮助减少能源使用、控制过热和促进新陈代谢。

Kindbot,喂我!

控制灌溉通常要简单得多,而且是基于时间表的。一些研究可以根据灌溉设计(无论是水培、气培还是土壤)来决定浇水频率。对于 Kindbot,它总是归结为知道要控制哪个智能插头以及运行它的时间/频率。

我们使用pyHS100 repo 来控制灌溉泵、灯和风扇等设备。您甚至可以使用 TP-Link HS110 智能插头查询能源使用情况。

 
通过家庭扬声器、应用程序或 Kindbot 对 cv 模型发现的自动响应触发
 

在另一种一年生木本植物:一品红中,研究表明,使用动态灌溉控制(灌溉频率与当前 VPD 测量值成正比)可以更好地促进插条的根系发育。

我们可以将一系列 VPD 值转换为一系列喷雾频率,以便我们更频繁地灌溉以提供额外的冷却,并使用植物的自然水力来驱动气培或滴灌系统中的养分吸收。

Kindbot Cannavision

由于人们自豪地分享他们大麻种植的照片,我们有大量的开源数据来探索基于计算机视觉的技术,从我们种植空间的图像中提取有价值的信息。

我们从可以通过简单的谷歌图片搜索收集到的信息开始,利用非常方便的 firefox插件我们可以通过改进我们的搜索查询、尝试其他搜索引擎和反向图像搜索良好的原型图像来扩展我们的结果集。

通过这种方式,我们收集了数千张照片并使用labelimg对每张照片进行注释以识别重要的植物结构这有助于我们通过识别芽结构来探索产量或收获时间估计,或通知种植者植被变黄,这可能意味着需要人工接触的营养/pH 问题,甚至可以识别表明水压低的柔软、下垂的叶子,以便Kindbot 可以触发灌溉事件。

 
poYBAGSBOZaAO2PxAAEvevXgNXQ014.jpg
 

正如我们记录温度读数一样,我们也记录计算机视觉模型结果,这有助于我们平均掉图像之间的噪声,以获得更强大的警报系统。

 
pYYBAGSBOZmAaPm7AACQV-vv-1s952.png
 

另一个简单的想法是对 HSV 颜色空间中的图像进行阈值处理,以便我们可以测量 picamera 视野中绿色像素的比例。以下代码块可用于通过叶面积指数量化营养质量的发展。

img = cv2.imread('YOUR_IMG_FILE.png', 1)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, (36, 0, 0), (70, 255,255))
imask = mask>0
green = np.zeros_like(img, np.uint8)
green[imask] = img[imask]
green = np.where(green > 0, 1, 0)
lai = np.mean(green)

选择 Kindbot 拍摄的几张照片,我们设置阈值以隔离足够的绿色像素。

 
pYYBAGSBOZuADEJgAACbNChn5LQ597.jpg
早期营养阶段
 
 
pYYBAGSBOZ6AQJyUAAEaKBn_c30279.jpg
植物生长后期
 

计算这些图像中绿色像素的比例(我们假设是植被),我们得到叶面积指数

下图显示了我们计算的叶面积如何随着时间的推移而变化,如上图所示。在 Kindbot 帮助维持的一致条件下,我们观察到爆炸式增长。

 
poYBAGSBOaGAXReZAADhd7aHCoU249.png
 

Kindbot 将此信息应用于:

  • 提供相机定位反馈
  • 跟踪每周的相对增长
  • 改变光照时间表以在充足的蔬菜后触发结果
  • 通知用户停电

Kindbot 一般

生长环境中的照明条件可能因设置而异。看看“LED 生长灯”的图片搜索结果:

 
poYBAGSBOaaAUQZ2AAM5OamomQ4748.png
 

我们计算叶面积指数需要在 HSV 颜色空间中对图像进行阈值处理。然而,不自然的光温会极大地影响这种测量。

我们探索了 GAN 来学习图像变换以执行颜色校正:

 
 
 
 
pYYBAGSBOamAIsxZAAA0HY80M5M556.png
 
1 / 2LED 灯样品
 

因为我们最初的物体检测模型依赖于数以千计的样本物体来举例说明许多常见的生长室配置,所以该模型对色温差异仍然非常稳健。

尽管如此,我们并没有就此停止收集数据。从 ImageNet 及其大麻图像链接开始,我们在网上抓取了更多图像。此外,我们开发了一个名为Buddy的专门分类器来诊断由于环境、害虫和养分/水压力因素的视觉指标引起的问题。

python request 和 lxml 库等工具在这里提供帮助。熟悉 xpath 将使它变得容易。Scrapy让事情更上一层楼,如果你真的想建立你的数据集,请查看这篇关于在 polipo 后面整合 SOCK5 代理的帖子。

Kindbot 外壳

Kindbot 从一台计算机和一组环境传感器开始,然后我们积极淘汰那些计算机视觉为其提供代理信息的传感器。

当我们压缩设备时,我们测试了几种设计和材料。同样,我们探索了 Kindbot 的不同表面处理技术,使用木材染色、聚丙烯、打磨和抛光 PLA 材料以及用于 ABS 的丙酮蒸气浴。

 
 

最初的设计使用了光滑的球窝旋转附件。

 
快速组装
 

最近,我们放弃了球窝接头以获得更纤薄的外形,同时使用标准相机安装硬件,以便用户可以利用现成的配件。

 
poYBAGSBOayAUp1CAAQHRAb3Kk4946.jpg
具有更像木头的铜绿
 

Kindbot 包装理念...

 
kindbot 金箱
 

Kindbot超越

每个种植者至少应该监测温度和湿度。许多人会选择在他们的室内花园中安装网络摄像头,以实现远程监控和安全。园丁们通常依靠机械定时器来对他们的灌溉系统进行编程。

Kindbot 将所有这些重要功能集成到一个装有 AI 的微型设备中,以从图像提要中提取有价值的见解,以根据可靠的园艺科学执行操作。

计算机视觉应用程序已经进入农业科技领域,尽管早期的工作依赖于对对象的大小和形状相当敏感的简单方法。应用机器学习来更稳健地识别植物胁迫表型是一项相对现代的工作。一些研究使用深度学习来识别具有编码器-解码器神经网络架构的植物结构。有些使用经典机器学习其他人则使用 3D 激光扫描仪作为工业机械臂的有效载荷来获取更多数据。

通过训练图像分类模型来识别数十种植物毒性、缺陷和害虫,我们构建了一项服务,通过简单的图像上传来诊断植物。

 
获取有关您成长的答案!
 

我们相信这将构成节水智能灌溉系统的基础。它可以在大麻种植之外有应用,例如太空食品生产。

 
新领域
 

通过这个花园番茄植物示例,我们可以看到结果如何转移到大麻种植之外。

 
pYYBAGSBObeAEjozACCpJB0twIQ691.png
干旱胁迫检测转移到其他浓密植物
 

Kindbot 灌溉控制可以通过引入带 pH 控制的自动加药器来改进。这是我们称之为 Budtender 的相关产品背后的使命。

 
蠕动泵经过校准以输入您的营养素/pH 值
 

Github 回购

 
受过交换大麻花和海浪的训练……橡树也行!
 

致谢

我们要感谢:

更新:2018 年 4 月 20 日在加州大学伯克利分校的 Memorial Glade举行的派对上,我们分发了近 100 个来自我们首次收获的有机无农药花蕾样本,以推广 Kindbot。

 
pYYBAGSBObuAb2tqAAMyF41ovy4688.jpg
有人说有机、无农药的杂草吗?
 

 


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

评论(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:'Kindbot:家庭花园自动化中心开源',//标题 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);