首頁>科技>

亞馬遜剛剛推出了DeepLens 。這是一款專門面向開發人員的全球首個支援深度學習的攝像機,它所使用的機器學習演算法不僅可以檢測物體活動和麵部表情,而且還可以檢測類似彈吉他等複雜的活動。雖然DeepLens還未正式上市,但智慧攝像機的概念已經誕生了。

今天,我們將自己動手打造出一款基於深度學習的照相機,當小鳥出現在攝像頭畫面中時,它將能檢測到小鳥並自動進行拍照。最終成品所拍攝的畫面如下所示:

相機不傻,它可以很機智

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

接下來,我們將使用Python編寫一個Web伺服器,樹莓派將使用這個Web伺服器來向計算機發送照片,或進行行為推斷和影象檢測。

我們這裡所使用的計算機其處理能力會更強,它會使用一種名叫 YOLO 的神經網路架構來檢測輸入的影象畫面,並判斷小鳥是否出現在了攝像頭畫面內。

我們得先從YOLO架構開始,因為它是目前速度最快的檢測模型之一。該模型專門給Tensorflow(谷歌基於DistBelief進行研發的第二代人工智慧學習系統)留了一個介面,所以我們可以輕鬆地在不同的平臺上安裝和執行這個模型。友情提示,如果你使用的是我們本文所使用的迷你模型,你還可以用CPU來進行檢測,而不只是依賴於價格昂貴的GPU。

接下來回到我們的概念原型上… 如果像框內檢測到了小鳥,那我們就儲存圖片並進行下一步分析。

檢測與拍照

正如我們所說的,DeepLens的拍照功能是整合在計算機裡的,所以它可以直接使用板載計算能力來進行基準檢測,並確定影象是否符合我們的標準。

但是像樹莓派這樣的東西,我們其實並不需要使用它的計算能力來進行實時計算。因此,我們準備使用另一臺計算機來推斷出現在影象中的內容。

我使用的是一臺簡單的Linux計算機,它帶有一個攝像頭以及WiFi無線網絡卡( 樹莓派3 + 攝像頭 ),而這個簡單的裝置將作為我的深度學習機器並進行影象推斷。對我來說,這是目前最理想的解決方案了,這不僅大大縮減了我的成本,而且還可以讓我在臺式機上完成所有的計算。

我們需要使用Flask來搭建Web伺服器,這樣我們就可以從攝像頭那裡獲取影象了。

from import lib import import_moduleimport osfrom 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 webcamfrom camera_opencv import Cameraapp =Flask(__name__)@app.route('/')def index(): return "hello world!"def gen2(camera): """Returns a single imageframe""" frame = camera.get_frame() yield [email protected]('/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 TFNetimport cv2from io import BytesIOimport timeimport requestsfrom PIL import Imageimport numpy as npoptions= {"model": "cfg/tiny-yolo-voc.cfg", "load":"bin/tiny-yolo-voc.weights", "threshold": 0.1}tfnet= TFNet(options)birdsSeen= 0def handleBird(): passwhileTrue: 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模型相比,差得太多了,但這也是需要考慮的一個平衡因素。

降低閾值意味著我們可以得到更多的模型輸出(照片),在我的測試環境中,我閾值設定的比較低,因為我想得到更多的小鳥照片,不過大家可以根據自己的需要來調整閾值引數。

最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 分享5個黑科技APP,都是寶藏好資源,手機裡沒裝的可惜了