投稿/爆料
厂商入驻

用树莓派和YOLO创建深度学习相机 自动抓拍目标物

论智|2018-01-30 15:25

编者按:本文作者Kirk Kaiser是一名开发者,近日,他在自己的博客中发表了自制深度学习相机的教程,用黑客似的方式将摄像头与深度学习结合。以下是论智对原文的编译。

用树莓派和YOLO创建深度学习相机 自动抓拍目标物

去年11月,亚马逊推出了一款面向AI开发者的摄像机DeepLens,可以利用机器学习识别物体、人脸以及动作。

想像一下一台相机能分辨你是在弹吉他还是跳舞,甚至能认出你新学到的滑板技巧。它能根据原始图像数据判断你玩了什么特技,或是当你跳舞时,它能判断你是否跟上了音乐节拍。

今天,我们将DIY一台深度学习相机,用来检测小鸟。当有小鸟走入画面中,相机就会自动拍摄存储这一图像。下面三幅图就是相机拍到的两只小鸟:

用树莓派和YOLO创建深度学习相机 自动抓拍目标物

用树莓派和YOLO创建深度学习相机 自动抓拍目标物

用树莓派和YOLO创建深度学习相机 自动抓拍目标物

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

DeepLens进行推断时的计算能力可达到100 GFlops,然而要想实现更多有趣的深度学习结果,这样的计算能力只是基础。未来,这些设备将更加强大,可以支持每秒处理数百张图像。

未来太远,不如现在就动手自制一个模型!

傻瓜相机与聪明的计算机推理

与其在相机中构建深度学习模型,我们打算使用一台带有相机的电脑(比如只要9美元的树莓派),将其与网络摄像头连接,通过WiFi传输图像。除了速度慢一些,我们完全可以DIY一个低配版DeepLens,价格却便宜得多。

在本文中,我将详细介绍这一过程。我还用Python编写了一个web服务器,它可以将树莓派中的图像发送到另一台计算机进行推理或图像检测。

用树莓派和YOLO创建深度学习相机 自动抓拍目标物

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

我们首先从YOLO的体系架构开始,因为它是速度最快的检测模型之一,它有一个针对TensorFlow的接口,很容易安装,可以再多平台上运行。这里有个福利,如果你也用本文的Tiny模型,无需昂贵的GPU,只用一台CPU就能完成检测。

好的,回到我们的DIY模型中,如果相机检测到鸟,我们就会拍摄保存,供以后分析。

这只是完成一台真正的智能深度学习相机的开始,非常基础。下面就开始动手吧!

检测vs成像

用树莓派和YOLO创建深度学习相机 自动抓拍目标物

被标记的小鸟,注意被错误标记的“自行车(bicycle)”

正如我所说的那样,DeepLens是在电脑中成像,所以它可以做基础的检测,并用集成的计算能力判断图像是否符合了你的标准。

但是像树莓派这样的,我们并不具备能实时作出检测的计算能力。相反,我们将使用另一台计算机对图中的内容进行推理。

在本次试验中,我使用了一个简单基础的带有摄像头的Linux计算机与无线接入(树莓派3和廉价的网络摄像头),作为深度学习机器的服务器。

摄像头图像服务器堆栈

如果你不想使用树莓派相机,也可以按照说明在你的树莓派上安装OpenCV 3,目前可安装3.3.1以获得最新版本。

注意:我必须禁用CAROTENE编译才能在树莓派上获取3.3.1,你可能也会遇到这种情况。

完成后,我们需要在Flask中设置我们的Web服务器,以便可以从网络摄像头加载图像。

我已经使用了Miguel Grinberg摄像头服务器代码成功开始,创建了简单的jpg端点:

#!/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)

如果你想使用树莓派视频摄像机,请确保取消注释from camera_pi这一行,并添加注释from camera_opencv这一行。

只需要输入python3 app.py就能运行这一服务器,或者与Miguel的方法相同,使用gunicorn

在没有请求进入时,它利用管理功能关闭摄像头。同样,如果我们有多台机器对输入的图像进行推理,该功能还能管理线程。

一旦我们在树莓派上启动了它,我们就可以通过它的IP地址测试服务器并确保它正常工作,然后可以用web浏览器访问它。

网址看起来应该是类似这样的:http://192.168.1.4:5000/image.jpg

用树莓派和YOLO创建深度学习相机 自动抓拍目标物

图像推理

现在我们已经有一个可以加载摄像头当前图像的断电了,我们可以创建脚本来抓取图像,开始进行推理。

我们将使用request,Python库和Darkflow用来抓取来自URL的文件,Darkflow是TensorFlow上的YOLO模型的实现。

但是,却没有安装Darkflow的pip wheel,所以我们需要将repo远程下载过来,然后再计算机上自行安装构建。在这之后,我们还要下载将要使用的YOLO的权重和模型。在本次试验中,我使用的是YOLO V2微型网络,因为推理过程的实现是在一台较慢的计算机上,有着集成的CPU而非GPU。这个tiny版本与YOLO v2的完整版相比,准确性稍低一些。

完成了以上这些,我们还需要在计算机上安装Pillownumpy和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)

有了这个,我们的“小鸟探测器”就初具雏形了。我们可以在计算机上看到树莓派检测到了什么,也可以看到硬盘上保存下来的每只小鸟。

之后,我们将运行一个程序,对YOLO检测到的鸟类进行标记。

误报(false positives)多还是漏报(false negatives)多?

有一点需要注意的是,我们创建选项库中的threshold键。

这个阈值的目的是控制置信区间,确保计算机识别的是我们想要的东西。

为了测试,我将它设置为0.1.但是,这么低的门槛的确会带来很多误报。更糟的是,我们用于检测的微型Tiny YOLO模型没完整版准确,所以会生成一些错误的结果。

降低或提高阈值可以增加或减少模型的总输出,这取决于你要构建的模型,你可以进一步调整参数达到要求。

小结

本文中所用的代码都可以在作者的GitHub上找到。除了拍小鸟,论智君建议喜欢观察野生动物或者家里有猫有狗的同学们,也可以用这种方法为你家主子拍照,尤其是不愿上镜露脸的小猫小狗们,这可以是偷拍的好方法。

GitHub地址:github.com/burningion/poor-mans-deep-learning-camera

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

机器人网原创文章,未经授权禁止转载。详情见转载须知

本文来自机器人之家,如若转载,请注明出处:https://www.jqr.com/article/000011
爆料投稿,欢迎投递至邮箱:service@jqr.com
图像识别
推荐阅读

最新评论(0

暂无回帖,快来抢沙发吧

评论

游客
robot
发布需求
联系客服联系客服
robot
联系客服