首页
社区
课程
招聘
[翻译]利用 Raspberry Pi 和 YOLO 打造基于深度学习的摄像头
2018-1-21 00:49 4810

[翻译]利用 Raspberry Pi 和 YOLO 打造基于深度学习的摄像头

2018-1-21 00:49
4810

亚马逊刚刚发布了 DeepLens ,一款智能摄像机,使用机器学习来探测物体、面部表情,还有如同在相机上弹吉他这样的活动。尽管 DeepLens 目前还没问世,但智能相机这个点子是很令人期待的。

想象一下,如果你在使用一架能够分辨演奏吉他、创建新舞蹈,或者学习新的滑板技巧的照相机。它可以使用原始数据图像来判断你是否get到了一个技巧。或者当你正在做一个新的舞蹈动作时,它能分辨出这一系列的姿势,以及这些姿势是如何配合音乐的。

今天,我们要构建一个深度学习的摄像机,当有鸟出现在摄像机里面时,就保存当前的图片,最终的结果图是这样的:

深度学习相机是机器学习计算机全新平台的开端。

DeepLens有100 GFlops的计算能力可用于推断,这仅仅是一个深度学习相机所需计算能力的开始。在未来,这些设备将变得更加强大,并每秒可以对成百上千的图像进行判断。

看傻瓜相机如何智能推理

不用在相机中构造一个深度学习模型,我们使用 edge 的“傻瓜”相机(相当于一个价值9美元的树莓派),将其挂接到一个网络摄像机上,然后通过 wifi 发送图片。尽管会有一点延迟,但我们可以构建一个 DeepLens 概念的原型,价格也更加便宜。

所以,在这篇文章里面,我们就这样来操作。先用python写一个服务端,将树莓派中的图片发送到另一台电脑进行推断或者图像检测。

另一台具有更强处理能力的计算机将使用名为“YOLO”的神经网络体系结构对该输入图像进行检测,并判断画面中是否有鸟。

我们将从 YOLO 这个结构开始,它是最快的检测模型之一。Tensorflow模型有一个端口,它非常易于安装并且可以运行在多种不同的平台上。如果您使用我们在本文中使用的模型,您还可以在CPU上进行检测,不需要昂贵的GPU。

在我们的原型中,如果在画面中检测到了鸟,那么我们就会将图片保存下来以供后续分析。

这只是智能深度照相机的开始,相当的基础,让我们开始吧。

检测与成像

正如之前说的那样,DeepLens 的成像刚好是在电脑中的,所以它可以做基本的检测,确定图像是否符合标准与机载计算能力。

但是像树莓派这样的东西,我们不一定要有实时检测的计算能力。因此,我们将使用另一台计算机来推断图像中的内容。

因此,我使用了一台简单的 linux 电脑,它具有网络摄像头和wifi接入功能(树莓派 3一款便宜的网络摄像机),它作为一个服务端,方便我的深度学习计算机来做推理。

这是一个很好的堆栈,因为它允许保存许多便宜的相机,并在我的台式机上在一个地方完成所有的计算。

摄像机图像服务堆栈

如果你不想使用树莓派相机,你可以使用这些指令在你的树莓Pi上安装OpenCV 3,在指令中使用OpenCV 3.3.1版本,以获得本地安装的最新版本。

我必须禁用CAROTENE编译才能在我的Raspberry Pi上获得3.3.1版本。你或许也需要这样做。

完成上面的工作过后,我们就需要在 Flask 上面设置网络服务了,就可以从网络摄像机上加载图片了。

我使用Miguel Grinberg摄像头服务器代码作为开端,创建了一个简单的jpg端点而不是运动jpeg端点:

#!/usr/bin/env python
from importlib import import_module
import os
from flask import Flask, render_template, Response

# uncomment below to use Raspberry Pi camera instead
# from camera_pi import Camera

# comment this out if you're not using USB webcam
from camera_opencv import Camera

app = Flask(__name__)

@app.route('/')
def index():
    return "hello world!"

def gen2(camera):
    """Returns a single image frame"""
    frame = camera.get_frame()
    yield frame

