欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python+樹莓派+YOLO打造一款人工智能照相機(jī)

 更新時(shí)間:2018年01月02日 16:09:03   作者:Alpha_h4ck  
今天,我們將自己動(dòng)手打造出一款基于深度學(xué)習(xí)的照相機(jī),當(dāng)小鳥出現(xiàn)在攝像頭畫面中時(shí),它將能檢測到小鳥并自動(dòng)進(jìn)行拍照

不久之前,亞馬遜剛剛推出了DeepLens 。這是一款專門面向開發(fā)人員的全球首個(gè)支持深度學(xué)習(xí)的攝像機(jī),它所使用的機(jī)器學(xué)習(xí)算法不僅可以檢測物體活動(dòng)和面部表情,而且還可以檢測類似彈吉他等復(fù)雜的活動(dòng)。雖然DeepLens還未正式上市,但智能攝像機(jī)的概念已經(jīng)誕生了。

 

今天,我們將自己動(dòng)手打造出一款基于深度學(xué)習(xí)的照相機(jī),當(dāng)小鳥出現(xiàn)在攝像頭畫面中時(shí),它將能檢測到小鳥并自動(dòng)進(jìn)行拍照。最終成品所拍攝的畫面如下所示:

 

相機(jī)不傻,它可以很機(jī)智

我們不打算將一個(gè)深度學(xué)習(xí)模塊整合到相機(jī)中,相反,我們準(zhǔn)備將樹莓派“掛鉤”到攝像頭上,然后通過WiFi來發(fā)送照片。本著“一切從簡”(窮)為核心出發(fā),我們今天只打算搞一個(gè)跟DeepLens類似的概念原型,感興趣的同學(xué)可以自己動(dòng)手嘗試一下。

接下來,我們將使用Python編寫一個(gè)Web服務(wù)器,樹莓派將使用這個(gè)Web服務(wù)器來向計(jì)算機(jī)發(fā)送照片,或進(jìn)行行為推斷和圖像檢測。

 

我們這里所使用的計(jì)算機(jī)其處理能力會(huì)更強(qiáng),它會(huì)使用一種名叫 YOLO 的神經(jīng)網(wǎng)絡(luò)架構(gòu)來檢測輸入的圖像畫面,并判斷小鳥是否出現(xiàn)在了攝像頭畫面內(nèi)。

我們得先從YOLO架構(gòu)開始,因?yàn)樗悄壳八俣茸羁斓臋z測模型之一。該模型專門給Tensorflow(谷歌基于DistBelief進(jìn)行研發(fā)的第二代人工智能學(xué)習(xí)系統(tǒng))留了一個(gè)接口,所以我們可以輕松地在不同的平臺(tái)上安裝和運(yùn)行這個(gè)模型。友情提示,如果你使用的是我們本文所使用的迷你模型,你還可以用CPU來進(jìn)行檢測,而不只是依賴于價(jià)格昂貴的GPU。

接下來回到我們的概念原型上… 如果像框內(nèi)檢測到了小鳥,那我們就保存圖片并進(jìn)行下一步分析。

檢測與拍照

 

正如我們所說的,DeepLens的拍照功能是整合在計(jì)算機(jī)里的,所以它可以直接使用板載計(jì)算能力來進(jìn)行基準(zhǔn)檢測,并確定圖像是否符合我們的標(biāo)準(zhǔn)。

但是像樹莓派這樣的東西,我們其實(shí)并不需要使用它的計(jì)算能力來進(jìn)行實(shí)時(shí)計(jì)算。因此,我們準(zhǔn)備使用另一臺(tái)計(jì)算機(jī)來推斷出現(xiàn)在圖像中的內(nèi)容。

我使用的是一臺(tái)簡單的Linux計(jì)算機(jī),它帶有一個(gè)攝像頭以及WiFi無線網(wǎng)卡( 樹莓派3 + 攝像頭 ),而這個(gè)簡單的設(shè)備將作為我的深度學(xué)習(xí)機(jī)器并進(jìn)行圖像推斷。對我來說,這是目前最理想的解決方案了,這不僅大大縮減了我的成本,而且還可以讓我在臺(tái)式機(jī)上完成所有的計(jì)算。

當(dāng)然了,如果你不想使用樹莓派視頻照相機(jī)的話,你也可以選擇在樹莓派上安裝OpenCV 3來作為方案B,具體的安裝方法請參考【這份文檔 】。友情提示,安裝過程可謂是非常的麻煩!

接下來,我們需要使用Flask來搭建Web服務(wù)器,這樣我們就可以從攝像頭那里獲取圖像了。這里我使用了 MiguelGrinberg 所開發(fā)的網(wǎng)絡(luò)攝像頭服務(wù)器代碼( Flask視頻流框架 ),并創(chuàng)建了一個(gè)簡單的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)

如果你使用的是樹莓派視頻照相機(jī),請確保沒有注釋掉上述代碼中from camera_pi那一行,然后注釋掉from camera_opencv那一行。

你可以直接使用命令python3 app.py或gunicorn來運(yùn)行服務(wù)器,這跟Miguel在文檔中寫的方法是一樣的。如果我們使用了多臺(tái)計(jì)算機(jī)來進(jìn)行圖像推斷的話,我們還可以利用Miguel所開發(fā)的攝像頭管理方案來管理攝像頭以及計(jì)算線程。

當(dāng)我們啟動(dòng)了樹莓派之后,首先需要根據(jù)IP地址來判斷服務(wù)器是否正常工作,然后嘗試通過Web瀏覽器來訪問服務(wù)器。

