参与:熊猫
圣诞节即将来临,您可能在商场、公园或烟囱里见过圣诞老人。 随着机器识别技术的发展,利用人工智能来识别路过或送礼物的圣诞老人似乎是一个不错的选择。 近日,Adrian Rosebrock 在 PyImageSearch 上发布了一篇教程,介绍了在 Raspberry Pi 上使用 Keras 实现深度学习圣诞老人识别器的过程。 您可以通过文末链接访问原文——也可以在原文末尾留下您的邮箱地址,向原作者索取本项目的完整代码。 此外,本教程还提到了许多其他相关教程和项目。 为了更方便阅读,机器之心缩短了这些链接。
在我写的 PyImageSearch 教程中,这个是最有趣的! 涉及的内容包括:
为了不辜负这个圣诞节假期,我在这里介绍一下如何将使用Keras训练的深度学习模型部署到树莓派上。
但这不仅仅是任何机器学习模型……
该图像分类器专门设计用于检测视频流中圣诞老人的存在。
如果我们确实检测到圣诞老人…
好吧,我暂时不会剧透(但它确实与 3D 圣诞树和欢快的曲调有关)。
请享受本教程,下载代码并自行实现!
最重要的是:玩得开心!
在 Raspberry Pi 上使用 Keras 进行深度学习
本文将完整介绍使用Keras在Raspberry Pi上运行深度神经网络的过程。 该项目的目标是实现一个可以具体演示并让我们玩得开心的 Not Santa 探测器。
在本文的第一部分,我们将讨论什么是 Not Santa 探测器(因为您可能不知道 HBO 的《硅谷》电视剧中的 Not Hotdog 探测器,它吸引了很多人)。
然后,我们将配置 Raspberry Pi 来执行深度学习任务 – 我们将安装 TensorFlow、Keras 和其他一些必要的软件包和库。
在我们的 Raspberry Pi 准备好进行深度学习后,我们将创建一个 Python 脚本:
1.从磁盘加载我们的 Keras 模型
2. 访问我们的 Raspberry Pi 相机模块/USB 网络摄像头
3. 应用深度学习检测视频帧中圣诞老人的存在
4. 如果圣诞老人存在,访问我们的 GPIO 引脚并播放音乐
这是我最喜欢在 PyImageSearch 上写的文章类型,因为它汇集了许多不同的技术。 本文涵盖:
那么我们就开始吧!
什么是非圣诞老人探测器?
图 1:《硅谷》电视剧中的非 Hotdog 检测器应用
Not Santa 探测器的灵感来自 HBO 剧集《硅谷》,其中一个角色创建了一款智能手机应用程序,可以检测输入图像是“热狗”还是“不是热狗”。
这个节目明显是在利用美国硅谷的创业文化来制造笑话,其中包括:
1.炒作机器学习/深度学习概念
2. 具有讽刺意味的是,他们重做了大量没有什么作用的智能应用程序(但它们的创建者相信他们的应用程序将“改变世界”)。
我决定自己也找点乐子。
今天,我们将创建一个非圣诞老人检测器,可以检测图像或视频帧中圣诞老人的存在。
如果你不知道圣诞老人是什么,这里有一个简单的介绍。 他是一个快乐、胖乎乎、白胡子的虚构西方文化人物,在平安夜睡觉时给孩子们带来礼物。
但这个应用程序不仅仅是为了娱乐或讽刺!
在这个过程中我们可以学到很多实用技能,包括:
1. 如何配置 Raspberry Pi 来执行深度学习任务
2. 在 Raspberry Pi 上安装 Keras 和 TensorFlow
3. 在 Raspberry Pi 上部署之前训练过的卷积神经网络(使用 Keras)
4. 当检测到正例时执行给定的动作
但在深入研究代码之前,让我们先看一下我们需要的硬件。
需要什么硬件?
图 2:Not Santa 探测器硬件包括 Raspberry Pi 3、扬声器、3D 圣诞树和网络摄像头(未显示)。 这个Raspberry Pi使用LeNet的Python脚本,用Keras实现,可以检测圣诞老人。
如果您要遵循本教程(不做任何更改),您将需要:
当然,您不需要所有这些组件。
实际上,只需拥有一个 Raspberry Pi 和一个相机模块/USB 网络摄像头就足够了(但是您需要修改代码,以便它不会尝试访问 GPIO 引脚或通过扬声器播放音乐)。
您的设置应该与我的类似,如上面的图 2 所示,扬声器、3D 圣诞树和网络摄像头已连接(但您在图片中看不到它,因为它不在相机之外)。
我还建议连接 HDMI 显示器和键盘来测试和调试脚本。
图 3:我的深度学习设置由 Raspberry Pi 及其组件、键盘、鼠标和小型 HDMI 显示器组成。 使用此配置,我们一定会看到圣诞老人在我的圣诞树前送礼物。
您可以在上图中看到我的 Raspberry Pi、HDMI 显示器、键盘和圣诞动物朋友,他们在我学习本教程时一直陪伴在我身边。
如何在树莓派上安装TensorFlow和Keras?
图 4:我们将在 Raspberry Pi 上使用带有 TensorFlow 后端的 Keras 来实现深度学习 Not Santa 检测器
我们之前介绍过如何使用Keras训练一个可以识别输入图像中是否有圣诞老人的卷积神经网络,参见:
这里我们将之前训练好的模型部署到Raspberry Pi上。
我之前提到过,Raspberry Pi 不适合训练神经网络(简单的试用案例除外)。 但神经网络训练完成后,我们就可以使用Raspberry Pi来部署它(当然,模型必须足够小,以适合Raspberry Pi的内存)。
我假设您的 Raspberry Pi 上已经安装了 OpenCV。 如果你的树莓派上还没有安装OpenCV,可以参考这个教程:。 在其中,我演示了如何优化 Raspberry Pi + OpenCV 安装以提高速度(可以实现 30% 的性能提升)。
注意:本教程不适用于 Python 3 – 您应该使用 Python 2.7。 稍后我会解释原因。 现在您可以使用 Python 2.7 和 OpenCV 配置 Raspberry Pi。 在Raspberry Pi + OpenCV安装指南的第4步中,一定要更改为-p python2来创建虚拟环境。
现在,我建议您增加树莓派的交换空间。 增加交换区可以让您使用Raspberry Pi SD卡来增加内存(当您想在内存有限的Raspberry Pi上编译和安装大型库时,此步骤至关重要)。
要增加交换空间,请首先打开 /etc/dphys-swapfile,然后编辑 CONF_SWAPSIZE 变量:
# set size to absolute value, leaving empty (default) then uses computed value
# you most likely don't want this, unless you have a special disk situation
# CONF_SWAPSIZE=100
CONF_SWAPSIZE=1024
请注意,我将交换空间从 100MB 增加到 1024MB。
现在,重新启动交换服务:
$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start
注意:增加交换大小可能会损坏您的存储卡,因此完成后请务必撤消此更改并重新启动交换服务。 有关大交换损坏存储卡的信息,请参阅:
现在您的交换空间已经增加,是时候配置开发环境了。
首先,使用Python 2.7创建一个名为not_santa的虚拟环境(我会在安装TensorFlow时解释使用Python 2.7的原因):
$ mkvirtualenv not_santa -p python2
注意这里的-p指向的是python2,表示这个虚拟环境将使用Python 2.7。
如果您不熟悉 Python 虚拟环境、它们如何工作以及我们为什么使用它们,请参阅这两个链接:和
您还需要确保已将 cv2.so 捆绑包符号链接到 not_santa 虚拟环境中(如果还没有):
$ cd ~/.virtualenvs/not_santa/lib/python2.7/site-packages
$ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv2.so
另外,请确保您已使用 Python 2.7 包编译了 OpenCV。 您还需要仔细检查 cv2.so 文件的路径,以防您的安装路径与我的不同。
如果您已经编译了 Python 3 + OpenCV 并创建了符号链接,然后尝试将 cv2 导入到您的 Python shell 中,您将收到一个令人困惑的回溯,指出导入失败。
重要提示:对于接下来的几个 pip 命令,请确保您处于 not_santa 环境(或您选择的 Python 环境)中,否则您需要将这些包安装到 Raspberry Pi 的系统 Python 中。
要进入此环境,只需在 bash 提示符下使用 workon 命令:
$ workon not_santa
然后,您将看到“(not_santa)”出现在 bash 提示符的开头。
使用以下命令确保您已在 not_santa 环境中安装了 NumPy:
$ pip install numpy
因为这个项目需要访问 GPIO 引脚,所以我们需要安装 RPi.GPIO 和 gpiozero:
$ sudo pip install RPi.GPIO gpiozero
现在在您的 Raspberry Pi 上安装 TensorFlow
有一个问题:没有合适的 TensorFlow 官方(Google 发布)版本。
我们可以从头开始为Raspberry Pi编译TensorFlow,但是这个过程非常漫长、麻烦和痛苦。 请参阅:
或者我们也可以使用 Sam Abrahams 创建的预编译二进制文件,GitHub 地址:
但问题是只有两个预编译的 TensorFlow 二进制文件:
1.对于Python 2.7
2.对于Python 3.4
Raspbian Stretch 发行版(撰写本文时 Raspbian 操作系统的最新版本)使用 Python 3.5 – 因此存在版本不匹配的情况。
为了避免Python 3.4和Python 3.5之间的麻烦,我决定使用Python 2.7。
虽然我希望在本教程中使用 Python 3,但安装过程会更加复杂(并且由于本教程不专注于安装,因此我决定让任务变得更容易一些)。
让我们使用以下命令使用 Python 2.7 安装 TensorFlow:
$ wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v1.1.0/tensorflow-1.1.0-cp27-none-linux_armv7l.whl
$ pip install tensorflow-1.1.0-cp27-none-linux_armv7l.whl
注意:上面代码中的URL较长,请注意识别。
编译并安装 TensorFlow 后(在我的 Raspberry Pi 上大约花了一个小时),需要安装 HDF5 和 h5py。 这些库允许我们从磁盘加载之前训练的模型:
$ sudo apt-get install libhdf5-serial-dev
$ pip install h5py
我安装HDF5和h5py时没有运行time命令,所以我不记得安装它们花了多长时间,我猜大约是30-45分钟。
最后,让我们安装 Keras 和该项目所需的其他软件包:
$ pip install pillow imutils
$ pip install scipy --no-cache-dir
$ pip install keras
SciPy 需要几个小时才能安装,因此您可以在工作时或晚上安装。
要测试您的配置,请在 not_santa 环境中打开 Python shell 并执行以下命令:
$ workon not_santa
$ python
>>> import h5py
>>> from gpiozero import LEDBoard
>>> from gpiozero.tools import random_values
>>> import cv2
>>> import imutils
>>> import keras
Using TesnsorFlow backend.
>>> print("OpenCV version: {}".format(cv2.__version__))
'3.3.1'
>>> print("Keras version: {}".format(keras.__version__))
'2.0.8'
>>> exit()
如果一切顺利,您应该会看到 Keras 与 TensorFlow 后端一起导入。
如上面的输出所示,您应该仔细检查您的 OpenCV 包 (cv2) 是否可以导入。
最后,不要忘记将交换大小从 1024MB 更改回 100MB。 步骤是:
1.打开/etc/dphys-swap文件
2. 将 CONF_SWAPSIZE 重置为 100MB
3. 重新启动交换服务(如我们前面所说)。
如前所述,将交换大小更改回 100MB 将有利于存储卡的使用寿命。 如果跳过此步骤,您可能会遇到内存损坏问题,并且卡的使用寿命将会缩短。
在 Raspberry Pi 上运行 Keras 深度学习模型
图 5:使用 Keras 和 Python 在 Raspberry Pi 上运行深度学习模型
现在我们可以开始使用 Keras、TensorFlow 和 Raspberry Pi 编写 Not Santa 检测器。
再次,我将假设您的硬件配置与我的相同(即 3D 圣诞树和扬声器),因此如果您的硬件配置不同,您需要自己编写或修改下面的代码。
首先,创建一个新文件,将其命名为 not_santa_detector.py,并粘贴以下代码:
代码的第 2-12 行处理我们的导入。 需要解释的是:
为此,我们将定义一个用于照亮 3D 圣诞树的函数:
我们的 light_tree 函数接受一个树参数(这应该是一个 LEDBoard 对象)。
首先,我们循环遍历树中的所有 LED,并随机点亮每个 LED 以创建闪烁效果(第 17-19 行)。
我们让灯亮一段时间(第 23 行),然后再次循环 LED,这次将它们关闭(第 26-28 行)。
3D圣诞树灯光效果如下:
图6:Raspberry Pi控制的3D圣诞树
我们的下一个函数将在检测到圣诞老人时播放音乐:
在 play_christmas_music 函数中,我们对 aplay 命令进行系统调用,该命令允许我们从命令行播放音乐文件。
使用 os.system 调用需要一些工作,但通过纯 Python(使用 Pygame 之类的库)播放音频文件对于这个项目来说是大材小用。
因此,让我们对将使用的配置进行硬编码:
第 38 行和第 39 行硬编码了我们经过训练的 Keras 模型和音频文件的路径。
我们还初始化了用于检测的参数,包括 TOTAL_CONSEC 和 TOTAL_THRESH。 这两个值分别代表包含圣诞老人的帧数以及我们播放音乐和打开圣诞树灯的阈值。 (第 43 和 44 行)
最终的初始化是SANTA = False,它是一个布尔值(第47行)。 稍后我们将在脚本中使用 SANTA 变量作为状态标志来辅助我们的逻辑。
接下来,我们加载之前训练的 Keras 模型并初始化我们的圣诞树:
Keras 允许我们保存模型以供以后使用。 在本教程中,我们将 Not Santa 模型保存到磁盘,现在我们将其加载到 Raspberry Pi 上。 我们在第 51 行使用 Keras 的 load_model 函数加载模型。
我们的树对象在第 54 行实例化。如您所见,树是 gpiozero 包中的 LEDBoard 对象。
现在我们初始化视频流:
要访问摄像头,我们使用 imutils 包中的 VideoStream(第 58 或 59 行),请参阅文档:
重要提示:如果您使用 PiCamera 模块(而不是 USB 摄像头),只需注释掉第 58 行并取消注释第 59 行。
我们休眠 2 秒,以便在开始循环之前在帧之间预热相机(第 60 行):
在第 63 行,我们开始循环视频帧,直到满足停止条件(在脚本后面给出)。
首先,我们通过调用 vs.read 来抓取帧(第 66 行)。
然后我们将框架大小调整为 width=400,保持原始的宽高比(第 67 行)。 我们将在将帧发送到我们的神经网络模型之前对其进行预处理。 然后,我们将在屏幕上显示框架以及文本标签。
因此,让我们对图像进行预处理并将其传递给 Keras 深度学习模型进行预测:
第 70-73 行对图像进行预处理并为分类做好准备。 有关深度学习预处理的更多信息,请参考我的最新著作《Deep Learning for Computer Vision with Python》:
然后,我们使用图像作为参数查询 model.predict。 这会将图像发送到神经网络并返回包含类概率的元组(第 77 行)。
我们将标签初始化为“Not Santa”(稍后我们将访问该标签),并将其概率 proba 初始化为 notSanta 的值(第 78 和 79 行)。
让我们看看图像中是否有圣诞老人:
第 83 行检查圣诞老人的概率是否大于非圣诞老人的概率。 如果它确实更大,我们继续更新标签和概率,之后 TOTAL_CONSEC 递增(第 85-90 行)。
当足够多的圣诞老人连续帧过去后,我们需要触发圣诞老人警报:
如果 SANTA 为 False 并且达到 TOTAL_CONSEC,则执行两个操作:
1. 创建并启动一个treeThread来闪烁圣诞树灯(第98-100行);
2. 创建并启动musicThread来播放背景音乐(第103-106行)。
这些线程独立运行,不会阻塞脚本的向前执行(即非阻塞操作)。
您还可以看到我们在第 95 行将 SANTA 状态标志设置为 True,表明我们在此输入帧中找到了圣诞老人。 在下一次循环中,我们将检查该值,如第 93 行所示。
否则(SANTA 为 True 或尚未达到 TOTAL_THRESH),则我们将 TOTAL_CONSEC 重置为零,并将 SANTA 重置为 False:
最后,我们在屏幕上显示带有生成的文本标签的框架:
概率值也附在带有“圣诞老人”或“不是圣诞老人”的标签上(第115行)。
然后我们可以使用 OpenCV 的 cv2.putText 在框架上写一个标签(以圣诞节为主题的绿色),然后我们在屏幕上显示框架(第 116-120 行)。
无限 while 循环的退出条件是按下键盘上的“q”键(第 121-125 行)。
如果满足循环的退出条件,我们将在脚本本身退出之前中断并执行一些清理(第 129-130 行)。
就这样。 您应该整体查看这 130 行代码 – 该框架/模板可以轻松用于 Raspberry Pi 上的其他深度学习项目。
现在让我们来寻找那个胖乎乎的、留着胡子的快乐圣诞老人吧!
深度学习+Keras+Raspberry Pi得到的结果
我们之前开发Not Santa深度学习模型时,使用的是从互联网上收集的图像。
但这很无聊,而且不符合本文的目的。
我一直想打扮得像圣诞老人,所以上周我订购了一套便宜的圣诞老人套装:
图 7:我的 Adrian Rosebrock 圣诞老人造型。 我将亲自测试我们使用深度学习、Keras、Python 和 OpenCV 创建的 Not Santa 检测器。 我的外表和真正的圣诞老人有很大不同,但这套服装应该足够了。
然后我将连接到 Raspberry Pi 的相机安装到我公寓的圣诞树上:
图 8:我自己的圣诞树将作为我们的 Raspberry Pi Not Santa 探测器深度学习模型的测试背景。
如果圣诞老人来到这棵圣诞树下给好孩子们送礼物,我们希望通过闪烁的 3D 圣诞树灯光和播放圣诞歌曲来欢迎他。
然后我使用以下命令启动了 Not Santa 深度学习 + Keras 检测器:
$ python not_santa_ detector.py
如果您想学习本教程,可以在原文末尾的下载链接中下载源代码、预训练模型和音频文件。
当 Not Santa 启动并运行后,我就开始运行了:
图 9:使用深度学习、Python、Keras 和 Raspberry Pi 成功检测视频流中的圣诞老人
当检测到圣诞老人时,3D 圣诞树灯会亮起并开始播放音乐。
这是一个带声音的演示视频地址::
每当圣诞老人出现时,你就能看到 3D 圣诞树灯亮起,伴随着 Raspberry Pi 扬声器发出的欢乐笑声。
我们的深度学习模型是一个小型网络架构,但其在准确性和鲁棒性方面的表现令人惊讶。
我一整年都表现得很好,所以我相信圣诞老人会来到我的公寓。
我也比以往任何时候都更有信心,我的“非圣诞老人”探测器会看到圣诞老人给我送礼物。
在圣诞节之前,我还可以修改此脚本(调用 cv2.imwrite 或更好地保存视频)以确保将圣诞老人的图像保存到磁盘作为证据。 如果有人在我的圣诞树下留下了礼物,我会知道的。
亲爱的圣诞老人:如果您正在读这篇文章,您就知道我用树莓派抓住了您!
总结
在本文中,您学习了如何在 Raspberry Pi 上运行 Keras 深度学习模型。
为了实现这一目标,我们首先在笔记本电脑或台式电脑上训练了 Keras 深度学习模型,该模型可以检测图像是否包含“圣诞老人”或“不是圣诞老人”。
然后,我们在 Raspberry Pi 上安装了 TensorFlow 和 Keras,这使我们能够将之前训练的深度学习图像分类器部署到该 Raspberry Pi。 虽然Raspberry Pi不适合训练深度神经网络,但它可以用来部署这些网络——只要网络架构足够简单,我们甚至可以实时运行我们的模型。
为了演示这一点,我们在 Raspberry Pi 上创建了一个 Not Santa 检测器,它可以对视频流中的每个输入帧进行分类。
如果检测到圣诞老人,我们会访问 GPIO 引脚来点亮 3D 圣诞树并播放节日音乐。
原文链接: