智能安全摄像头:使用 Intel® IoT 网关的 POC
本文旨在通过利用 Intel® IoT 网关的计算能力,快速原型化一款边缘分析解决方案,从而打造一款更智能的安全摄像头。
获取新的 Intel® IoT 开发套件,这是一个完整的软硬件解决方案,让开发者能够使用 Intel® Galileo 和 Intel® Edison 开发板创建令人兴奋的新解决方案。请访问 Intel® 物联网开发者专区。
引言
物联网 (IoT) 正在以新颖有趣的方式改变我们的生活,但随之而来的是分析和理解海量连续生成数据的挑战。家庭中的一种物联网趋势是使用多个安全摄像头进行监控,这会产生大量由图像和视频生成的数据。例如,一户人家有十二个摄像头,每天拍摄 180,000 张照片,很容易产生 5 GB 的数据。这些大量的数据使得手动分析变得不切实际。一些摄像头内置了运动传感器,只在检测到变化时才拍照,虽然这有助于减少数据量,但光线变化和其他不重要的移动仍会被捕捉到,需要进行筛选。为了监控家中真正需要关注的内容,OpenCV* 提供了一个有前景的解决方案。在本文中,我们关注的是人脸和人。OpenCV 已经有许多预定义的算法可以搜索图像中的人脸、人和物体,并且还可以通过训练来识别新的对象。
本文旨在通过利用 Intel® IoT 网关的计算能力,快速原型化一款边缘分析解决方案,从而打造一款更智能的安全摄像头。
设置
该项目始于一个 Logitech* C270 摄像头,具有 HD 720P 分辨率和 2.4 GHz Intel® Core™ 2 Duo 处理器。摄像头连接到 Intel® Edison 开发板的 USB 端口,将其变成一个 IP 摄像头,向网站流式传输视频。使用摄像头与 Intel® Edison 开发板结合,可以轻松地将摄像头“传感器”部署到房屋的不同位置。Intel® IoT 网关从流中捕获图像,并使用 OpenCV 对其进行分析。如果算法检测到有脸部或人出现在视野中,它会将图像上传到 Twitter*。
捕获图像
为了确保摄像头与 Intel® Edison USB 驱动程序兼容,摄像头必须符合 USB 视频类 (UVC) 标准。在本例中,使用的是 Logitech C270 摄像头。UVC 兼容设备列表请访问:http://www.ideasonboard.org/uvc/#devices。要使用 USB 插槽,必须将 Intel® Edison 开发板上的微动开关向上拨向 USB 插槽。请注意,这将禁用其下方的 micro-USB 接口,并禁用以太网、电源(现在必须插入外部电源,而不是使用 micro-USB 插槽作为电源)和 Arduino* 草图上传。将 Intel® Edison 开发板连接到网关的 Wi-Fi* 热点,以确保其能够看到摄像头。
要检查 USB 摄像头是否正常工作,请在串行连接中输入以下命令。
ls -l /dev/video0
应该会出现类似此行的输出
crw-rw---- 1 root video 81, 0 May 6 22:36 /dev/video0
否则,将出现此行,表明未找到摄像头。
ls: cannot access /dev/video0: No such file or directory
在项目的早期阶段,Intel® Edison 开发板使用 FFMEG 库捕获图像,然后通过 MQTT 发送到网关。这种方法存在缺点,因为每张图像需要几秒钟才能保存,这对于实际应用来说速度太慢。为了解决这个问题并按需准备图像供网关使用,该设置已更改为让 Intel® Edison 开发板持续流式传输一个供网关随时捕获的视频流。这通过 mjpeg-streamer 库实现。要在 Intel® Edison 开发板上安装它,请在 base-feeds.conf 文件中添加以下行,并使用以下命令
echo "src/gz all http://repo.opkg.net/edison/repo/all src/gz edison http://repo.opkg.net/edison/repo/edison src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32" >> /etc/opkg/base-feeds.conf
更新存储库索引
opkg update
然后安装
opkg install mjpg-streamer
启动流
mjpg_streamer -i "input_uvc.so -n -f 30 -r 800x600" -o "output_http.so -p 8080 -w ./www"
本项目使用了 MJPEG 压缩格式以保持高帧率。然而,YUV 格式是未压缩的,可以为 OpenCV 提供更多细节。尝试权衡以确定哪种格式最适合。
要在同一 Wi-Fi 网络上查看流,请访问:https://:8080/?action=stream。还可以通过访问:https://:8080/?action=snapshot 来查看流的静态图像。将 localhost 替换为应连接到网关 Wi-Fi 的 Intel® Edison 开发板的 IP 地址。Intel® IoT 网关发送一个 http 请求到快照地址,然后将图像保存到磁盘。
网关
整个安全摄像头的“大脑”位于网关上。OpenCV 安装在一个虚拟 Python* 环境中,以创建一个干净、隔离的环境,避免与网关的 Python 版本和软件包发生冲突。可以在此处找到 OpenCV Linux 的基本安装说明:https://docs.opencv.ac.cn/2.4/doc/tutorials/introduction/linux_install/linux_install.html。需要修改这些说明才能在 Intel® Wind River* 网关上安装 OpenCV 及其依赖项。
GCC、Git 和 python2.7-dev 已安装。
安装 CMake 2.6 或更高版本
wget http://www.cmake.org/files/v3.2/cmake-3.2.2.tar.gz tar xf cmake-3.2.2.tar.gz cd cmake-3.2.2 ./configure make make install
由于 Wind River Linux* 环境没有 apt-get 命令,安装所需的开发包可能会很困难。一种解决方法是首先在另一台 64 位 Linux* 机器(在本例中为 Ubuntu*)上安装它们,然后手动将文件复制到网关。完整的文件列表可以在 Ubuntu 网站上找到:http://packages.ubuntu.com/。例如,对于 libtiff4-dev 包,/usr/include/<file> 中的文件应复制到网关上的相同位置,而 /usr/lib/x86_64-linux-gnu/<file> 中的文件应复制到 /usr/lib/<file>。完整的文件列表可以在此处找到:http://packages.ubuntu.com/precise/amd64/libtiff4-dev/filelist。
安装并复制下面列出的软件包的文件。
sudo apt-get install libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install libjpeg8-dev libpng12-dev libtiff4-dev libjasper-dev libv4l-dev
安装 pip,这将有助于安装许多其他依赖项。
wget https://bootstrap.pypa.io/get-pip.py python get-pip.py
安装 virtualenv,这将为 OpenCV 创建一个单独的环境。
pip install virtualenv virtualenvwrapper
安装 virtualenv 后,创建一个名为“cv”的环境。
export WORKON_HOME=$HOME/.virtualenvs mkvirtualenv cv
请注意,以下所有步骤都将在“cv”环境激活时执行。创建“cv”后,它会在当前会话中自动激活该环境。这可以在命令提示符的开头看到,例如 (cv) root@WR-IDP-NAME。对于将来的会话,可以使用以下命令激活
. ~/.virtualenvs/cv/bin/activate
同样,可以使用此命令停用(暂时不要停用)
deactivate
安装 numpy
pip install numpy
获取 OpenCV 源代码
cd ~ git clone https://github.com/Itseez/opencv.git cd opencv git checkout 3.0.0
然后编译它
mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_C_EXAMPLES=ON \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ -D BUILD_EXAMPLES=ON \ -D PYTHON_INCLUDE_DIR=/usr/include/python2.7/ \ -D PYTHON_INCLUDE_DIR2=/usr/include/python2.7 \ -D PYTHON_LIBRARY=/usr/lib64/libpython2.7.so \ -D PYTHON_PACKAGES_PATH=/usr/lib64/python2.7/site-packages/ \ -D BUILD_NEW_PYTHON_SUPPORT=ON \ -D PYTHON2_LIBRARY=/usr/lib64/libpython2.7.so \ -D BUILD_opencv_python3=OFF \ -D BUILD_opencv_python2=ON ..
如果未创建 cv2.so 文件,请同时在主机 Linux 机器上编译 OpenCV,并将该文件复制到 /usr/lib64/python2.7/site-packages。
为了快速创建程序并将大量功能和服务连接在一起,本项目使用了 Node-RED*。Node-RED 是一个快速原型化工具,允许用户通过可视化方式将硬件设备、API 和各种服务连接起来。它也预装在网关上。请确保更新到最新版本。
一旦在“Start”节点(通过单击它)中注入消息,脚本将在处理完图像或遇到错误后持续循环。对于该设置,有几个值得注意的节点:http 请求、python 脚本和用于 tweet 的函数消息。“Repeat”节点用于将三个流的重复流程在视觉上简化为一个节点,而不是将它们全部指向开始。
“http request”节点向 IP 摄像头的快照 URL 发送一个 GET 请求。如果成功,流程将保存图像。否则,它将发送一条关于摄像头的错误消息到 Twitter。
要运行 python 脚本,请从高级部分创建一个“exec”节点,命令为“/root/.virtualenvs/cv/bin/python2.7 /root/PeopleDetection.py”。这允许脚本在安装了 OpenCV 的虚拟 python 环境中运行。
python 脚本本身很简单。它使用 HOG 算法检查图像中是否存在人员,然后使用随 OpenCV 一起安装的 haarcasade frontal face alt 算法来检测人脸。它还会保存一张图像,并在检测到的人员和人脸周围绘制框。提供的代码并未针对我们的概念验证进行优化,除了在分析之前选择性地缩小图像尺寸以及调整一些算法输入以适应我们的需求。网关处理图像大约需要 0.33 秒。相比之下,Intel® Edison 模块处理同一图像大约需要 10 秒。根据摄像头的位置,以及预期的拍摄距离,可能需要更改 OpenCV 算法参数以更好地适应实际情况。
import numpy as np import cv2 import sys import datetime def draw_detections(img, rects, rects2, thickness = 2): for x, y, w, h in rects: pad_w, pad_h = int(0.15*w), int(0.05*h) cv2.rectangle(img, (x+pad_w, y+pad_h), (x+w-pad_w, y+h-pad_h), (0, 255, 0), thickness) print("Person Detected") for (x,y,w,h) in rects2: cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),thickness) print("Face Detected") total = datetime.datetime.now() img = cv2.imread('/root/incoming.jpg') #optional resize of image to make processing faster #img = cv2.resize(img, (0,0), fx=0.5, fy=0.5) hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) peopleFound,a=hog.detectMultiScale(img, winStride=(8,8), padding=(16,16), scale=1.3) faceCascade = cv2.CascadeClassifier('/root/haarcascade_frontalface_alt.xml') facesFound = faceCascade.detectMultiScale(img,scaleFactor=1.1,minNeighbors=5,minSize=(30,30), flags = cv2.CASCADE_SCALE_IMAGE) draw_detections(img,peopleFound,facesFound) cv2.imwrite('/root/out_faceandpeople.jpg',img) print("[INFO] total took: {}s".format( (datetime.datetime.now() - total).total_seconds()))
要将图像发送到 Twitter,在函数节点中使用 msg.media 作为图像变量,msg.payload 作为推文字符串来构建推文。
系统也可以按需拍照。Node-RED 监控相同的 Twitter feed,查找包含“spy”或“Spy”的帖子,并将当前照片发布到 Twitter。发布包含“spy”一词的推文将触发网关拍照。
摘要
至此,关于使用 Intel® IoT 网关计算能力打造更智能安全摄像头的概念验证就结束了。Wind River Linux 网关预装了许多现成的工具,可以快速进行原型开发。在此基础上,该项目可以进一步优化,通过安全功能使其更加健壮,甚至可以扩展到当检测到有人时创建智能照明。
作者简介
Whitney Foster 是 Intel 软件解决方案组的一名软件工程师,致力于物联网的规模化赋能项目。
注意事项
本文档不授予任何知识产权的许可(明示或暗示,禁止反言或以其他方式)。
Intel 对所有明示和暗示的保修不承担任何责任,包括但不限于适销性、特定用途的适用性和非侵权性的暗示保修,以及由履行过程、交易过程或商业用途产生的任何保修。
本文档包含正在开发的产品、服务和/或流程的信息。此处提供的所有信息如有变更,恕不另行通知。请联系您的 Intel 代表以获取最新的预测、计划、规格和路线图。
所描述的产品和服务可能包含称为勘误的缺陷或错误,这可能导致与公布的规格不符。当前的已特性化勘误可应要求提供。
如有订单号并在此文件中引用的文档副本,可通过致电 1-800-548-4725 或访问 www.intel.com/design/literature.htm 获取。
Intel、Wind River、Intel 标志和 Intel RealSense 是 Intel Corporation 在美国和/或其他国家的商标。
*其他名称和品牌可能被声明为他方财产
© 2016 Intel Corporation