1. 程式人生 > >TensorFlow on Android:物體識別

TensorFlow on Android:物體識別

說在前面:達人課是GitChat的一款輕閱讀產品,由特約講師獨家釋出。每一個課程你都可獲得6-12篇的深度文章,同時可在讀者圈與講師互動交流。GitChat達人課,讓技術分享更簡單。進入我的GitChat

這裡寫圖片描述

作者介紹

付強,十餘年從業經驗,從 C 語言到 Web 開發,從微服務架構到移動端開發,涉獵範圍很廣。曾就職於趨勢科技、諾基亞,在德國和矽谷的 Startups 工作過,現在從事物聯網方向的創業。

課程介紹

本課程講解如何在 Android 上面執行 TensorFlow,並利用基於 TensorFlow 的 Object Detection API 來實現一個可以識別靜態圖片中的物體的應用,並通過該過程讓沒有任何機器學習基礎的讀者瞭解機器學習在移動端的使用場景和流程,包括如何載入模型、如何準備輸入資料、如何解析推理結果。完成本課程以後,還可以學習其他應用的課程。

檢視原文

深度學習、神經網路、人工智慧應該是當下最火爆的字眼了,隨著 AlphaGo 的一炮走紅,彷彿人人都談論著人工智慧,說話不帶 DL、CNN 這些字眼的就落伍了。

各大巨頭也紛紛在 AI 領域佈局,目前比較流行的深度學習框架有:

  • 谷歌的開源深度學習框架 TensorFlow
  • Facebook 的開源深度學習框架 Torchnet
  • 百度的開源深度學習框架 Paddle
  • 源自伯克利的 Caffe
  • 基於 Theano/TensorFlow 的 Keras
  • ……

當大家還在討論人工智慧、機器學習前景的時候,有幾件有趣的事情發生了:

  1. Facebook 在 2016 年的時候釋出了 Caffe2go,移動端的深度學習庫;
  2. 2017年 Google IO 上面釋出了 TensorFlow Lite,移動端的神經網路庫;
  3. 騰訊優圖開源了 ncnn,實現深度神經網路在移動端的落地。

等一下,讀者可能會感覺到有個問題:什麼, 在移動端進行機器學習?機器學習不是應該需要海量的資料和計算資源嗎(CPU/GPU)?移動裝置的儲存和計算能力能滿足要求嗎?在回答這個問題之前,來看看下面這一個場景:你需要完成一個人臉檢測的 App 應用,但是你們公司沒有機器學習的專家,怎麼辦?

當然,這個難不倒大家,在這個時代最不缺的就是輪子了,各大平臺都有開放的 API 共大家呼叫,比如:

  • Google Vision API
  • 騰訊優圖
  • 百度人臉識別 API
  • Face++
  • 訊飛雲平臺人臉相關 API
  • ….

使用開放的 API 有很多優點,比如:

  1. 不需要任何機器的學習的基礎,對於小團隊來說能夠快速實現產品;
  2. 使用簡單,只需要通過 HTTP 介面將圖片和相關引數上送到伺服器,就能馬上得到結果;
  3. 能夠及時的享受到大平臺的海量資料和計算資源對識別模型的優化和修正。

但是也有明顯的缺點:

  1. 需要移動端能訪問網際網路,上傳圖片需要消耗流量較大,在弱網路環境下,特別是對一些物聯網裝置的限制比較大;
  2. API 呼叫需要付費,特別是為了實現 SLA 更需要付出額外的成本;
  3. 資料安全存在隱患,特別是人臉這樣的敏感資料;
  4. 雖然雲平臺有海量計算資源,但是對於單獨的 API 呼叫來講,仍然存在一定時延,沒法做到實時檢測。

現在讓我們換一種思路來解決這個問題,以目前移動裝置的儲存和計算能力,是不可能實現在移動端進行模型訓練的,當然也沒有這個必要。 但是如果在服務端利用海量的資料和計算資源訓練好模型,然後將訓練好的模型部署到移動端,只利用移動端的計算能力來進行推理(Inference,記住這個術語,當和機器學習專家討論的時候用到這個詞,他們就會認為你是懂行的),可行嗎?

答案是當然可行了, 而且隨著移動端計算能力的提升,這個將是機器學習在移動端落地的趨勢,這也是各大巨頭正在做的事情。

開始學習

坦白地說,機器學習的學習曲線是比較陡的,首先需要有一些程式設計知識和線性代數的基礎;然後要學習一些演算法並推導它們,SVM、線性迴歸、聚類演算法等,學會如何評估學習結果、學會梯度下降的推導、學會各種提取特徵的方法、PCA等;接著再去學習神經網路的概念、學會各種網路、如卷積神經網路等;開始準備資料,訓練你自己的模型,最後再調上非常長時間的各種引數….

機器學習是一個工具,一個可以用來解決現實問題的工具。如果想成為一個機器學習專家/科學家,上面的過程是必須的,因為你要成為一個製作工具的人。 但是等等,假設只是一個想使用機器學習這個工具來解決現實問題的普通工程師,該怎麼辦?

回想一下當時是怎麼從零學會 Web 程式設計的:

  1. 選一個框架,如 SSH、Rails、Django 等,照著模板依葫蘆畫瓢做一個專案;

  2. 有了整體的概念以後再去優化一下程式碼,學會一些 best practice;

  3. 研究框架,如讀讀實現程式碼;

  4. 研究 HTTP 協議,尋找可以調優的地方;

  5. 嘗試寫一個框架或者外掛;

  6. 最後成為 Web 程式設計的專家。

本課程正是遵循上述的流程,首先我們提一個現實問題,然後用開源的框架和模型來解決它,在這個過程中會了解機器學習的一些基本概念和流程(這樣就可以在喝咖啡的時候和機器學習專家談笑風聲了),然後學會如何使用這種工具。在本系列課程的後面,還將學習如何從頭訓練一個屬於你的獨一無二的模型,將學習如何優化這個工具。最後再倒過頭來去研究和推導神經網路的演算法,剩下的就看你的了!

要解決的問題

先看一張圖:

enter image description here

這個監控是不是很厲害?但是它的實現原理很簡單的(過程依然很複雜):

  1. 用大量的帶標記(圖片上的是什麼物體、處於什麼位置)的圖片資料來訓練一個模型;
  2. 用這個模型來識別視訊每一幀中的物體(人、汽車等);
  3. 將識別結果視覺化(在物體周圍畫上邊框和標籤)。
    我們要做的是這個功能的第一步,在 Android 上面選取一張圖片,識別圖片中有哪些物體,並將識別結果視覺化。完成了靜態圖片的識別,再擴充套件到實時識別視訊中的每一幀就是非常簡單的了。

接下來我們就擼起袖子開始吧~

下一篇

課程內容