WWDC 2017:深入淺出 Core ML

本文是 WWDC 2017 Session 703 和 710 的讀後感,其視頻及配套 PDF 文稿鏈接如下:Introducing Core ML, CoreML in Depth
本文的內容主要涵蓋 Machine Learning 基本介紹,Core ML 框架的說明和使用詳解,Core ML 的支持工具 Core ML Tools,以及相應的 App 使用場景。

Machine Learning 基本介紹

機器學習是一門人工智能的科學。它通過對經驗、數據進行分析,來改進現有的計算機算法,優化現有的程序性能。其基本流程如下圖:

如圖,機器學習有三個要素:

  • 數據(Data)
  • 學習算法(Learning Algorith)
  • 模型(Model)

以圖片分析 App 爲例,這個場景下的數據、學習算法和模型分別對應:

  • 數據:各種花的圖片。這些數據稱爲此次機器學習的樣本(Sample)。每張圖片中包含的信息,比如形狀、色彩,稱之爲特徵(Feature)。每張圖片對應的花朵,比如梅花、玫瑰,稱之爲標籤(Label)。這些圖片中蘊含着某些規律,而我們人類正是依靠這些規律判斷出圖片對應的花朵(標籤)。現在我們希望機器能夠把這個規律挖掘出來。這樣在面對新的樣本時,機器能根據其特徵,準確判斷其對應標籤,也就是判斷圖片對應的花朵。

  • 學習算法:機器學習的算法有很多,比如神經網絡、邏輯迴歸、隨機森林等等。作爲 iOS 工程師我們無需深刻理解這些算法,只要知道輸入數據後執行“學習算法”就可以得到模型。

  • 模型:即機器從樣本數據中挖掘出來的規律。有了模型之後,面對新的數據,模型就可以做出相應判斷,例如下圖圖片是鬱金香還是玫瑰。

Core ML 到底是什麼

Core ML 是蘋果爲其開發者準備的機器學習框架。支持 iOS, MacOS,tvOS,和 watchOS。它由4部分組成,其結構如下圖:

  • 最底層性能框架層:由 Acccelerate 和 Metal Performance Shaders 兩個框架組成。前者用於圖形學和數學上的大規模計算,後者用於優化與加速 GPU 和圖形渲染。

  • Core ML:支持導入機器學習的模型,並生成對應高級代碼(Swift, Objective-C)的框架。

  • 專用機器學習框架:基於 Core ML,針對特殊場景進行封裝和優化的框架。如上圖所示,Vision 框架和 NLP 框架都是 iOS 11 最新添加:前者用於圖片分析,例如人臉識別;後者用於自然語義分析,例如上下文理解。 iOS 中的 GamePlayKit 框架也屬於 Core ML 對應的專用框架,用於決策樹(Decision Tree)模型的學習。

  • 應用層:使用了這些框架之後構建起來的 App。應用場景(如下圖)十分廣泛:人臉識別,手寫文字理解,類型轉化,文字情感分析,自動翻譯,等等。

Core ML 使用說明

主要操作過程分三步:

  1. 得到 Core ML 的模型
  2. 將模型導入項目中
  3. 用生成的 Swift 接口進行編程

下面我們來分別對這三個步驟進行詳解:

得到 Core ML 的模型

蘋果官網上你可以直接拿到訓練好的模型。目前有4個:

你也可以自己訓練模型,或到第三方社區去下載別人訓練好的模型。蘋果提供了轉換器(基於 Python,開源)用於把其它機器學習框架訓練出來的模型轉化爲 Core ML 適配的模型。如下圖所示:

如何使用 Core ML Tools 進行轉化的原理和演示詳見《Core ML in Depth》文章。

將模型導入項目中

直接拖拽即可。記得右側 Target Membership 選項勾選自己的 App。你可以點擊 mlmodel 文件觀看它的屬性。大小(Size)是 App 性能的一個重要指標,輸入(Input)輸出(Output)決定了如何使用這個模型。下圖中輸入是花朵圖片,爲 image 類型。輸出有兩個值,一個是最有可能的花朵,爲 String 類型;另一個是所有可能的花朵類型即其對應的可能性,爲 String 對應 Dobule 的 Dictionary 類型。

用生成的 Swift 接口進行編程

生成的接口如下:

// 輸入
class FlowerClassifierInput {
    // 花朵圖片
    var flowerImage: CVPixelBuffer
}

// 輸出
class FlowerClassifierOutput {
    // 最有可能的花朵類型
    let flowerType: String

    // 所有可能的花朵類型即其對應的可能性
    let flowerTypeProbs: [String: Dobule]
}

// 模型
class FlowerClassifier {
    convenience init()

    // 通過輸入產生輸出
    func prediction(flowerImage: CVPixelBuffer) throws -> FlowerClassifierOutput
}

在實際代碼中調用接口進行應用:

// 調用 model
let flowerModel = FlowerClassifier()

