GDE專欄 | 一個完整的示例:Android Things和TensorFlow能擦出怎樣的火花?
文| 谷歌開發技術專家 (GDE) 王玉成 (York Wang)
第一次閱讀本專題的朋友可移步,閱讀之前的文章:
前面絮叨了這麼多,好像還沒有一個總體的概念,我們如何寫一個完整的程式碼呢?
現在深度學習很火,那我們就在 Android Things 中,利用攝像頭抓拍圖片,讓 TensorFlow 去識別影象,最後用揚聲器告訴我們結果。
是不是很酷?說基本的功能就說了這麼長一串,那壘程式碼得壘多久啊?
專案結構
我們就從 Android Studio 的環始境開始說起吧。
啟動 Android Studio 之後,務必把 SDK Tools 的版本升級到 24 及以上。然後再把 SDK 升級到 Android 7.0 及以上。讓 Android Studio 自己完成相關元件的更新,匯入專案,專案的結構如下:
程式碼中的 TensorflowImageClassifier 是用於跟 TensorFlow 做互動的,還有攝頭的 handler 級及影象處理相關的程式碼。我們再來看看外部的引用庫。
包括了 Android Things 和 TensorFlow 的相關庫,當然,Android 的 API 的版本是24。gradle 的依賴和 Manifest 中的 filer 是和之前搭建開發環境的講解一致的。
引用的 TensorFlow 的庫,是 aar 打包的 Tensorflow-Android-Inference-alpha-debug.aar,這就意味著我們不需要 NDK 環境就能夠編譯整個專案了。
主要是留意 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,然後把應用載入到開發板上。
操作流程如下:
重啟裝置,執行程式,直到 LED 燈開始閃爍;
把鏡頭對準貓啊,狗啊,或者一些傢俱;
按下開關,開始拍攝圖片;
在 Raspberry Pi 3 中,一般在 1s 之內,可以完成圖片抓拍,經 Tensorflow 處理,然後再通過 TTS 放出聲音。在執行的過程中 LED 燈是熄滅的;
Logcat 中會列印出最終的結果,如果是有顯示裝置連線的話,圖片和結果都會顯示出來;
如果有揚聲器或者是耳機的話,會把結果語音播報出來。
由於程式碼的結構特別簡單,注意一下幾段關健的操作即可。想必圖形、攝頭的操作在Android 的程式設計中大家都會了,所以不做講解了。
主要是看 LED 的初始化操作:
有必要說一下,ImageClassifierActivity 是應用唯一的 Activity 的入口。在 Manifest 中已經有定義,它初始化了 LED, Camera, TensorfFlow 等元件。其中,我們用到的 Button 是 BCM32 這個管腳,用到的 LED 是 BCM6 管腳,相關的初始化在這個 Activity 中已經完成。
這部分程式碼是捕捉按鍵按下的程式碼。當按下按鍵時,攝頭開始捕捉資料。
把攝像頭拍攝的資料轉成 Bitmap 資料之後,我們會呼叫 TensorFlow 來處理影象。
這個函式呼叫了 TensorFlow 進行處理,最後把結果輸出到 logcat 中。如果程式碼中呼叫了 tts 引擎,那麼則把結果轉成語音讀出來。看來,最重要的就是 TensorFlowClassifier 類的 recognizeImage() 這個介面了。我們繼續往下看。
這是最後的一步,呼叫 TensorFlow 進行影象識別:
把 Bitmap 影象轉成 TensorFlow 能夠識別的資料;
把資料拷到 TensorFlow 中;
識別出影象,給出結果。
呼叫 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 的程式碼可以參考。
是不是迫不急待的自己寫一個應用呢?實際上,這個專案稍加改動便能有新的玩法。例如加上一個紅外感應器,一旦有生物在附近就馬上拍圖片,並且識別。
展開你的腦洞吧 :-)
後記
這一篇文章是這個專題的最後一篇了。寫完整個專題,發現 Android Things 帶給開發者太多太多的便利,如何燒寫檔案?如何運用 SDK?甚至如何用 Google 的其它服務做物聯網相關的資料處理?都有太多太多的現成的方案供我們選擇,感嘆使用 Android Things 進行物聯網應用開發實在太方便了!
您如果有任何涉及到 Android Things 方面的想法,都歡迎大家在下方留言,我們會把好的建議轉交給 Android Things 的產品部門。也許在某一天,你的建議就是 Andorid Things 的一部分。
3.22 Google Doodle: 納吾肉孜節(哈薩克)
相關文章
- 小程式與WebRTC聯姻能擦出怎樣的火花?Web
- GDE專欄 | Android Things中的I2CAndroid
- GDE專欄 | Android Things開發環境搭建Android開發環境
- GDE專欄 | Android與Android Things,父子還是兄弟?Android
- 當RPA遇上AI,會擦出怎樣的火花?AI
- 低程式碼搭上AIGC,會擦出怎樣的火花?AIGC
- Android Things 專題6 完整的栗子:運用TensorFlow解析影象Android
- Android Things 專題6 完整的栗子:運用TensorFlow解析影像Android
- ChatGPT與資料庫能擦出什麼火花ChatGPT資料庫
- GDE專題 | 完美支援Android Things的開發板都在這裡了Android
- 當Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth會擦出怎樣的火花SpringCloud
- XKey變廢為寶,區塊鏈碰撞分享經濟將擦出怎樣的火花?區塊鏈
- 當中國傳統文化IP與NFT撞個滿懷,能擦出什麼火花
- AI和網路的結合,會碰撞出怎樣的火花?AI
- 百度CTO王海峰對話王辰院士:大資料與抗疫會摩擦出怎樣的火花?大資料
- AI與線上業務的結合,究竟會擦出什麼火花?AI
- A/Btest——視覺設計與資料增長擦出的火花視覺
- GDE專欄 | Web開發資源彙總Web
- 例項分享:深度學習與音樂製作的碰撞能產生怎樣的火花?深度學習
- 一個完整的scrapy 專案
- GDE專欄 | 物聯網到底是什麼?
- 美顏api和AI智慧美妝碰撞出了怎樣的火花?APIAI
- 當 RocketMQ 遇上 Serverless,會碰撞出怎樣的火花?MQServer
- Android 完整版的下載示例Android
- 疫情之下,大資料和物流行業將“碰撞出怎樣的火花”?大資料行業
- 分享一個完整的社群專案(Android端加後臺)Android
- 跨境電商遇上ERP系統會擦出什麼火花
- 雲原生+新技術,會碰撞出怎樣的火花?
- 我們期待的Android Things是什麼樣子?Android
- 區塊鏈+教育行業,會碰撞出怎樣的火花?區塊鏈行業
- excel表格複製貼上格式怎麼能一模一樣 表格怎麼複製一個一模一樣的Excel
- 城市發展的舞臺上,人工智慧如何與區塊鏈擦出新的火花?人工智慧區塊鏈
- 一個android 的HAL示例中遇到的坑。Android
- 怎樣Oracle把多條記錄的相同欄位拼成一個字串Oracle字串
- 一個小而全的Python專案示例Python
- 怎樣設計一個商城專案?
- 怎樣做好一個開源專案
- 大資料到底是一個怎樣的專業大資料