AndroidThings和TensorFlow擦出的火花

Android Studio 圖像處理 樹莓派 GitHub IT人的那些事兒 2017-03-31

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

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

AndroidThings和TensorFlow擦出的火花

代碼中的 TensorflowImageClassifier 是用於跟 TensorFlow 做交互的,還有攝頭的 handler 級及圖像處理相關的代碼。我們再來看看外部的引用庫。

AndroidThings和TensorFlow擦出的火花

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

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

AndroidThings和TensorFlow擦出的火花

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

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

硬件連接

接下來便是硬件如何連接了。

硬件清單如下:

  • 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 的初始化操作:

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

這部分代碼是捕捉按鍵按下的代碼。當按下按鍵時,攝頭開始捕捉數據。

把攝像頭拍攝的數據轉成 Bitmap 數據之後,我們會調用 TensorFlow 來處理圖像。

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

AndroidThings和TensorFlow擦出的火花

這是最後的一步,調用 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 的代碼可以參考。

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

相關推薦

推薦中...