@app.route('/image.jpg')
def image():
    """Returns a single current image for the webcam"""
    return Response(gen2(Camera()), mimetype='image/jpeg')

if __name__ == '__main__':
    app.run(host='0.0.0.0', threaded=True)

如果您想使用Raspberry Pi摄像机,请确保没有注释 from camera_pi,并注释掉 from camera_opencv这一行。

就像在Miguel的文章中提到的一样,可以使用 python3 app.py或使用gunicorn命令来运行这个服务器,

利用相机管理功能,当没有请求进入的时候就关掉相机,并且如果有多台机器对摄像头进入的图像进行检测的时候,还能管理线程。

一旦我们启动了树莓派服务端,获得ip地址后就可以在浏览器里面去访问。

url 就如同这样:http://192.168.1.4:5000/image.jpg

从摄像机服务器中提取图像并进行推断。

既然已经可以在终端加载摄像机的当前图像,我们就可以构建脚本来抓取和分析图片了。

我们使用 python 的 requests 库从 url 中抓取文件,还会用到在 Tensorflow 上实现 YOLO 模型的Darkflow  。

麻烦的是,这里无法用 pip 来安装 Darkflow ,因此我们需要去克隆仓库 ,然后自行构建并安装它。

在安装了Darkflow 仓库之后,我们还需要下载我们将要使用的YOLO版本的权重和模型。

我使用的是YOLO v2微型网络,这样就可以在较慢的计算机上运行,使用的是机载CPU,而不是主要桌面上的GPU。但这个微型网络与YOLO v2的完整版本相比,准确性不高。

在构建和下载完成之后,我们还需要安装 Pillow、numpy 和 OpenCV 模块。

最后,编写代码实现检测:

from darkflow.net.build import TFNet
import cv2

from io import BytesIO
import time
import requests
from PIL import Image
import numpy as np

options = {"model": "cfg/tiny-yolo-voc.cfg", "load": "bin/tiny-yolo-voc.weights", "threshold": 0.1}

tfnet = TFNet(options)

birdsSeen = 0
def handleBird():
    pass

while True:
    r = requests.get('http://192.168.1.11:5000/image.jpg') # a bird yo
    curr_img = Image.open(BytesIO(r.content))
    curr_img_cv2 = cv2.cvtColor(np.array(curr_img), cv2.COLOR_RGB2BGR)

    result = tfnet.return_predict(curr_img_cv2)
    print(result)
    for detection in result:
        if detection['label'] == 'bird':
            print("bird detected")
            birdsSeen += 1
            curr_img.save('birds/%i.jpg' % birdsSeen)
    print('running again')
    time.sleep(4)

这就是我们的version 1.0版本了,可以在控制台上查看树莓派都检测到了什么,也可以在硬盘里查看保存有小鸟的照片。

之后,我们可以运行程序,对YOLO检测到的图像进行标记。

平衡:假阳性还是假阴性?

我们还要关注阈值,这个阈值说明了我们需要怎样的置信水平才能表明发现了我们要找的东西。

由于此处只是测试,我们把它设为0.1,但是阈值太低会带来一些误报,更严重的是,我们使用的微型YOLO 模型与实际的 YOLO 模型相比会有一定的误差,所以可能会产生一些错误的结果。

降低或提高阈值可以提高或降低模型的总输出,具体取决于自己的需求。比如在这里,我想得到更多的鸟类图像,所以我可以容忍假阳性的结果。可以调整这些参数以符合不同的需求。

等待bird

我花了很长时间让让鸟儿进入喂鸟器,开始那几天我的食物都被松鼠吃掉了,一只鸟也没看见。最后我放了第二个喂鸟器才引来几只鸟,并获得了在文章开头的图片。

最后

这篇文章是我将使用深度学习相机尝试与鸟类互动的一系列课程的开始。

本文的的代码可以在guthub上找到。


原文地址:https://www.makeartwithpython.com/blog/poor-mans-deep-learning-camera/

本文由看雪翻译小组cherrir编译




[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回