如下图所示,Raspberry Pi 将图片从我的喂鸟器发送到 AWS 的 S3 存储桶。当新图像到达 S3 时,这会调用 Python Lambda 函数,将照片发送到 AWS Rekognition,后者使用其基于 ML 的图像识别功能来确定照片中的内容。如果检测到一只鸟,这会触发一条发送至 SNS 主题的消息,您可以使用该消息来获取文本或电子邮件。如果检测到松鼠,则会向不同的 SNS 主题发送一条消息。因此,您可以使用文本通知自己发现了松鼠,这样您就可以将其赶走,并使用电子邮件通知自己有趣的鸟类。或者你甚至可以连接 Raspberry Pi 以向任何入侵喂鸟器的松鼠射水(这可能是明年夏天的一个项目)。最后,我添加了一个使用AWS S3 静态网站方式,让您轻松查看最佳图片。
要完成这个项目,您需要一些 Python 技能(我已经提供了我的代码,但您需要根据自己的情况进行一些修改)和对 AWS 的中等程度的了解。
在封面照片中,您可以看到我的 Raspberry Pi 4 和高质量 (HQ) 相机。我开始使用适合 HQ 相机的 50 美元长焦镜头,但我已经改用从佳能 EOS 相机借来的佳能镜头。您需要购买一个适配器(来自 Arducam)才能将佳能镜头连接到相机(30 美元),但这非常值得。使用这样的优质镜头,图像非常好,而且与我原来的镜头不同,您可以尽可能近地放大。
Raspberry Pi 只是一个带有 ARM 处理器的非常小的 Linux 机器。有一个名为PI-TIMOLO的软件包,我发现它非常有用。您可以在 Raspberry Pi 上运行它来检测运动,并自动拍摄照片。您不需要将红外运动检测器连接到 Raspberry Pi(尽管这可能不是一个坏主意)。PI-TIMOLO 扫描来自您的相机的低分辨率流,如果它检测到从一帧到下一帧的显着差异,它会断定某些东西已经移动,并暂时停止流,拍摄一张高分辨率照片并将其放入文件夹。
我将带有长焦镜头的 Raspberry Pi 高质量 (HQ) 相机对准我的喂鸟器并设置了 PI-TIMOLO。您需要调整几个 PI-TIMOLO 设置才能在特定情况下获得良好的效果,但您可以忽略很多设置,例如与视频和全景照片相关的设置。只需专注于图像和运动设置。我将放一个我在 Github 存储库中使用的 PI-TIMOLO 设置的示例。
我在 Raspberry Pi 上运行了一个小型 Python 程序,它控制 PI-TIMOLO 放置照片的目录。如果我的代码在该文件夹中检测到一张新照片,它会裁剪照片(稍后我将解释)并进行 API 调用以将其发送到 AWS 中的 S3 存储桶。这是代码:
https://github.com/mesadowski/RaspberryPi-Bird-Image-Recognition/blob/main/s3_send_bird_pic_crop.py
要使此代码正常工作,您需要在 Raspberry Pi 上安装 boto(AWS Python 开发工具包),并在 AWS 中创建一个有权写入 S3 的 IAM 用户。您需要将该 IAM 用户的 AWS 用户凭证复制并粘贴到 Raspberry Pi 上 .aws 或 .boto 文件夹中的凭证文件中,以便您的 Python 代码具有将文件放入 S3 存储桶所需的凭证。
一旦开始工作,您就可以在 AWS 中创建一个 lamdba 函数。Lambda 是 AWS 的旗舰无服务器计算服务。Lambda 是一段代码,一旦被某个触发器调用就会运行,触发器可能是传入的 API 调用或计时器,或者在我的情况下,是到达 S3 存储桶的东西。一旦完成它的工作,Lambda 就会终止。这对我的基于 ML 的鸟和松鼠检测器来说很好,因为它让我无需运行单个服务器即可运行应用程序,因此非常经济。在 AWS S3、Lambda、Rekognition 和 SNS 以及 S3 静态网站之间,我拥有所有这些强大的功能,包括最先进的图像识别、云存储以及电子邮件和文本通知,而且它实际上是如果我可以接受标准的 Rekognition 服务(即,不是自定义标签——稍后会详细介绍),则免费。只需确保您的 Raspberry Pi 不会疯狂地向 S3 发送太多照片,例如,如果您的运动检测设置过于宽松,因为最终可能会增加太多的 API 调用。但是,如果相机每天拍摄大约 200 张照片,则运行成本很低,因为 AWS 免费套餐每月为您提供 5,000 次 Rekognition 调用。
要创建 Lambda,首先,您需要创建 Lambda 将代入的角色,该角色拥有 S3、Lambda、Rekognition 和 SNS 的权限。转到 AWS 控制台中的 IAM,并创建一个新角色并为其提供以下策略:
然后转到 AWS 控制台中的 Lambda。单击创建函数,然后选择从头开始作者。命名您的 Lambda,并选择 Python 3.8 作为您的语言,并确保为其提供您之前创建的角色,以便它可以访问 S3、Rekognition 和 SNS。
创建 Lambda 后,您希望将其设置为基于在 S3 中创建的新对象(即从 Raspberry Pi 发送的新照片)触发。因此,您单击 Trigger 按钮并选择 S3 存储桶和文件夹(AWS 也称为前缀),您的图片将从 Raspberry Pi 发送到其中。然后,是时候输入你的 Python 代码了。这是我的,但您需要输入自己的 SNS 主题标识符:
https://github.com/mesadowski/RaspberryPi-Bird-Image-Recognition/blob/main/BirdLambda.py
醒来后(新图片到达 S3 时),Lambda 调用 Rekognition API 以查看照片中的内容。Rekognition 是一项 AWS 图像识别服务。我在我博客上的一篇博文中描述了 Rekognition 。简而言之,如果您向 Rekognition 提供图像,它会告诉您它认为其中的内容。我发现 Rekognition 的开箱即用训练使其能够识别鸟类,并且有时可以识别正确的鸟类种类。它还可以识别松鼠,松鼠是饲养者周围常见的害虫。在上面的代码中,我使用了标准的 Rekognition 服务,该服务经过预先训练,可以识别常见的物体、动物和名人(以防名人出现在我的喂鸟器周围)。
所以无论如何,我的 Lambda 代码调用 Rekognition API 并查看响应以查看 Rekognition 看到的是鸟还是松鼠。我使用 AWS 控制台创建了两个 AWS 简单通知服务 (SNS) 主题:一个用于鸟类观察,一个用于松鼠观察。因此,根据 Rekognition 在图像中看到的内容,我的 Lambda 使用 SNS API 将消息发布到适当的 SNS 主题。您可以通过电子邮件或 SMS 文本订阅 SNS 主题,并获得 Rekognition 看到的鸟类类型的通知,以及松鼠目击事件的通知。
将 Raspberry Pi 配置为具有正确的 PI-TIMOLO 和摄像头设置需要一些时间。您希望 PI-TIMOLO 足够灵敏以在检测到鸟时触发照片,但又不至于敏感到风中飘动的几片叶子会触发照片。
这是我第一次开发 Lambda 函数。我已经在我的 Mac 上对大部分代码进行了原型设计和测试,但是当我在 AWS 控制台中创建 Lambda 代码时调试起来有点困难,因为我是通过查看 AWS Cloudwatch 来调试它以查看发生了什么。通常,在您检查 Cloudwatch 以查看是否有任何错误之前,最多有 5 分钟的延迟。AWS 有一个用于在本地调试 Lambda 的工具(称为 SAM),因此如果您要创建复杂的 Lambda,这可能值得学习,但这次我设法克服了它。
使用开箱即用的 Rekognition 服务,我很快收到许多通知,告诉我图片中有喂鸟器(不是开玩笑)或草坪家具。所以很容易过滤掉那些。然后它开始告诉我每张照片中都有草或“自然”,所以我不得不将其过滤掉。最终,我发现 Rekognition 正在识别图片中有一只鸟的事实,但它无法识别物种。问题是我的图像质量。以前,当我向 Rekognition 提供专业品质的鸟类照片时,它通常可以识别物种。但是我的照片没有那么好。我发现通过裁剪照片以使鸟占据图像的更高部分,Rekognition 倾向于更多地关注鸟并且有时可以识别鸟类。因此,我使用 Python Pillow 库在我的 Raspberry Pi 代码中添加了一些裁剪逻辑。从我的 Raspberry Pi 相机裁剪啄木鸟图像(下图)并将其发送到 Rekognition 后,我从 SNS 收到了以下通知:
Detected labels for photo at time 2020-11-22-18:34:11
Bird (Confidence 99.25276184082031)
Flicker Bird (Confidence 78.45641326904297)
Woodpecker (Confidence 78.45641326904297)
Finch (Confidence 54.26727294921875)
in photo new-bird-images/2020-11-22-13-34-09.jpg
这是一只红腹啄木鸟,因此 Rekognition 确实确定它是一只啄木鸟(有一定的信心),虽然不是红腹啄木鸟。它还认为它可能是一只闪烁的鸟(和一只雀,信心不足)。那是错误的,虽然当我在康奈尔鸟类学网站上查找闪烁时,事实证明它们是啄木鸟的一种,所以这个答案并不完全离谱。然而,Rekognition 有时会给出一些奇怪的结果。例如,下面的照片被 Rekognition 标记为“家禽”。也许它看起来有点像一只小鸡?还有一次,Rekognition 认为我后院的一张照片中有一只企鹅。我查了一下,确实是一张黑白鸟的照片。当然,ML 图像识别模型只知道它们之前提供的训练图像(由训练模型的人提供)。他们不了解图像的上下文,这会让他们知道报告我的后院有一只企鹅是荒谬的。
要获得真正准确的结果,您可以考虑训练 Rekognition 自定义标签(或其他一些涉及自定义训练的基于 ML 的方法)。按照我之前博客文章中的方法,我使用来自加州理工学院-UCSD 鸟类图像数据集的图像来训练 Rekognition 在我所在地区的常见鸟类上。我放入了一些松鼠的照片,以便 Rekognition 也可以识别它们。训练模型花了大约 1.4 小时,但结果令人印象深刻(尽管我发现我能够接近我用几行 Python 编写的 fast.ai 模型。你可以在我的博客上阅读). 在下面,您可以看到 Rekognition 自定义标签在测试图像上对东北部各种鸟类(和松鼠)的表现 - 几乎永远不会出错(至少在使用专业质量图片时)!
但是,虽然这项 ML 服务做得非常出色,但对于个人爱好者来说,整天运行的成本太高了。作为 AWS 免费套餐的一部分,您可以获得几个小时,但之后每小时收费 4.00 美元。幸运的是,我能够在我的账户中获得 100 美元的免费 AWS 积分,因此我可以免费试用。为了节省成本,AWS 建议您启动服务、使用它,并在完成后将其关闭。所以你不能真正运行它几个小时,这是我最初的设计。但是,对于企业而言,这项服务非常物有所值,而且与其他选项相比,它确实没有那么贵。
要使用 Rekognition 自定义标签,您需要稍微更改 Lambda 函数以使用detect_custom_labels API 调用而不是detect_labels调用(这里是 Github 中代码的链接)。然后,启动模型(您可以为此使用 AWS CLI)。如果您在训练完成后单击 AWS 控制台中的模型并滚动到底部,AWS 会为您提供 AWS 命令行命令,您可以将其剪切并粘贴到终端窗口中。等待几分钟,AWS 控制台最终会告诉您它正在运行。只需确保在完成后停止模型,这样您就不会继续收取费用 - 这些可以加起来!
当我尝试使用 Raspberry Pi 相机拍摄的照片使用 Rekognition 自定义标签时,最初我发现 Rekognition 自定义标签无法识别任何内容。但是当我裁剪图像时,Rekognition 正确地确定我的啄木鸟图片(上图)不仅仅是一只啄木鸟,而是一只红腹啄木鸟。这非常酷,尽管当我向 Rekognition Custom Labels 发送大约 1200 张图片时,我学到了一些关于训练模型的艰难课程。鸟类 ID 通常是错误的,因为该模型已经在我的喂食器上不太可能看到的图像上进行了训练(例如,每年这个时候蓝鸟在这里并不常见,但它认为它看到了很多蓝鸟)。此外,我的图像有时会因为鸟在移动而失焦。所以如果我要一直运行这个模型,我
考虑到 Rekognition 自定义标签的成本,我可能会在一段时间内使用更便宜的现成 Rekognition 运行它,并考虑在未来转向更便宜的自定义模型(例如fast.我的博客上描述的ai模型)。
PS Raspberry Pi 的人们为 Magpi(Raspberry Pi 官方杂志)写了一篇关于这个项目的文章。你可以在这里找到它。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !