本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于树莓派的害虫检测系统

发布时间:2021-10-13
分享到:

基于树莓派的害虫检测系统

发布时间:2021-10-13
分享到:

背景

我的院子受到攻击。啄木鸟在我的甲板上钻孔,有什么东西住在(并摧毁)我的棚子下面,鼹鼠挖了一系列可以与大多数城市地铁系统相媲美的隧道。

这就是为什么我使用 Raspberry Pi、Pi 相机和一些机器学习来试图抓住我院子里的攻击者。更具体地说,这是我所做工作的高级概述。

  • 我在院子里放了一个树莓派。
  • 我将运动检测器连接到 Pi。
  • 我将 Pi 相机连接到 Raspberry Pi。
  • 当探测器检测到运动时,检测系统会用 Pi 相机拍照。
  • 使用机器学习算法分析照片。
  • 如果照片包含动物,检测系统会存储照片并向自己发送通知。
  • 如果照片确实不含有动物,删除照片。

第 1 步:连接
让我们先谈谈如何将所有东西连接起来。对于这个项目,我使用了 Raspberry Pi 4、PIR 运动传感器(用于检测运动)、Raspberry Pi 相机(用于拍照)和Blues Wireless Raspberry Pi Starter Kit (用于无线蜂窝连接)。这是当它们全部连接在一起时的样子。

如果您想为自己进行设置,您需要先将 Pi Camera 连接到 Pi 上的 Pi Camera 插槽。

接下来,您需要通过排列直通接头将 Blues Wireless Notecarrier 连接到 Raspberry Pi 的顶部。

最后,您需要将您选择的运动传感器连接到 Pi。

一切就绪后,您就可以开始编码了。

第 2 步:检测运动
检测运动是我想要解决的第一个问题,因为我将其用作接下来发生的所有事情的触发器。另外,我使用的机器学习算法(我们将在第 4 步中讨论)是相当密集的处理器,所以我想确保我只在动物可能真的出现在图片中时才运行该过程。

这是我最终使用的 Python 代码。

这里的想法是通过每 5 秒检查一次它所连接的 Pi GPIO 引脚的状态来检查运动传感器的状态。如果引脚被拉高,则意味着传感器检测到运动。当这种情况发生时,上面的代码只是打印一个用于调试的字符串,但在后面的部分中,我们将使用检测运动作为触发器来做更有趣的事情。

如果您自己设置,请继续将此代码保存在您的 Pi 上的新 Python 文件中,例如pest.py,并使用python3 pest.py. 如果一切正常,您应该能够在传感器前挥手并查看Motion detected终端输出。

现在我们有了感知运动的代码,让我们继续下一个逻辑步骤,看看如何使用 Pi 相机。

第 3 步:拍照
为了使用机器学习分析图像,您需要一张图片。幸运的是,树莓派有一个通用的摄像头,效果很好,并且有很好的文档记录。

注意:如果您不熟悉 Pi 相机,请确保在继续之前启用 Pi 上的相机。
这是我用来拍照的代码。

有几件事需要解释一下。首先,当我将图像保存到磁盘时,该get_image_name函数会执行一些逻辑来确定图像的名称。

这里的代码以当前目录中的图像数量命名图像images,最终会创建一个如下所示的文件结构。

其余代码是相当标准的 Pi 相机逻辑,但我将添加一些有关此部分的注释。

  • camera.rotation = 180翻转图像。我将相机倒置安装在我的院子里,所以如果你安装得当,你可以移除那条线。
  • time.sleep(2) 在拍照之前,让相机两秒钟来感知光线水平,这是 Pi Camera 的文档所推荐的。
  • camera.close()如果您在一个程序中拍摄多张照片,则需要。如果你忘记了这一点,你会得到一个错误,它没有为你指明正确的方向。

最后,结束take_picture返回一个图像名称,这将有助于我们下一步访问照片以查看它是否包含动物。如果我们将调用添加take_picture到我们的函数中,这看起来会是什么样子main。

第 4 步:使用机器学习分析图片
机器学习最常见的应用之一是图像分类——或者说能够拍摄图像并找出其中的内容。

图像分类过程依赖于一个模型,该模型是一个经过训练可以识别特定类型模式的文件。您可以使用Edge Impulse等平台自行构建此文件,也可以在 TensorFlow 等平台上查找预训练模型。

接下来,您需要使用以下代码来运行检测器本身。我将其设置得很低(60%),因为我很乐意接受任何类似动物的东西,尤其是在试验时。

该load_and_run_detector_batch函数返回一个图像数组(您可以一次处理多个图像),每个图像包含一个由 MegaDetector 检测到的事物的数组。

这意味着我们需要一些代码来解析 JSON 并确定 MegaDetector 是否检测到动物。这段代码看起来有点像这样。

把所有东西放在一起,如果我们缩小到我们的main函数,我们更新后的代码现在看起来像这样。

有了这个,我们现在有了一种算法,可以检测运动、拍照并分析这些照片以确定它们是否包含动物。

第 5 步:放置在户外
Raspberry Pi 不防水,它的相机也不防水,所以我想构建一些可以为我的硬件提供一点保护的东西——即使它有点笨重。

大块塑料是Awclub ABS 塑料接线盒,它在固定 Pi 本身方面做得非常好。我确实必须在顶部钻一个孔才能将电源线连接到 Pi。

然后我用胶带将 Pi 相机和我的传感器连接到我的甲板(最终是我院子周围的各种其他表面),效果出奇地好。从长远来看,我很想提出一种解决方案,既能保护相机,又能拍出好照片,但就我的简单目的而言,这种设置效果很好。

我使用标准 USB-C 电缆和一系列延长线为 Pi 供电。我可以用电池为所有东西供电,但当前的 ML 算法对处理器来说相当沉重,所以我决定确保 Pi 不断充满电,并且暂时忍受笨重的电源线。

潜在的改进
更好的运动传感器

我从亚马逊购买的廉价运动传感器可以工作,但它非常敏感——即使在其最低灵敏度配置下也是如此。当我的院子里没有任何事情发生时,这件事每隔几秒钟就会触发一次,因此传感器要么正在接收超自然活动,要么太敏感而无法在户外使用。

更高效的机器学习模型

微软的 MegaDetector 很棒,但它显然不是为在 Raspberry Pi 上运行而设计的。理想情况下,我会自定义训练一个模型来寻找小型啮齿动物——如果我从当前设置中获得足够多的图像,我可能会尝试这样做。

更好的防风雨

需要找到一种方法将传感器和相机包含在一个案例中,同时确保它们继续按预期工作。

更注重电池

如果我能找到或构建一个更高效的 ML 模型,那么我可以轻松地完全依靠电池或太阳能来运行这个项目。

该方案中用到的一些代码

如果您对此项目有任何想法、意见或问题,请在下方留言。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论