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