第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。它现在已准备好让您的游泳池充满安全。
华米科技发布了2020年第三季度财报
广和通联合业界伙伴发布多项最新研发成果
什么是MIL认证电线?MIL认证电线的用途
小米智能生活样板间 展现未来生活的可能性
无铅锡膏要多少钱?价格高吗?
使用树莓派的AI驱动报警系统的制作
Matlab古典控制系统设计—Bode图法
oppor11什么时候上市,下半年与OPPOR11 plus同时登场
污水源PH电导率传感器在线监测有哪些厂家?
手机摄像头性能测试方案以及弹片微针模组的作用
你知道吗?中国区块链第一城竟然是杭州!
简仪科技同步数据采集模块概述
现代和起亚推出VR设计评估系统 大幅度改进了车辆开发流程
探索空调技术:截止阀焊接时需要降温吗?
谁说2017尼康没新品?尼康已经做好准备 尼康D820/850或将月底发布
如何使用C++语法中的volatile
智能手机市场格局突变 中国IC产业将迎新机遇
物联网盛事为何由正泰发起?
Altera和Eutecus发布基于FPGA的视频分析解决方案
如何实现简单的隔离偏置电源的设计?