機器之心原創
參與:QW、李亞洲
一年一度的谷歌開發者大會 Google I/O 昨日在山景城開幕,在首日的 Keynote 中,谷歌宣佈了一系列新的硬件、應用、基礎研究等。而在下午面向開發者的 session 中,也有很多有關機器學習的內容值得我們學習。所以這屆 Google I/O 並非略顯乏味,反而充實了更多機器學習內容。在這篇文章中,機器之心根據視頻為大家介紹了一個面向初學者的教程:如何使用谷歌 Mobile Vision API 在手機上開發應用。
在此 Session 中,來自谷歌 Mobile Vision 團隊的 Yulong Liu、Hsiu Wang 對 Mobile Vision API 的開發應用進行了講解。
谷歌 Mobile Vision 團隊的工作是提供最新的計算機視覺算法,並在低延遲、無網絡訪問的情況下在設備上實現。而 Mobile Vision API 既能在安卓手機上部署,也能在 iOS 上部署。
在視頻中,Hisu 演示瞭如何使用 Mobile Vision 的 Face、Barcode 和 Text API。在視頻演示中,使用 Barcode API 手機掃描廣告頁上的二維碼,就能自動跳轉到產品頁;Face API 可讓你虛擬試戴產品;最後,使用 Text API 掃描信用卡快速支付。
Mobile Vision API 包含四大組件:共用 API(Common Utility API)以及上面介紹的三種特定應用 API。共用 API 提供構建應用通道的基礎設施與模塊。
1.Barcode API
支持 1D 條形碼和 2D 二維碼類型
支持多種條形碼格式
應用場景:跟蹤並識別任意條形碼或二維碼
2.Face API
捕捉臉部圖像,支持不同的角度以及非常誇張的表情
生成 Facial Landmarks 用於定位等業務
臉部表情分類
應用場景:生成用戶趣味頭像,識別商品並推薦購買方式,等等等等
3.Text API
支持 20 種以上拉丁語系語言
支持段、句、詞分析
應用場景:信用卡信息提取,名片信息提取,實時翻譯,等等等等
在詳細講解代碼之前,Hisu 先介紹了 Mobile Vision API 的基礎概念與使用案例。最簡單的使用案例就是圖像檢測:如果想要建立一個檢測器,先要提供一張圖像,然後運行算法產生檢測結果。
Google Mobile Vision (GMV) 同時支持 iOS 與 Anriod 平臺,用戶只需根據 API 與業務需求簡單地設定以下三個類即可構建完整的圖像處理 Pipeline:設定 Detector 類用於捕捉圖像內容;設定 Processor 類允許用戶靈活地處理單張或多張圖像(即 Focus 模式與 Multi 模式);最後用戶只需完整地重構 Tracker,根據圖像信息完成業務邏輯。無論是 iOS 還是 Andriod,遵循以上流程即可構建 GMV 應用。
以上是完整的流程。攝像頭源內部使用了 Camera API,它將圖像幀傳遞給檢測器,檢測器運行算法來生成檢測結果。然後結果被傳遞給處理器。處理器是首個後處理(post-processing)步驟,它負責篩除、合併、或傳遞檢測到的 item 到相關 Tracker。
總結來就是兩個步驟:
1. 配置追蹤管道;
2. 部署 Tracker 實時追蹤時間變化。
圖中的 Camera Source、Detector、Processor 都由 Mobile Vision API 提供,用戶要做的就是基於自己商業邏輯編寫代碼,實現 Tracker。
Barcode API
如今二維碼處處可見,開發手機端的二維碼掃描應用也變的非常常見。使用 Barcode API 前,只需在不同的平臺中部署相應的 Dependency。Android 平臺由 Google Play 提供服務;而在 iOS 平臺中可以使用 CocoaPods 包管理工具安裝。下面是開發安卓手機二維碼應用的代碼演示。
首先,開發者需要指定具體的編譯工具與運行環境依賴,不同的 GMV API 需要不同的依賴,開發者只需根據業務指定 android:value 為 barcode, face 或 text。在用戶第一次使用時,開發者所制定的內容會自動下載到設備中(即需要用戶連接至網絡環境中);一旦下載完成後,用戶即可在無網絡連接的環境下使用相應的 GMV 應用和服務。
完成對 Camera Source 的初始化。
接下來開發者需要根據業務需求和 GMV API 構建自己的應用。在 Detector 部分中,開發者可以指定不同的 barcode 格式用於 detector 檢測,例如 QR 二維碼或是 UPA 條形碼;接著輸入某一幀圖像或是圖片後,Detector 的實例即可自動讀取相關的信息;最後用戶可以根據需求調用 valueAt 方法獲得碼值或是使用 cornerPoints 屬性獲取對應的位置。此外,Barcode 類中還提供了標準的條碼類型,開發者可以根據不同的條碼類型對應的提取相應的信息。下圖的 Demo 展示了整個過程:
下一步就是開始 Processor 步驟:Mobile Vision API 提供兩種 Focusing Processor 和 Multi Processor。下圖演示了 Focusing Processor 類,它能讓你在多二維碼的環境中專注分析某一個二維碼,用戶可以調整設備攝像頭拍攝的位置切換至不同的二維碼。而 Multi Processor 則提供了同時處理圖像中所有二維碼的能力,開發者可以使用工廠模式進行不同二維碼的處理。
最後則是重載 Tracker 類完成所有的業務邏輯。在 Barcode 模式中,開發者至少需要定義 4 個方法來處理不同的情況:分別是處理新掃描到的碼、在未探測到新碼時如何更新當前的碼、如何處理未探測到任何碼的情況,以及完成所有任務後如何存儲文件或是關閉服務等清理操作。
整體流程如下:
Barcode API 在 iOS 系統上也可用,以下是 iOS 平臺編譯環境的依賴。
iOS 系統上的 Pipeline 與安卓系統非常相似,只是在 AVCaptureSession 類的初始化與語法上有所區別。
Face API
Face API 可以準確的捕捉用戶的臉部,但並不提供識別的支持。開發者可以使用 Face API 構建許多有趣的應用,例如根據用戶的照片生成有趣的頭像,或是聯合 Google Cloud Vision API 分析用戶的情緒。同時,Face API 允許開發者捕捉到極其誇張的面部表情,輕而易舉地幫助喜愛搞怪的用戶完成屬於他們自己的圖像應用。
Facial Landmarks 則是另一項特性,該特性可以定位用戶面部的特徵,如眼睛與嘴巴。該項功能允許開發者實時地追蹤用戶面部並完成相應的業務,如在視頻中為用戶添加酷炫的太陽鏡。
臉部表情分類的特性允許開發者實時地獲取用戶的表情信息,如用戶眼睛是否睜開,或用戶是否在微笑;根據這些信息開發者可以高度定製自己的業務。
儘管 Face API 功能豐富,其使用方法卻與 Barcode API 一樣簡單,程序的邏輯也基本一致。首先設置運行依賴中的 android:value 為 face,接下來完成對 Detector 類、Processor 類與 Tracker 類的設置與業務邏輯。
在 Face Detector 類中,開發者可以調用多種方法獲取圖像中用戶臉部的位置、對應表情的概率以及 Facial Landmarks 用於之後的處理。
下圖展示了單個臉部的追蹤代碼,開發者可以使用 LargestFaceFocusingProcessor 類來指定捕捉單個面部表情。這個類可以將 detector 實例捕捉到的圖像進行處理並將結果傳至 tracker 實例完成相應的業務。
多個臉部的實時處理並沒有太多不同,開發者只要使用 MultiProcessor 類對圖像進行處理,同時重載 Tracker 方法使用工廠模式對多個臉部進行處理。下圖代碼中高亮的部分則是使用 MultiProcessor 與 FocusingProcessor 不同的地方。
在 Tracker 的定義中,開發者需要指定不同的方法來處理以下兩種情況:第一次檢測到用戶面部時應該如何處理,如根據 landmarks 為用戶立刻添加一副墨鏡;實時地追蹤用戶的面部相對位置的變化與拍攝角度的變化,調整當前的添加的墨鏡位置。下圖為簡單的定義:
以上為 Face API 在安卓系統的 Demo,我們可以看到使用該 API 可以簡單高效地構建不同的應用。在 iOS 系統上,整體流程仍然大致相同:
Text API
Text API 目前只支持基於拉丁語系的語言,並不支持中文,這使得該 API 對於國內的開發者而言並無太多驚喜可言。然而,對於需要處理英文或其他語言的業務該 API 則允許開發者從段、句、詞等不同角度進行分析與信息提取。下圖中 textRecognizer 實例允許開發者使用 getLanguage 方法獲取語言,這意味著開發者無需進行任何假設即可實時自動地獲得當前的語言信息;getBoundingBox 方法允許開發者處理文字的相對位置,標準化輸入輸出的格式;getValue 方法允許開發者獲取整段的文字信息,或是迭代式的使用 getComponents 方法獲取句、詞信息。至於整體的 Text API 使用流程,經過 Barcode 和 Face 的介紹後,相信大家已經十分熟悉了。幾乎相同的流程,允許開發者快速地上手不同的 API,部署不同的應用。
Tips:
由於 GMV API 有大約 60 毫秒的延遲,避免將 Detector 部署在 UI 線程,而在後臺線程中可保證最佳的用戶體驗避免卡頓的畫面。
儘可能的在使用 API 前完成圖像的預處理。實際應用中,用戶不可避免地會處於光線較差或是抖動的拍攝環境中,精細的圖像預處理可以幫助 API 獲取更清晰的圖像,從而提高使用的效率與準確率。
與 Google Cloud Vision API 共同使用。GMV API 提供了低延遲、無網絡訪問的情況下基本的圖像識別與處理功能,而開發者可以在本地設備處理圖像後聯合使用 GCV API 獲得更加豐富的功能。例如:GMV 可以在實時拍攝的視頻中不斷檢索判斷圖像中是否出現面部表情或圖像質量是否適合 GCV 使用,一旦滿足使用條件即可使用 GCV 提供的高級功能判斷用戶的情緒狀態等。
更多有關 Mobile Vision API 的資源,可查看下圖:
今年的谷歌 I/O 大會有大量關於機器學習、TensorFlow 的技術 session,機器之心會持續為大家進行介紹。