使用树莓派的AI驱动报警系统的制作

电子说

1.3w人已加入

描述

第1步:大计划

在这个教学中我们将展示如何:

使用OpenCV和TensorFlow设置Raspberry Pi

通过长USB电缆连接网络摄像头

编写OpenCV算法以检测运动

使用TensorFlow进行对象检测

在Raspberry Pi上设置Web服务器以显示有趣的图像

与IFTTT集成以在发现人时触发移动警报

将继电器HAT连接到Raspberry Pi,并将其连接到可为水池添加水的电磁阀

将水位传感器连接到Raspberry Pi并使用Pi的GPIO与其连接

写一些代码将它们粘合在一起

第2步:购物清单

所有组件均可从亚马逊购买。随意尝试和交换组件 - 这是一半的乐趣!

Raspberry Pi

Raspberry Pi电源(不要在这里吝啬)

记忆卡(越大越好)

案例(这个大到足以容纳Pi和HAT)

USB网络摄像头(任何网络摄像头都可以,但你想要一个

USB延长线(如果需要 - 测量Pi与摄像机放置位置之间的距离)

继电器板HAT(这个有3个继电器,我们只需要一个,但你很快就会发现其他用途!)

电磁阀

电磁阀配件1和配件2(这真的取决于你安装螺线管,但这些对我有用)

电磁阀电源(任何24V AC都可以)

电缆(再次,几乎任何2股电缆都可以 - 电流是最小)

水位浮动开关(这只是一个例子,检查可以轻松连接到游泳池的东西)

一些跳线和电线连接器

第3步:设置您的Raspberry Pi

格式化SD卡。这需要特别小心 - Raspberry Pi只能从FAT格式的SD卡启动。请遵循这些说明。

将Raspberry Pi连接到USB键盘和鼠标,再加上HDMI显示器,并按照Raspberry Pi NOOBS教程中的说明进行操作。确保设置WiFi并启用SSH访问。不要忘记为默认的pi帐户设置密码。

在您的家庭网络上为Raspberry Pi设置静态IP - 这将使SSH更加容易。

确保您的台式机/笔记本电脑上安装了ssh客户端。对于PC,我会推荐Putty,您可以从这里安装。

将Raspberry Pi中的USB和HDMI取下,重新启动它,然后插入它 - 如果一切正常,你应该看到这样的东西:

Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l

The programs included with the Debian GNU/Linux system are free software;

the exact distribution terms for each program are described in the

individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent

permitted by applicable law.

Last login: Mon May 13 10:41:40 2019 from 104.36.248.13

pi@raspberrypi:~ $

步骤4:设置OpenCV

OpenCV是一个用于计算机视觉的图像处理功能的惊人集合。它将允许我们从网络摄像头读取图像,操纵它们以查找运动区域,保存它们等等。 Raspberry Pi上的安装并不困难,但需要一些小心。

首先安装virtaulenvwrapper:我们将使用python来完成所有的编程,virtualenv将帮助我们将OpenCV和TensorFlow的依赖关系分开Flask或GPIO:

pi@raspberrypi:~ $ sudo pip install virtualenvwrapper

现在您可以执行“mkvirtualenv”来创建一个新环境,“workon”来处理它,等等。

所以,让我们为我们的图像处理创建一个环境,使用python 3作为默认解释器(它是2019年,没有理由坚持使用旧的python 2):

pi@raspberrypi:~ $ mkvirtualenv cv -p python3

。..

(cv) pi@raspberrypi:~

我们现在准备安装OpenCV。我们将主要遵循Learn OpenCV中的优秀教程。特别是按照他们的第1步和第2步:

sudo apt -y update

sudo apt -y upgrade

## Install dependencies

sudo apt-get -y install build-essential checkinstall cmake pkg-config yasm

sudo apt-get -y install git gfortran

sudo apt-get -y install libjpeg8-dev libjasper-dev libpng12-dev

sudo apt-get -y install libtiff5-dev

sudo apt-get -y install libtiff-dev

sudo apt-get -y install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev

sudo apt-get -y install libxine2-dev libv4l-dev

cd /usr/include/linux

sudo ln -s -f 。./libv4l1-videodev.h videodev.h

sudo apt-get -y install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev

sudo apt-get -y install libgtk2.0-dev libtbb-dev qt5-default

sudo apt-get -y install libatlas-base-dev

sudo apt-get -y install libmp3lame-dev libtheora-dev

sudo apt-get -y install libvorbis-dev libxvidcore-dev libx264-dev

sudo apt-get -y install libopencore-amrnb-dev libopencore-amrwb-dev

sudo apt-get -y install libavresample-dev

sudo apt-get -y install x264 v4l-utils

sudo apt-get -y install libprotobuf-dev protobuf-compiler

sudo apt-get -y install libgoogle-glog-dev libgflags-dev

sudo apt-get -y install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen

sudo apt-get install libqtgui4

sudo apt-get install libqt4-test

现在我们可以使用

就是这样!我们在Raspberry Pi上安装了OpenCV,准备捕获照片和视频,操作它们并且很酷。

通过打开python解释器并导入opencv来检查是否存在错误:

pip install opencv-contrib-python

步骤5:设置TensorFlow

TensorFlow是由Google开发和维护的机器学习/人工智能框架。它为各种任务的深度学习模型提供了广泛的支持,包括图像中的对象检测,现在在Raspberry Pi上安装相当简单。它在轻微Pi上的轻量级模型的性能大约是每秒1帧,这对于像我们这样的应用来说非常合适。

我们基本上会遵循Edje Electronics的优秀教程,通过以下方式进行修改:更新的TensorFlow发行版:

(cv) pi@raspberrypi:~ $ python

Python 3.5.3 (default, Sep 27 2018, 17:25:39)

[GCC 6.3.0 20170516] on linux

Type “help”, “copyright”, “credits” or “license” for more information.

》》》 import cv2

》》》

现在我们需要编译Google的protobuf。只需按照相同优秀教程的步骤4中的说明进行操作

最后,克隆并设置TensorFlow的模型定义 - 按照Edje Electronics教程中的步骤5进行操作

随意按照步骤中的步骤进行操作同样,它是对Raspberry Pi上物体检测的一个很好的介绍。

步骤6:使用OpenCV进行运动检测

让我们首先测试OpenCV是否可以与我们的网络摄像头连接:ssh进入Raspberry Pi,转移到cv virtualenv(workon cv) ),打开一个python解释器(只需输入python),然后输入以下python命令:

