电子说
第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。它现在已准备好让您的游泳池充满安全。
全部0条评论
快来发表一下你的评论吧 !