初探機器學習框架Core ML
CoreML是iOS 11新推出的機器學習框架,是人工智能的核心內容,他可以在訓練好的機器學習模型應用到APP中
所謂已訓練模型 (trained model)指的是對一組訓練數據應用了某個機器學習算法后,所生成的一組結果Core ML 是領域特定 (domain-specific) 框架和功能的基礎所在。Core ML 為 Vision 提供了圖像處理的支持,為 Foundation 提供了自然語言處理的支持(例如 NSLinguisticTagger 類),為 GameplayKit 提供了對學習決策樹 (learned decision tree) 進行分析的支持。Core ML 本身是基于底層基本類型而建立的,包括 Accelerate、BNNS 以及 Metal Performance Shaders 等。
獲取模型
Core ML 支持多種機器學習模型,其中包括了神經網絡 (Neural Network)、組合樹 (Tree Ensemble)、支持向量機 (Support Vector Machine) 以及廣義線性模型 (Generalized Linear Model)。Core ML 的運行需要使用 Core ML 模型格式(也就是以 .mlmodel 擴展名結尾的模型)。
Apple 提供了一些常見的 開源模型 供大家使用,這些模型已經使用了 Core ML 模型格式。您可以自行下載這些模型,然后就可以開始在應用中使用它們了。
工程實例
首先因為CoreML和Vision都是iOS 11才有的功能,你要確保Xcode9和iOS 11的設備,當然模擬器也可以。開發語言使用Swift4
1.將模型添加到Xcode中
創建工程并引入模型文件
單擊這個文件就可以看到這個模型的詳細信息
下面是這個模型的官方介紹
Detects the dominant objects present in an image from a set of 1000 categories such as trees, animals, food, vehicles, people, and more.大意為可以從1000個類別中篩選傳樹木、動物、食品、汽車、人等等。
2.模型解讀
inputs中寫了需要一個image 大小299*299;outputs里會有兩個參數classLabelProbs和classLabel,classLabelProbs是一個[string:Double]的字典數組,數組里每一個字典就是這個輸入圖片分析得出可能的一個結果string就是對圖片類型的描述,而double就是可能性百分比。另一個classLabel就是最有可能的一個一個結果描述
Model Class下面有這個類文件點進去可以看到如下三個類
input輸入源,可以看到它需要一個CVPixelBuffer格式的圖片作為輸入
output可以看到輸出的兩個參數classLabel和classLabelProbs正式我們上面有介紹過的所有可能的結果數組與最有可能的結果描述
inceptionv3調用這個類的Prediction方法來開始進行分析
3.編寫代碼
定義一個imageView,一個Label,一個button
點擊按鈕打開相冊選取圖片,選取完成執行下面的方法,然后再label顯示分析結果
func process(_ image: UIImage) {
imageView.image = image
// 需要CVPixelBuffer格式的輸入源
guard let pixelBuffer = image.pixelBuffer(width: 299, height: 299) else {
return
}
//I have `Use of unresolved identifier 'Inceptionv3'` error here when I use New Build System (File > Project Settings) ˉ\_(ツ)_/ˉ
let model = Inceptionv3()
do {
// 調用model的prediction方法進行分析
let output = try model.prediction(image: pixelBuffer)
// 打印輸出結果
let probs = output.classLabelProbs.sorted { $0.value > $1.value }
if let prob = probs.first {
Label.text = "\(prob.key) \(prob.value)"
}
}
catch {
self.presentAlertController(withTitle: title,
message: error.localizedDescription)
}
}
運行效果