pi@raspberrypi:~ $ workon cv

(cv) pi@raspberrypi:~ $ pip install tensorflow

(cv) pi@raspberrypi:~ $ sudo apt-get install libxml2-dev libxslt-dev

(cv) pi@raspberrypi:~ $ pip install pillow lxml jupyter matplotlib cython

(cv) pi@raspberrypi:~ $ sudo apt-get install python-tk

运气好的话,你会发现OpenCV能够从摄像头读取高清帧。

您可以使用cv2.imwrite(path,frame)将该帧写入磁盘并将其重新扫描以实际查看。

检测运动的策略非常简单:

处理较低分辨率的帧 - 此处无需在全高清上运行

此外,模糊图像以确保尽可能少的噪点。

保持最后N帧的运行平均值。对于此应用,帧速率约为1 FPS(仅因为TensorFlow每帧需要一些时间),我发现N = 60会返回良好的结果。并且由于仔细实现不会占用更多的CPU,而且可以使用更多的帧(它确实需要更多内存 - 但是当我们使用较低分辨率的帧时,这可以忽略不计)

从运行中减去当前图像平均值(只需要小心输入 - 你需要允许正值和负值[-255 。. 255],所以帧需要转换为int)

你可以在灰色上执行减法 - 帧的转换(和平均值),或者为每个RGB通道单独进行转换,然后合并结果(这是我选择的策略,使其对颜色变化敏感)

使用

最后查找具有三角形的区域的轮廓 - 这些区域是运动发生的位置,当前图像与先前图像的平均值不同。如果需要,我们可以进一步找到这些轮廓的边界框。

我已经在DeltaFinder python类中封装了代码来执行此操作,您可以在我的github中找到它

步骤7:使用TensorFlow检测对象

