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 Algorithm)
  • 模型(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 文件觀看它的屬性。大?。⊿ize)是 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 開發中大展拳腳。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內容