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