Python+树莓派+YOLO打造一款人工智能照相机

亚马逊刚刚推出了DeepLens 。这是一款专门面向开发人员的全球首个支持深度学习的摄像机,它所使用的机器学习算法不只能够检测物体活动和面部表情,并且还能够检测相似弹吉他等复杂的活动。虽然DeepLens还未正式上市,但智能摄像机的概念已经诞生了。python


今天,咱们将本身动手打造出一款基于深度学习的照相机,当小鸟出如今摄像头画面中时,它将能检测到小鸟并自动进行拍照。最终成品所拍摄的画面以下所示: 在这里插入图片描述 相机不傻,它能够很机智web

咱们不打算将一个深度学习模块整合到相机中,相反,咱们准备将树莓派“挂钩”到摄像头上,而后经过WiFi来发送照片。本着“一切从简”(穷)为核心出发,咱们今天只打算搞一个跟DeepLens相似的概念原型,感兴趣的同窗能够本身动手尝试一下。算法

接下来,咱们将使用Python编写一个Web服务器,树莓派将使用这个Web服务器来向计算机发送照片,或进行行为推断和图像检测。 在这里插入图片描述 咱们这里所使用的计算机其处理能力会更强,它会使用一种名叫 YOLO 的神经网络架构来检测输入的图像画面,并判断小鸟是否出如今了摄像头画面内。flask

咱们得先从YOLO架构开始,由于它是目前速度最快的检测模型之一。该模型专门给Tensorflow(谷歌基于DistBelief进行研发的第二代人工智能学习系统)留了一个接口,因此咱们能够轻松地在不一样的平台上安装和运行这个模型。友情提示,若是你使用的是咱们本文所使用的迷你模型,你还能够用CPU来进行检测,而不仅是依赖于价格昂贵的GPU。浏览器

接下来回到咱们的概念原型上… 若是像框内检测到了小鸟,那咱们就保存图片并进行下一步分析。bash

检测与拍照 在这里插入图片描述 正如咱们所说的,DeepLens的拍照功能是整合在计算机里的,因此它能够直接使用板载计算能力来进行基准检测,并肯定图像是否符合咱们的标准。服务器

可是像树莓派这样的东西,咱们其实并不须要使用它的计算能力来进行实时计算。所以,咱们准备使用另外一台计算机来推断出如今图像中的内容。网络

我使用的是一台简单的Linux计算机,它带有一个摄像头以及WiFi无线网卡( 树莓派3 + 摄像头 ),而这个简单的设备将做为个人深度学习机器并进行图像推断。对我来讲,这是目前最理想的解决方案了,这不只大大缩减了个人成本,并且还可让我在台式机上完成全部的计算。架构

咱们须要使用Flask来搭建Web服务器,这样咱们就能够从摄像头那里获取图像了。app

from import lib 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 imageframe"""
 frame = camera.get_frame()
 yield frame
@app.route('/image.jpg')
def image():
 """Returns a single currentimage 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或gunicorn来运行服务器,这跟Miguel在文档中写的方法是同样的。若是咱们使用了多台计算机来进行图像推断的话,咱们还能够利用Miguel所开发的摄像头管理方案来管理摄像头以及计算线程。

当咱们启动了树莓派以后,首先须要根据IP地址来判断服务器是否正常工做,而后尝试经过Web浏览器来访问服务器。

在树莓派中加载Web页面及图像来肯定服务器是否正常工做: 在这里插入图片描述 图像导入及推断

既然咱们已经设置好了终端来加载摄像头当前的图像内容,咱们就能够构建一个脚原本捕捉图像并推断图像中的内容了。

这里咱们须要用到request库(一个优秀的Python库,用于从URL地址获取文件资源)以及 Darkflow (YOLO模型基于Tensorflow的实现)。

不幸的是,咱们没办法使用pip之类的方法来安装 Darkflow ,因此咱们须要克隆整个代码库,而后本身动手完成项目的构建和安装。安装好Darkflow项目以后,咱们还须要下载一个YOLO模型。

由于我使用的是速度比较慢的计算机和板载CPU(而不是速度较快的GPU),因此我选择使用YOLO v2迷你网络。固然了,它的功能确定没有完整的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
whileTrue:
 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来标记图片中的小鸟了。

假阳性跟假阴性之间的平衡

咱们在代码的options字典中设置了一个threshold键,这个阈值表明的是咱们用于检测图像的某种成功率。在测试过程当中,咱们将其设为了0.1,可是如此低的阈值会给咱们带来是更高的假阳性以及误报率。更糟的是,咱们所使用的迷你YOLO模型准确率跟完整的YOLO模型相比,差得太多了,但这也是须要考虑的一个平衡因素。

下降阈值意味着咱们能够获得更多的模型输出(照片),在个人测试环境中,我阈值设置的比较低,由于我想获得更多的小鸟照片,不过你们能够根据本身的须要来调整阈值参数。

相关文章
相关标签/搜索