0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

454398 来源:wv 2019-09-03 16:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

第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。它现在已准备好让您的游泳池充满安全。

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

    关注

    5

    文章

    656

    浏览量

    76876
  • 树莓派
    +关注

    关注

    122

    文章

    2069

    浏览量

    109682
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于树莓(RaspberryPi)构建高效实时监控系统

    由于树莓体积小、可开发性强等特性,常被用于视频监控场景中,结合 ZeroNews,可实现用户在任意位置都能实时安全得访问视频监控系统。 先决条件:树莓
    的头像 发表于 09-22 15:14 855次阅读
    基于<b class='flag-5'>树莓</b><b class='flag-5'>派</b>(RaspberryPi)构建高效实时监控<b class='flag-5'>系统</b>

    零成本钢铁侠手套!树莓+OpenCV 秒变手势遥控器!

    大家好,这是一个树莓和OpenCV的连载专题。使用树莓与OpenCV实现姿态估计和面部特征点追踪使用树莓
    的头像 发表于 08-16 16:16 882次阅读
    零成本钢铁侠手套!<b class='flag-5'>树莓</b><b class='flag-5'>派</b>+OpenCV 秒变手势遥控器!

    如何使用树莓与OpenCV实现面部和运动追踪的云台系统

    大家好,这是一个树莓和OpenCV的连载专题。使用树莓与OpenCV实现姿态估计和面部特征点追踪使用树莓
    的头像 发表于 08-14 17:45 957次阅读
    如何使用<b class='flag-5'>树莓</b><b class='flag-5'>派</b>与OpenCV实现面部和运动追踪的云台<b class='flag-5'>系统</b>?

    树莓屏幕怎么选?

    树莓很多人都用过,但用屏幕的倒不是很多。不少都是直接远程操作,或者直接接身边的显示设备了。但我觉得给开发板配一个屏幕还是很能提升使用体验的。这次我就介绍一下树莓的屏幕怎么选择。
    的头像 发表于 08-08 14:59 1058次阅读
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b>屏幕怎么选?

    树莓操作系统:版本、特性及设置完整指南!

    树莓操作系统是什么?树莓操作系统是由树莓
    的头像 发表于 07-28 18:26 821次阅读
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b>操作<b class='flag-5'>系统</b>:版本、特性及设置完整指南!

    如何在树莓 AI HAT+上进行YOLO姿态估计?

    大家好,接下来会为大家开一个树莓5和YOLO的连载专题。内容包括四个部分:在树莓5上使用YOLO进行物体和动物识别-入门指南在树莓
    的头像 发表于 07-20 20:34 609次阅读
    如何在<b class='flag-5'>树莓</b><b class='flag-5'>派</b> <b class='flag-5'>AI</b> HAT+上进行YOLO姿态估计?

    如何在树莓 AI HAT+上进行YOLO目标检测?

    大家好,接下来会为大家开一个树莓5和YOLO的连载专题。内容包括四个部分:在树莓5上使用YOLO进行物体和动物识别-入门指南在树莓
    的头像 发表于 07-19 08:34 1189次阅读
    如何在<b class='flag-5'>树莓</b><b class='flag-5'>派</b> <b class='flag-5'>AI</b> HAT+上进行YOLO目标检测?

    树莓6 传闻:发布日期与规格!

    每当我想再为我的收藏增添一款树莓时,总会在是立即购买还是等待硬件更强大的下一代之间犹豫不决。但新树莓型号的发布往往容易被错过,尤其是在你的信息流被病毒式传播的猫咪视频占据时。因此,
    的头像 发表于 07-11 16:21 1340次阅读
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b>6 传闻:发布日期与规格!

    树莓小技巧:无需键盘或显示器,如何通过WiFi设置树莓

    树莓是一款小巧便携的USB供电计算机,可以隐藏起来用于小型项目,如网络服务器或家庭自动化。通常,设置树莓需要键盘和显示器来编辑和查看树莓
    的头像 发表于 06-26 15:41 1043次阅读
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b>小技巧:无需键盘或显示器,如何通过WiFi设置<b class='flag-5'>树莓</b><b class='flag-5'>派</b>?

    树莓分类器:用树莓识别不同型号的树莓

    在本教程系列的第一部分中,您将学习如何使用树莓AI摄像头来检测不同的树莓型号。本系列由DavidPlowman创建,他是
    的头像 发表于 06-13 16:39 983次阅读
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b>分类器:用<b class='flag-5'>树莓</b><b class='flag-5'>派</b>识别不同型号的<b class='flag-5'>树莓</b><b class='flag-5'>派</b>!

    树莓“吉尼斯世界记录”:将树莓的性能发挥到极致的项目!

    树莓是一款功能强大、体积小巧且高度可定制的设备,多年来,我们见证了它被应用于众多领域。无论是将其装入3D打印的经典游戏机外壳,还是简单地将它隐藏起来作为家庭文件服务器,我们都报道过在社区里用树莓
    的头像 发表于 05-22 16:53 1199次阅读
    <b class='flag-5'>树莓</b><b class='flag-5'>派</b>“吉尼斯世界记录”:将<b class='flag-5'>树莓</b><b class='flag-5'>派</b>的性能发挥到极致的项目!

    能够精准定位的树莓机器人!

    我为我的自制机器人BigRob(同样由树莓驱动)配备了基于树莓的精准GPS导航系统。本项目所
    的头像 发表于 05-17 08:33 840次阅读
    能够精准定位的<b class='flag-5'>树莓</b><b class='flag-5'>派</b>机器人!

    树莓 Zero 打造的智能漫游车!

    使用PXFMini和树莓Zero打造您自己的自主漫游车。本项目所用组件硬件组件ErleRoboticsPXFmini×1树莓Zero×1树莓
    的头像 发表于 05-13 16:39 866次阅读
    用 <b class='flag-5'>树莓</b><b class='flag-5'>派</b> Zero 打造的智能漫游车!

    超酷的树莓智能镜项目,快来了解!

    ,这些树莓智能镜项目都非常值得一看。制作一个能够显示实时天气、新闻、旅行信息等内容的魔镜是一个热门项目。学习如何使用RaspberryPi单板计算机以极低的成本制作
    的头像 发表于 03-25 09:33 1256次阅读
    超酷的<b class='flag-5'>树莓</b><b class='flag-5'>派</b>智能镜项目,快来了解!

    deepin 23+树莓让小车动起来

    deepin 23 +树莓还有啥新玩法?     前言 继我们之前发布的树莓运行 deepin 23 系统教程后,此次我们将深入探索如何
    的头像 发表于 02-12 09:12 1323次阅读
    deepin 23+<b class='flag-5'>树莓</b><b class='flag-5'>派</b>让小车动起来