TensorFlow在樹莓派上的應用
什么是TensorFlow?或許很多人都不了解,它是谷歌基于DistBelief進行研發(fā)的第二代人工智能學習系統,其命名來源于本身的運行原理。Tensor(張量)意味著N維數組,Flow(流)意味著基于數據流圖的計算,TensorFlow為張量從流圖的一端流動到另一端的計算過程。TensorFlow是將復雜的數據結構傳輸至人工智能神經網中進行分析和處理過程的系統??杀挥糜谡Z音識別或圖像識別等多項深度學習領域。
SVDS(Silicon Valley Data Science)曾使用過實時、公開的數據來優(yōu)化對加州火車到達時間的預測。但是,加州火車的到站時間數據不可靠,因此難以準確預測。我們使用 Raspberry Pi 攝像頭和 USB 麥克風,能夠偵測到火車的經過及其速度和方向。當在 Mountain View 辦公室里裝配了一臺新的 Raspberry Pi 時,我們遇到了一個棘手的問題:Pi 不單單偵測到了加州火車(true positive),也偵測到了太平洋聯合貨運的火車和 VTA 輕軌(false positive)。為了確保偵測到的是加州火車的延遲,我們不得不對不同的火車做個靠譜的分類。
傳統的背景圖像分類技術是遠遠不夠的,因為我們在整個加州火車系統的鐵軌上——包括不同的距離,不同的方向,不同的高度——放滿了 Raspberry Pi。而且我們的操作時間也很有限,沒有足夠的時間來為系統里每一個 RaspberryPi 手動選擇模式和特征。
用 TensorFlow 解圍
幸好是在2016年遇到這個圖像分類問題,因為在這一年里很多深度學習相關的圖像識別技術的代碼被公開了。我們選擇使用 Google 的 TensorFlow 卷積神經網絡,因為它有簡單易用的 Python 庫和豐富的在線文檔。我拜讀過 Pete Warden 關于 TensorFlow 的博客——TensorFlow for Poets(https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/#0),這篇博客里介紹了如何在高性能的 Inception V3 模型上創(chuàng)建定制化圖像分類器。而且,我可以用我的筆記本電腦來對這個新模型的增強版通宵進行訓練。這樣就不需要很貴的 GPU(顯卡),也可以在未來對模型進行微調,非常有用。
我是從 TensorFlow 教程頁面中花的識別教程開始的。我使用命令行接口來分類數據集中的圖片,也包括 Van Gough 的向日葵這樣的定制圖片。
圖像中的名稱,從上到下依次雛菊,向日葵,蒲公英,郁金香,玫瑰。
現在我有了用 TensorFlow 來創(chuàng)建圖像分類器的經驗,便希望建立一個穩(wěn)健無偏的圖像識別模型用來識別火車。雖然之前 Raspberry Pi 拍攝到的圖片可以用于訓練模型,但我還是選擇了更大更多樣的數據集。我也將小汽車和卡車包括進模型中,因為他們也可能在某些位置上經過 Raspberry Pi 的偵測點。為了得到這個汽車分類器的訓練數據集,我用 Google 找了1000張圖片,含:
加州火車
貨運火車
輕軌
卡車
小汽車
測試及配置模型
對模型訓練了一個通宵,第二天一早,我回到辦公桌來查看模型運行得怎么樣。首先我測試了不包含在訓練集里圖片,并驚奇的發(fā)現,分類器似乎一直可以挑出正確的分類。這里面包括從 Google 上找到的訓練集的圖片,也包括從 Raspberry Pi 采集到的圖片。
圖片中的名稱,從上到下依次是:加州火車,運輸火車,輕軌,汽車,卡車。
我在 Raspberry Pi 上運行圖片分類器,來保證這套設備用戶是可以支付得起的。此外,由于不能保證網絡連接的速度,我必須直接在設備上運行分類器以避免把圖片發(fā)送到中心服務器所造成的延遲。
Raspberry Pi3 馬力(功率)充足,可以直接在設備上進行流處理,因此我們只需要用網絡發(fā)送小容量的,處理過的數據流,并且這套設備也便宜。這個傳感器整體的硬件成本是130美金,所有的代碼都是用的開源庫。我用 JupyterHub 對其進行了測試,以便控制多個位置上的 Raspberry Pi 設備。有了一個正常運行的車輛分類集,接下來我把模型加載到 Raspberry Pi 上,并在視聽流架構下實現了它。
為了能夠在 Raspberry Pi 32Bit ARM芯片上編譯,我使用的是來自SamAbraham 的 Pi-TensorFlow enthusiasts 小社區(qū)的指引(https://github.com/samjabrahams/tensorflow-on-raspberry-pi),同時也與 Pete Warden,Google 的 TensorFlow 團隊進行了溝通。
解決 TensorFlow 在 Raspberry Pi 上出現的問題
雖然有好的文檔記錄如何在 Android 和其他小型計算設備上安裝 TensorFlow,但大多數的例子都是單張圖片識別或批處理,而非流媒體圖片識別。在Pi上單張圖片可以簡單穩(wěn)健地給出分數,如下面這個成功的分類所示:
但是,把85MB的模型加載到內存里需要太長的時間了,因此需要把分類器圖表加載到內存里。分類器圖表加載到內存之后,Raspberry Pi 擁有總計1G的內存,在我們定制的火車偵測 Python 應用中,有足夠的計算資源來處理連續(xù)運行的攝像頭和麥克風。
即便如此,用 TensorFlow 分析 PiCamera 拍攝到的每一張圖片也是不可行的,因為這樣 CPU 的使用率最終將達到100%,導致 Raspberry Pi 系統過熱,因此只有運動物體的圖片傳送給了 Pi 上的圖片分類器,并用 TensorFlow 識別不同類型車輛。
結論
如果你對使用物聯網設備做實時圖像分類感興趣,請從這里開始:





