GDE專欄 | 一個完整的示例:Android Things和TensorFlow能擦出怎樣的火花?

谷歌開發者_發表於2017-03-22

640?wx_fmt=gif


文| 谷歌開發技術專家 (GDE) 王玉成 (York Wang)


第一次閱讀本專題的朋友可移步,閱讀之前的文章:

  1. 物聯網到底是什麼?

  2. 完美支援 Android Things 的開發板都在這裡了

  3. Android Things 開發環境搭建

  4. Android 與 Android Things,父子還是兄弟?

  5. Android Things中的I2C


前面絮叨了這麼多,好像還沒有一個總體的概念,我們如何寫一個完整的程式碼呢?


現在深度學習很火那我們就在 Android Things 利用攝像頭抓拍圖片 TensorFlow 去識別影象最後用揚聲器告訴我們結果。


是不是很酷?說基本的功能就說了這麼長一串,那壘程式碼得壘多久啊?



專案結構

我們就從 Android Studio 的環始境開始說起吧。


啟動 Android Studio 之後,務必把 SDK Tools 的版本升級到 24 及以上。然後再把 SDK 升級到 Android 7.0 及以上。讓 Android Studio 自己完成相關元件的更新,匯入專案,專案的結構如下:

640?wx_fmt=png


程式碼中的 TensorflowImageClassifier 是用於跟 TensorFlow 做互動的還有攝頭的 handler 級及影象處理相關的程式碼。我們再來看看外部的引用庫。

640?wx_fmt=png


包括了 Android Things 和 TensorFlow 的相關庫,當然,Android 的 API 的版本是24。gradle 的依賴和 Manifest 中的 filer 是和之前搭建開發環境的講解一致的。

引用的 TensorFlow 的庫,是 aar 打包的 Tensorflow-Android-Inference-alpha-debug.aar,這就意味著我們不需要 NDK 環境就能夠編譯整個專案了。

640?wx_fmt=png


主要是留意 dependencies 這一項,包括了 TensorFlow 的庫和 Android Things 的庫:

640?wx_fmt=png


再申請了攝頭相關的許可權。補充一下,Android Things 是不支援動態許可權的申請的。



硬體連線

接下來便是硬體如何連線了。


640?wx_fmt=png


硬體清單如下:

  • Android Things 相容的開發板,比如 Raspberry Pi 3

  • Android Things 相容的攝像頭,比如 Raspberry Pi 3 攝頭模組

  • 元器件:

  • 1 個按鈕,見面包板

  • 2 個電阻這塊兒必須要說明一下由於硬體連線的示意圖是接的 5V 的電壓一般來說 GPIO  LED 的承壓能力是 3V,有些 GPIO 是相容 5V 所以中間需要串聯 100~200 歐的電阻。

  • 1 個 LED 燈

  • 1 個麵包板

  • 杜邦線若干

  • 可選:揚聲器或者耳機

  • 可選:HDMI輸出


連完了硬體,我們這時候就要理解操作流程了。



操作流程

按照前面講解的內容,用 Andorid Studio,連線 ADB,配置好開發板的 Wi-Fi,然後把應用載入到開發板上。


操作流程如下:

  1. 重啟裝置,執行程式,直到 LED 燈開始閃爍;

  2. 把鏡頭對準貓啊,狗啊,或者一些傢俱;

  3. 按下開關,開始拍攝圖片;

  4. 在 Raspberry Pi 3 中,一般在 1s 之內,可以完成圖片抓拍,經 Tensorflow 處理,然後再通過 TTS 放出聲音。在執行的過程中 LED 燈是熄滅的;

  5. Logcat 中會列印出最終的結果,如果是有顯示裝置連線的話,圖片和結果都會顯示出來;

  6. 如果有揚聲器或者是耳機的話,會把結果語音播報出來。


由於程式碼的結構特別簡單,注意一下幾段關健的操作即可。想必圖形、攝頭的操作在Android 的程式設計中大家都會了,所以不做講解了。


主要是看 LED 的初始化操作:

640?wx_fmt=png


有必要說一下,ImageClassifierActivity 是應用唯一的 Activity 的入口。在 Manifest 中已經有定義它初始化了 LED,  Camera, TensorfFlow 等元件。其中我們用到的 Button BCM32 這個管腳用到的 LED  BCM6 管腳相關的初始化在這個 Activity 中已經完成。

640?wx_fmt=png


這部分程式碼是捕捉按鍵按下的程式碼。當按下按鍵時,攝頭開始捕捉資料。


把攝像頭拍攝的資料轉成 Bitmap 資料之後我們會呼叫 TensorFlow 來處理影象。

640?wx_fmt=png


這個函式呼叫了 TensorFlow 進行處理,最後把結果輸出到 logcat 中。如果程式碼中呼叫了 tts 引擎,那麼則把結果轉成語音讀出來。看來,最重要的就是 TensorFlowClassifier 類的 recognizeImage() 這個介面了。我們繼續往下看。

640?wx_fmt=png


這是最後的一步,呼叫 TensorFlow 進行影象識別:

  1. 把 Bitmap 影象轉成 TensorFlow 能夠識別的資料;

  2. 把資料拷到 TensorFlow 中;

  3. 識別出影象,給出結果。


呼叫 TensorFlow 的過程還是挺好玩的,也挺方便。那麼,為啥 TensorFlow 一下子就能夠識別出是什麼圖片呢?Tensorflow 的官網給出的解答:

www.tensorflow.org/tutorials/image_recognition


有一點需要提示,TensorFlow 的影象識別分類可以用提交到網路伺服器識別也可以在本地用離線資料識別。可以先把 200M 左右的識別資料放在本地然後進行本地識別。現在大概能分出 1000 個類別的影象 1000 個類別呢專案程式碼中已經包含了哦。


是不是運用 TensorFlow 來處理物聯網的資料會特別簡單,不光是 TensorFlow, Firebase 也可以用到 Android Things 中來。這功能,強大的沒話說了!


今天提到的這個專案,來源於 Google 在 GitHub 上維護的專案,專案的地址是

github.com/androidthings/sample-tensorflow-imageclassifier


當然,GitHub 上還有很多 Android Things 的程式碼可以參考。


是不是迫不急待的自己寫一個應用呢?實際上,這個專案稍加改動便能有新的玩法。例如加上一個紅外感應器,一旦有生物在附近就馬上拍圖片,並且識別。


展開你的腦洞吧 :-)



後記

640?wx_fmt=png


這一篇文章是這個專題的最後一篇了。寫完整個專題,發現 Android Things 帶給開發者太多太多的便利,如何燒寫檔案?如何運用 SDK?甚至如何用 Google 的其它服務做物聯網相關的資料處理?都有太多太多的現成的方案供我們選擇,感嘆使用 Android Things 進行物聯網應用開發實在太方便了!


您如果有任何涉及到 Android Things 方面的想法,都歡迎大家在下方留言,我們會把好的建議轉交給 Android Things 的產品部門。也許在某一天,你的建議就是 Andorid Things 的一部分。


640?wx_fmt=png


3.22 Google Doodle: 納吾肉孜節(哈薩克)

640?wx_fmt=gif

640?wx_fmt=gif

相關文章