本文是 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 使用說明
主要操作過程分三步:
- 得到 Core ML 的模型
- 將模型導入項目中
- 用生成的 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 的原理可以分為下四步
- 用自然語義處理API統計輸入文字的單詞頻率
- 將單詞頻率輸入到 Core ML 的模型中
- Core ML 模型根據單詞頻率判斷內容為正面或負面情緒
- 根據情緒內容更新 UI
實時物體識別
文字情感分析 App 使用的是自然語義處理(NLP)的框架,而實時物體識別使用的是視覺(Vision)框架,他們兩是基于 Core ML 的最核心的兩大系統框架。
所謂實時物體識別,是指 iPhone 可以自動識別出攝像頭所對準的物品,如下圖所示。
當鏡頭對準餐桌時,機器自動識別出餐桌,并給出相似概率。類似 Google IO 大會上展示的 Google Lens。其原理是將所捕捉到的物體傳給 Core ML 的模型,讓模型實時推測出物品并更新 UI。具體的原理和代碼參見《初探 iOS 上的人工智能:Core ML》,這里不再贅述。
總結
借助 Core ML,蘋果將復雜的學習算法和模型訓練從機器學習中剝離出來,開發者無需理解其背后深奧的邏輯和計算,只需直接調用模型、在本地實時安全的運用即可。同時為了兼顧擴展性,蘋果對其他第三方機器學習框架和模型提供了 Core ML 轉換接口和工具。由于現在的 Core ML 支持模型太少,且轉換流程自定義空間不大,所以使用場景和應用也比較簡單局限。相信在未來蘋果會加快完善 Core ML,使得其能夠在 App 開發中大展拳腳。