如果您已按照TensorFlow安装程序进行操作,则表明您已经测试过安装了TensorFlow并正常工作。

为了检测一般室外场景中的人,在COCO数据集上预训练的模型表现相当不错 - 这正是我们在TensorFlow安装结束时下载的模型。我们只需要使用它进行推理!

同样,我已经在TFClassify python类中封装了模型加载和推理,以使事情变得更容易,你可以在这里找到。

步骤8:在Raspberry Pi上设置Web服务器

访问对象检测结果的最简单方法是使用Web浏览器,所以让我们来看看在Raspberry Pi上设置Web服务器。然后我们可以将其设置为从给定目录提供图片。

Web服务器框架有多个选项。我选择了Flask。它非常易于配置,并且易于使用Python进行扩展。由于我们需要的“规模”是微不足道的,所以绰绰有余。

我建议将它安装在一个新的virtualenv中,所以:

import cv2

cap = cv2.VideoCapture(0)

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)

cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)

ret, frame = cap.read()

print(‘Read frame size: {}x{}’.format(frame.shape[1], frame.shape[0])

请注意,只要您的浏览器与Raspberry在同一个无线局域网上,只有正常的网络设置才能访问它皮。您可以在Internet路由器上创建端口映射/NAT配置以允许外部访问 - 但我建议不要这样做。我写的代码并不试图提供在允许对Raspberry Pi进行一般Internet访问时所需的安全性。

按照Flask快速入门指南测试您的安装

步骤9:来自Raspberry Pi的移动通知使用IFTTT

我真的希望在事件发生时获得移动通知。在这种情况下,当检测到人并且水位变低时。我发现这样做的最简单方法是使用IFTTT而不必编写自定义移动应用程序。 IFTTT代表“If This Then That”并启用多种类型的事件来触发多种类型的操作。在我们的例子中,我们对IFTTT Maker Webhook触发器感兴趣。这允许我们通过向IFTTT服务器发出HTTP POST请求来触发IFTTT操作,该请求具有分配给我们帐户的特殊密钥,以及指定发生的事件的数据。我们采取的行动就像使用IFTTT移动应用程序在我们的移动设备上创建通知一样简单,或者比这更复杂的任何事情。

以下是如何做到这一点:

在ifttt.com上创建IFTTT帐户

登录后,转到Webhook服务设置页面并在浏览器中输入URL(例如https://maker.ifttt.com/use/。该网页将显示您的密钥和用于触发操作的URL。

创建一个IFTTT小程序,当Webhook被触发时将生成移动通知,其中包含事件的详细信息:

单击“我的小程序”,然后单击“新小程序”。

单击“+ this”并选择“webhooks”。单击“接收Web请求”以继续查看详细信息

为您的活动命名,例如“PoolEvent”并点击“创建触发器”

点击“+ that”并选择“通知”。然后选择“从IFTTT应用程序发送丰富通知”

对于“标题”选择类似“PoolPi”的内容

对于“消息”写“Pool Pi检测到:”并点击“添加成分”。.“Value1”。

返回到您在步骤2中复制的URL。它将显示用于调用新创建的applet的URL。复制该URL,将占位符{event}替换为事件名称(在示例中为PoolEvent)

下载,安装并登录到IFTTT应用程序移动设备

在Raspberry Pi上运行此python脚本以查看它是否正常工作(注意可能需要几秒钟或几分钟才能在您的移动设备上触发):

pi@raspberrypi:~ $ mkvirtualenv webserv

(webserv)pi@raspberrypi: ~ $ pip install Flask

步骤10:向Raspberry Pi添加一个Relay HAT并将其连接到电磁阀

在继续此步骤之前,请关闭Raspberry Pi:ssh并输入“sudo shutdown now”,然后断开电源

我们的目标是打开和关闭电源电磁阀 - 一种阀门,可以根据电源提供的24V交流电源打开或关闭供水。继电器是可以根据我们的Raspberry Pi可提供的数字信号打开或关闭电路的电子元件。我们在这里做的是将继电器连接到Raspberry Pi的这些数字信号引脚,并使其关闭24V AC电源和电磁阀之间的电路。

Raspberry Pi上的引脚可以充当数字输入或输出的称为GPIO - 通用输入/输出,它们是Pi侧面的40个引脚的行。关闭Pi并将继电器HAT牢牢插入其中。我选择的HAT中有3个继电器,我们只使用其中一个。想象一下你可以用其他两个做的所有事情:)

现在重新打开Raspberry Pi。继电器HAT上的红色“电源”LED应该亮起,表示它正从Pi通过GPIO获得电源。让我们测试一下我们可以控制它:再次进入Pi进入Pi,输入python并输入:

import requests

requests.post(‘https://maker.ifttt.com/trigger/PoolEvent/with/key/’, json={“value1”:“Hello Notifications”})

您应该听到一声“咔嗒”声,表示继电器正在使用,并看到一个LED亮起表示第一个继电器处于连接位置。您现在可以输入

import gpiozero

dev = gpiozero.DigitalOutputDevice(26, initial_value = True)

dev.off()

这会将继电器转到“关闭”位置(奇怪,我知道。..。..)和从python退出()。

现在使用跨接电缆和更长的电缆连接24V电源和电磁阀之间的继电器。见图。最后,使用适配器将电磁阀连接到水龙头,并通过重复上述命令准备好测试它们 - 它们应该打开和关闭水。

将软管连接到电磁阀并放入另一端在游泳池深处。您现在有一个计算机控制的池顶关系统,是时候连接传感器告诉它何时运行。

步骤11:连接水位传感器

报警系统

水位传感器只是一个浮子,当浮子是浮子时连接电路向下,当它漂浮时打破它。如果将其插入池中正确的高度,当水位足够时,浮子将上升,但当水量不足时,浮子会下降。

为了让Raspberry Pi了解水位传感器的状态,我们需要Pi来感应开路或闭路。幸运的是,这很简单:我们用作控制继电器的数字输出的相同GPIO连接器可以作为输入(因此GPIO中的I)。具体来说,如果我们将传感器的一根导线连接到GPIO连接器上的+ 3.3V,另一根传感器导线连接到我们配置为下拉输入的引脚(意味着它通常处于GND电压电平),该引脚将测量仅当水位传感器关闭电路时 - 水位低时,才会产生数字“高”或“开”电压。我使用GPIO引脚16作为输入,我在上图中标记了它。

将引脚配置为输入并测试其当前状态的python代码是:

dev.on()

一个潜在的挑战是,当传感器刚刚改变状态时,它将在开启和关闭状态之间快速振荡。解决方案被称为“去抖动”,并在采取行动之前寻找一致的状态变化。 GPIOZERO库有代码可以执行此操作,但由于某些原因,代码对我来说效果不佳。我写了一个简单的循环,当检测到一致的状态变化时触发IFTTT警报,您可以在我的存储库中找到它。

步骤12:编写代码将所有内容绑定在一起

就是这样。我们的设置已经完成。您可以编写自己的代码将事物组合到一个完整的系统中,或者使用我提供的代码。要做到这一点,只需创建目录结构并克隆存储库,如下所示:

import gpiozero

level_input = gpiozero.Button(16)

water_low = level_input.is_pressed

接下来,编辑motion_alert和water_level目录中名为ifttt_url.txt的文件,以获得您自己的URL使用您的密钥进行IFTTT Web挂钩。您可以使用两个不同的Web挂钩进行不同的操作。

最后,我们希望此代码自动运行。实现这一目标的最简单方法是通过Linux crontab服务。我们可以为两个主要任务添加一些crontab行:

运行我们的三个程序:每次重启时对象检测器,水位传感器和Web服务器

清理输出目录,删除旧图片和旧视频文件(我选择删除文件超过1天且超过7天的图片 - 随意进行实验)

要执行此类型的crontab -e,它将打开您的纳米文本编辑器。将以下行添加到文件的底部:

mkdir poolpi

cd poolpi

git clone https://github.com/rafitzadik/PoolPiGuy.git

最后,重新启动Raspberry Pi。它现在已准备好让您的游泳池充满安全。

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

全部0条评论

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

×
20
完善资料,
赚取积分