// 利用 flower model 對輸入進行分析
if let prediction = try? flowerModel.prediction(flowerImage: image) {
    // 得到分析的結構
    return prediction.flowerType
}

Core ML 的支持和工具

現在 iOS 上可以運行的Core ML 的模型可以從蘋果官網上下載,也可以通過第三方社區下載,Caffee,Keras,LIBSVM,scikit-learn,xgboot等開源機器學習框架訓練出的模型皆可無縫轉換爲 Core ML 對應的模型。

同時,蘋果開源並展示瞭如何使用它們自己的 Core ML 模型轉換工具,它是用 Python 寫成。你可以定製轉換器和轉換模型的參數。下面我們就來看看使用 Core ML 模型轉換工具的步驟。

  • 安裝 Core ML 工具

直接在終端中輸入以下命令:

pip install -U coremltools

如果 Mac 上沒有安裝 Python,請先用命令行安裝:

brew install python

  • 轉換訓練好的模型

假如你的模型是用 caffe 訓練的,即現在有一個 .caffemodel 文件,以下步驟可以將其轉化爲蘋果支持的 .mlmodel:

// 導入 core ml 工具庫
import coremltools

// 利用 core ml 中對應的 caffee 轉化器處理 .caffemodel 模型
coreml_model = coremltools.converters.caffe.convert('XXX.caffemodel')

// 將轉化好的模型存儲爲 .mlmodel 文件
coreml_model.save('XXX.mlmodel')

確定轉化好的模型能否工作(比如檢測現有模型能否識別一張玫瑰圖片),可以直接運行:

myTestData = Image.open('rose.jpg')

XXX.mlmodel.predict('data': myTestData)

如果能正確輸出結果(預測結果應含有 rose,其預測可能性較高),那麼證明模型轉換沒有問題。

  • 定製化轉化的模型

定製轉化模型的參數,我們一般用 label.txt 文件來定義,直接傳入轉化中即可。

// 自定義模型的接口參數
labels = 'labels.txt'

// 將 labels 設爲轉換的模型參數
coreml_model = coremltools.converters.caffe.convert('XXX.caffemodel', class_labels='labels')

定製轉化的輸入數據 data 爲 image 類型:

coreml_model = coremltools.converters.caffe.convert('XXX.caffemodel', class_labels='labels', image_input_name = 'data')

指定轉換模型的描述型參數(metadata):

// 指定作者信息
coreml_model.author = 'Apple Papa'

// 指定許可證
coreml_model.license = 'MIT'

// 指定輸入('data')描述
coreml_model.input_description['data'] = 'An image of flower'

其他參數也類似設置。

目前蘋果因爲版權問題,對於 Google 的 TensorFlow 和 Amazon 的 MXNet 兩大框架支持不夠,但是這兩個框架訓練出來的模型轉換成 iOS 上對應的 Core ML 模型難度並不大,除了用蘋果自己的轉換工具外,網上也有很多開源工具可以做到。

App 使用場景

文字情感分析

所謂文字情感分析,就是根據輸入文字內容,機器自動判定文字表達的是正面還是負面情緒。蘋果示例的 App 如下:

當什麼文字都沒有的時候,App 反應的是正常情感;當文字內容爲開心或讚美時,App 會變爲笑臉;當文字內容爲傷心或抱怨時,App 會變爲苦瓜臉。整個過程爲即時反映,幾乎無延遲。

整個 App 的原理可以分爲下四步

  1. 用自然語義處理API統計輸入文字的單詞頻率
  2. 將單詞頻率輸入到 Core ML 的模型中
  3. Core ML 模型根據單詞頻率判斷內容爲正面或負面情緒
  4. 根據情緒內容更新 UI

實時物體識別

文字情感分析 App 使用的是自然語義處理(NLP)的框架,而實時物體識別使用的是視覺(Vision)框架,他們兩是基於 Core ML 的最核心的兩大系統框架。

所謂實時物體識別,是指 iPhone 可以自動識別出攝像頭所對準的物品,如下圖所示。

image

當鏡頭對準餐桌時,機器自動識別出餐桌,並給出相似概率。類似 Google IO 大會上展示的 Google Lens。其原理是將所捕捉到的物體傳給 Core ML 的模型,讓模型實時推測出物品並更新 UI。具體的原理和代碼參見《初探 iOS 上的人工智能:Core ML》,這裏不再贅述。

總結

藉助 Core ML,蘋果將複雜的學習算法和模型訓練從機器學習中剝離出來,開發者無需理解其背後深奧的邏輯和計算,只需直接調用模型、在本地實時安全的運用即可。同時爲了兼顧擴展性,蘋果對其他第三方機器學習框架和模型提供了 Core ML 轉換接口和工具。由於現在的 Core ML 支持模型太少,且轉換流程自定義空間不大,所以使用場景和應用也比較簡單侷限。相信在未來蘋果會加快完善 Core ML,使得其能夠在 App 開發中大展拳腳。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章