Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。
亚马逊刚刚发布了一款智能摄像头DeepLens,它使用机器学习来检测物体、面部和一些活动,如弹吉他。虽然现在还不可以购买DeepLens,但是智能摄像头的想法令人兴奋。
想象一下可以用一个相机分辨你是在弹吉他,还是在创作一段新的舞蹈,还是在学习一个新的滑板技巧。摄像头可以使用原始图像的数据来判断你是否玩的是新的滑板技巧。或者如果你正在跳新的舞蹈,这套舞蹈动作有哪些以及如何将动作与音乐协调起来。
本文将搭建一个深度学习摄像头,它检测何时有鸟出现在摄像头的图像中,然后保存有鸟的照片。最终结果如下图所示:
深度学习相机检测到的包含鸟的图像
深度学习相机是机器学习全新平台的开始。
DeepLens拥有100 GFlops的用于推理的计算能力,这仅仅是一个令人感兴趣的深度学习相机必备的最低的计算能力。未来,这些设备将变得更加强大,并允许每秒推断数百张图像。
但是谁想等到未来呢?
可以智能推理的“笨”相机
我们不需要在相机里构建一个深度学习模型,而是在边缘使用一台“笨”电脑摄像头(比如9美元的树莓派),将其连接到网络摄像头上,然后通过WiFi发送图像。在权衡一点延迟的情况下,我们今天可以建立一个与DeepLens概念相同的原型,而且更便宜。
本文将构建一个这样的相机。用Python编写一个web服务器从树莓派发送图像到另一个计算机来推理或检测图像。
然后,另一台处理能力更强的计算机将使用“YOLO”神经网络结构来对输入图像进行检测,并且告诉我们摄像头中是否有鸟。
我们将从YOLO结构开始,因为它是最快的检测模型之一。而且它有一个对Tensorflow的接口,它易于安装而且可以在许多不同平台上运行。如果你使用本文用的微小模块,你也可以在CPU上检测,而不必在昂贵的GPU上。
回到我们的原型。如果摄像头检测到一只鸟,就保存该图像以供后续分析。
这仅仅是一个真正智能深度学习相机的开始,非常基础,但你必须从某处开始。让我们开始我们原型的第一个版本。
检测vs图像
检测并标记鸟儿
如前所述,DeepLens的成像被内置到计算机。因此,它可以进行基准级检测,并通过机载计算能力确定图像是否符合您的标准。
但是像树莓派,不一定具有进行实时机载检测所需的计算能力。因此,我们将使用另一台计算机来推断图像里有什么。
本文我使用一个简单的带摄像头和wifi接入(树莓派3和一个便宜的摄像头)的Linux计算机来作为服务器,该服务器用于深度学习做推理。
这很好,因为它允许连接很多便宜的外部摄像头,并在台式机上做所有的计算。
摄像头图像服务器栈
如果你不想使用树莓派摄像头,那么可以按照这些操作指南在树莓派上安装OpenCV 3,要按照说明书中获得最新版本本地安装OpenCV 3.3.1替代3.3.0版本。
旁注,为了在我的树莓派上用3.3.1,我得禁用CAROTENE。你可能也得这样做。
这之后,我们需要用Flask建立web服务器,这样我们可以从摄像头加载图像。
本文初步使用的是Miguel Grinberg的经典摄像头服务器代码,而且仅创建一个简单的JPEG,而不是一个视频:
如果你想使用树莓派摄像头,那么确保取消from camera_pi行的注释,而且注释掉from camera_opencv这一行。
你可以使用python3 app.py或gunicorn运行该服务器,与Miguel的帖子中提到的一样。
当没有请求时,它使用Miguel的经典摄像头管理机制来关闭摄像头,如果有多个机器推理摄像头采集的图像,也使用该管理机制管理线程。
一旦在树莓派上开始,首先找到它的IP地址,然后通过web浏览器访问,来测试并确保服务器工作。
该URL类似于http://192.168.1.4:5000/image.jpg:
加载树莓派的页面来确认图像服务器工作
从摄像头服务器提取图像并进行推理
现在,我们可以加载摄像头的当前图像。我们可以构建脚本来抓取这些图像并对它们进行推断。
我们将使用requests以及Darkflow,requests是用于从URL抓取文件的强大的Python库,Darkflow是在Tensorflow上YOLO模块的一个实现。
不幸的是,无法通过pip安装Darkflow,因此我们需要复制repo,然后在我们用于推理的计算机上,建立和安装它。
安装Darkflow repo后,需要下载一个要使用的YOLO版本的权重和模型。
本文,使用的是YOLO v2微小网络版,因为我想在比较慢的计算机上运行推理,该计算机使用机载CPU,而不是GPU。微小网络版比完整的YOLO v2模型精度低。
这之后,还需要在检测计算机上安装Pillow, numpy和OpenCV。
最后,编写代码以运行检测:
以上就是我们检测运行的非常基本的第一个版本。我们可以在控制台上看到树莓派正在检测什么,还可以看到看见的每只鸟保存在硬盘上。
之后,运行一个程序标记出YOLO在图像上检测出的鸟儿。
权衡:更多的误报还是更多的漏报?
需要注意,在选项字典中创建的threshold键。
这个阈值表明我们需要什么样的可信度,至少要有我们要找的东西。
为了测试,我将其设为0.1。但是这个低阈值会带来很多误报。更糟的是,我们用于检测的微小YOLO模块比真正的YOLO模块精度要低,因此我们会得到相当多的错误检测。
降低或提高阈值可以提高或降低模块的总输出,这取决于你想构建的内容。本文有更多的误报,但是我更希望得到更多的鸟的图像。你可能需要调整这些参数以满足你的需求。
等候鸟儿
让鸟进入我的喂食器花了很长时间。我想我要在后院里的喂食器中放几小时的食物。
但是这用了几天时间。松鼠不停地吃我放的食物,而且头几天我几乎没看见天上有一只鸟。
最后,我做了第二个喂食器,这个更明显而且远离地面。这次,我终于得到像文章开头的一些图像。
最后
和往常一样,本文的代码可以在Github上获取:https://github.com/burningion/poor-mans-deep-learning-camera
英文原文:https://www.makeartwithpython.com/blog/poor-mans-deep-learning-camera/
译者:张新英