Python+樹莓派+YOLO打造一款人工智能照相機
不久之前,亞馬遜剛剛推出了DeepLens 。這是一款專門面向開發(fā)人員的全球首個支持深度學習的攝像機,它所使用的機器學習算法不僅可以檢測物體活動和面部表情,而且還可以檢測類似彈吉他等復雜的活動。雖然DeepLens還未正式上市,但智能攝像機的概念已經(jīng)誕生了。
今天,我們將自己動手打造出一款基于深度學習的照相機,當小鳥出現(xiàn)在攝像頭畫面中時,它將能檢測到小鳥并自動進行拍照。最終成品所拍攝的畫面如下所示:
相機不傻,它可以很機智
我們不打算將一個深度學習模塊整合到相機中,相反,我們準備將樹莓派“掛鉤”到攝像頭上,然后通過WiFi來發(fā)送照片。本著“一切從簡”(窮)為核心出發(fā),我們今天只打算搞一個跟DeepLens類似的概念原型,感興趣的同學可以自己動手嘗試一下。
接下來,我們將使用Python編寫一個Web服務器,樹莓派將使用這個Web服務器來向計算機發(fā)送照片,或進行行為推斷和圖像檢測。
我們這里所使用的計算機其處理能力會更強,它會使用一種名叫 YOLO 的神經(jīng)網(wǎng)絡架構來檢測輸入的圖像畫面,并判斷小鳥是否出現(xiàn)在了攝像頭畫面內(nèi)。
我們得先從YOLO架構開始,因為它是目前速度最快的檢測模型之一。該模型專門給Tensorflow(谷歌基于DistBelief進行研發(fā)的第二代人工智能學習系統(tǒng))留了一個接口,所以我們可以輕松地在不同的平臺上安裝和運行這個模型。友情提示,如果你使用的是我們本文所使用的迷你模型,你還可以用CPU來進行檢測,而不只是依賴于價格昂貴的GPU。
接下來回到我們的概念原型上… 如果像框內(nèi)檢測到了小鳥,那我們就保存圖片并進行下一步分析。
檢測與拍照
正如我們所說的,DeepLens的拍照功能是整合在計算機里的,所以它可以直接使用板載計算能力來進行基準檢測,并確定圖像是否符合我們的標準。
但是像樹莓派這樣的東西,我們其實并不需要使用它的計算能力來進行實時計算。因此,我們準備使用另一臺計算機來推斷出現(xiàn)在圖像中的內(nèi)容。
我使用的是一臺簡單的Linux計算機,它帶有一個攝像頭以及WiFi無線網(wǎng)卡( 樹莓派3 + 攝像頭 ),而這個簡單的設備將作為我的深度學習機器并進行圖像推斷。對我來說,這是目前最理想的解決方案了,這不僅大大縮減了我的成本,而且還可以讓我在臺式機上完成所有的計算。
當然了,如果你不想使用樹莓派視頻照相機的話,你也可以選擇在樹莓派上安裝OpenCV 3來作為方案B,具體的安裝方法請參考【這份文檔 】。友情提示,安裝過程可謂是非常的麻煩!
接下來,我們需要使用Flask來搭建Web服務器,這樣我們就可以從攝像頭那里獲取圖像了。這里我使用了 MiguelGrinberg 所開發(fā)的網(wǎng)絡攝像頭服務器代碼( Flask視頻流框架 ),并創(chuàng)建了一個簡單的jpg終端:
#!/usr/bin/envpython
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所開發(fā)的攝像頭管理方案來管理攝像頭以及計算線程。
當我們啟動了樹莓派之后,首先需要根據(jù)IP地址來判斷服務器是否正常工作,然后嘗試通過Web瀏覽器來訪問服務器。
URL地址格式類似如下:
http://192.168.1.4:5000/image.jpg
在樹莓派中加載Web頁面及圖像來確定服務器是否正常工作:
圖像導入及推斷
既然我們已經(jīng)設置好了終端來加載攝像頭當前的圖像內(nèi)容,我們就可以構建一個腳本來捕捉圖像并推斷圖像中的內(nèi)容了。
這里我們需要用到request庫(一個優(yōu)秀的Python庫,用于從URL地址獲取文件資源)以及 Darkflow (YOLO模型基于Tensorflow的實現(xiàn))。
不幸的是,我們沒辦法使用pip之類的方法來安裝 Darkflow ,所以我們需要克隆整個代碼庫,然后自己動手完成項目的構建和安裝。安裝好Darkflow項目之后,我們還需要下載一個YOLO模型。
因為我使用的是速度比較慢的計算機和板載CPU(而不是速度較快的GPU),所以我選擇使用YOLO v2迷你網(wǎng)絡。當然了,它的功能肯定沒有完整的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)
此時,我們不僅可以在命令控制臺中查看到樹莓派所檢測到的內(nèi)容,而且我們還可以直接在硬盤中查看保存下來的小鳥照片。接下來,我們就可以使用YOLO來標記圖片中的小鳥了。
假陽性跟假陰性之間的平衡
我們在代碼的options字典中設置了一個threshold鍵,這個閾值代表的是我們用于檢測圖像的某種成功率。在測試過程中,我們將其設為了0.1,但是如此低的閾值會給我們帶來是更高的假陽性以及誤報率。更糟的是,我們所使用的迷你YOLO模型準確率跟完整的YOLO模型相比,差得太多了,但這也是需要考慮的一個平衡因素。
降低閾值意味著我們可以得到更多的模型輸出(照片),在我的測試環(huán)境中,我閾值設置的比較低,因為我想得到更多的小鳥照片,不過大家可以根據(jù)自己的需要來調(diào)整閾值參數(shù)。
代碼開源
跟之前一樣,我已經(jīng)將所有的代碼上傳到GitHub上了,感興趣的同學可以自行下載安裝【 GitHub傳送門 】。
相關文章
python解決漢字編碼問題:Unicode Decode Error
最近在利用python讀取一個含有漢字的文檔時導致出現(xiàn)了亂碼,并報出了兩個錯誤,無奈只能上網(wǎng)找尋答案,后通過網(wǎng)友的幫助解決了這個問題,想著總結一下,下面這篇文章就主要介紹了python如何解決漢字編碼問題,有需要的朋友們可以參考借鑒。2017-01-01
使用Python中的pytesseract模塊實現(xiàn)抓取圖片中文字
最近同事用網(wǎng)上提供掃描軟件進行掃描識別文字,每天上線只能夠做兩次掃描,請求我研發(fā)一個小工具幫助解決識別圖片的中文字,最終我選擇使用pytesseract模塊可以解決這個需求問題,本文給大家分享實現(xiàn)代碼操作感興趣的朋友跟隨小編一起看看吧2022-11-11
pycharm-professional-2020.1下載與激活的教程
這篇文章主要介紹了pycharm-professional-2020.1下載與激活的教程,本文分為安裝和永久激活兩部分內(nèi)容,需要的朋友可以參考下2020-09-09
django模型類中,null=True,blank=True用法說明
這篇文章主要介紹了django模型類中,null=True,blank=True用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
PyCharm Terminal終端命令行Shell設置方式
這篇文章主要介紹了PyCharm Terminal終端命令行Shell設置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01