URL地址格式類似如下:

http://192.168.1.4:5000/image.jpg

在樹莓派中加載Web頁面及圖像來確定服務(wù)器是否正常工作:

 

圖像導(dǎo)入及推斷

既然我們已經(jīng)設(shè)置好了終端來加載攝像頭當(dāng)前的圖像內(nèi)容,我們就可以構(gòu)建一個(gè)腳本來捕捉圖像并推斷圖像中的內(nèi)容了。

這里我們需要用到request庫(一個(gè)優(yōu)秀的Python庫,用于從URL地址獲取文件資源)以及 Darkflow (YOLO模型基于Tensorflow的實(shí)現(xiàn))。

不幸的是,我們沒辦法使用pip之類的方法來安裝 Darkflow ,所以我們需要克隆整個(gè)代碼庫,然后自己動(dòng)手完成項(xiàng)目的構(gòu)建和安裝。安裝好Darkflow項(xiàng)目之后,我們還需要下載一個(gè)YOLO模型。

因?yàn)槲沂褂玫氖撬俣缺容^慢的計(jì)算機(jī)和板載CPU(而不是速度較快的GPU),所以我選擇使用YOLO v2迷你網(wǎng)絡(luò)。當(dāng)然了,它的功能肯定沒有完整的YOLO v2模型的推斷準(zhǔn)確性高啦!

配置完成之后,我們還需要在計(jì)算機(jī)中安裝Pillow、numpy和OpenCV。最后,我們就可以徹底完成我們的代碼,并進(jìn)行圖像檢測了。

最終的代碼如下所示:

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)

此時(shí),我們不僅可以在命令控制臺(tái)中查看到樹莓派所檢測到的內(nèi)容,而且我們還可以直接在硬盤中查看保存下來的小鳥照片。接下來,我們就可以使用YOLO來標(biāo)記圖片中的小鳥了。

假陽性跟假陰性之間的平衡

我們在代碼的options字典中設(shè)置了一個(gè)threshold鍵,這個(gè)閾值代表的是我們用于檢測圖像的某種成功率。在測試過程中,我們將其設(shè)為了0.1,但是如此低的閾值會(huì)給我們帶來是更高的假陽性以及誤報(bào)率。更糟的是,我們所使用的迷你YOLO模型準(zhǔn)確率跟完整的YOLO模型相比,差得太多了,但這也是需要考慮的一個(gè)平衡因素。

降低閾值意味著我們可以得到更多的模型輸出(照片),在我的測試環(huán)境中,我閾值設(shè)置的比較低,因?yàn)槲蚁氲玫礁嗟男▲B照片,不過大家可以根據(jù)自己的需要來調(diào)整閾值參數(shù)。

代碼開源

跟之前一樣,我已經(jīng)將所有的代碼上傳到GitHub上了,感興趣的同學(xué)可以自行下載安裝【 GitHub傳送門 】。

相關(guān)文章

  • python安裝和pycharm環(huán)境搭建設(shè)置方法

    python安裝和pycharm環(huán)境搭建設(shè)置方法

    這篇文章主要介紹了python安裝和pycharm環(huán)境搭建和設(shè)置方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下 ,
    2020-05-05
  • python中的split()函數(shù)和os.path.split()函數(shù)使用詳解

    python中的split()函數(shù)和os.path.split()函數(shù)使用詳解

    今天小編就為大家分享一篇python中的split()函數(shù)和os.path.split()函數(shù)使用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python模塊、包(Package)概念與用法分析

    Python模塊、包(Package)概念與用法分析

    這篇文章主要介紹了Python模塊、包(Package)概念與用法,結(jié)合實(shí)例形式分析了Python中模塊、包(Package)概念、功能、相關(guān)使用技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-05-05
  • Python的randrange()方法使用教程

    Python的randrange()方法使用教程

    這篇文章主要介紹了Python的randrange()方法使用教程,是Python學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • pandas如何讀取含有中文的excel

    pandas如何讀取含有中文的excel

    這篇文章主要介紹了pandas如何讀取含有中文的excel問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • pytorch實(shí)現(xiàn)focal loss的兩種方式小結(jié)

    pytorch實(shí)現(xiàn)focal loss的兩種方式小結(jié)

    今天小編就為大家分享一篇pytorch實(shí)現(xiàn)focal loss的兩種方式小結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Django+Celery實(shí)現(xiàn)定時(shí)任務(wù)的示例

    Django+Celery實(shí)現(xiàn)定時(shí)任務(wù)的示例

    Celery是一個(gè)基于python開發(fā)的分布式任務(wù)隊(duì)列,而做python WEB開發(fā)最為流行的框架莫屬Django,本示例使用主要依賴包Django+Celery實(shí)現(xiàn)定時(shí)任務(wù),感興趣的朋友一起看看吧
    2021-06-06
  • Python調(diào)用golang代碼詳解

    Python調(diào)用golang代碼詳解

    這篇文章主要給大家介紹了關(guān)于Python調(diào)用golang代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • Python如何利用opencv實(shí)現(xiàn)手勢識別

    Python如何利用opencv實(shí)現(xiàn)手勢識別

    這篇文章主要介紹了Python如何利用opencv實(shí)現(xiàn)手勢識別,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙可以參考一下
    2022-05-05
  • 簡單介紹使用Python解析并修改XML文檔的方法

    簡單介紹使用Python解析并修改XML文檔的方法

    這篇文章主要介紹了使用Python解析并修改XML文檔的方法,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10

最新評論