CoreML是iOS 11新推出的機器學習框架,是人工智能的核心內(nèi)容,他可以在訓練好的機器學習模型應用到APP中

所謂已訓練模型 (trained model)指的是對一組訓練數(shù)據(jù)應用了某個機器學習算法后,所生成的一組結(jié)果Core ML 是領域特定 (domain-specific) 框架和功能的基礎所在。Core ML 為 Vision 提供了圖像處理的支持,為 Foundation 提供了自然語言處理的支持(例如 NSLinguisticTagger 類),為 GameplayKit 提供了對學習決策樹 (learned decision tree) 進行分析的支持。Core ML 本身是基于底層基本類型而建立的,包括 Accelerate、BNNS 以及 Metal Performance Shaders 等。
獲取模型
Core ML 支持多種機器學習模型,其中包括了神經(jīng)網(wǎng)絡 (Neural Network)、組合樹 (Tree Ensemble)、支持向量機 (Support Vector Machine) 以及廣義線性模型 (Generalized Linear Model)。Core ML 的運行需要使用 Core ML 模型格式(也就是以 .mlmodel 擴展名結(jié)尾的模型)。
Apple 提供了一些常見的開源模型供大家使用,這些模型已經(jīng)使用了 Core ML 模型格式。您可以自行下載這些模型,然后就可以開始在應用中使用它們了。
工程實例
首先因為CoreML和Vision都是iOS 11才有的功能,你要確保Xcode9和iOS 11的設備,當然模擬器也可以。開發(fā)語言使用Swift4
-
將模型添加到Xcode中
創(chuàng)建工程并引入模型文件
Snip20171121_6.png
單擊這個文件就可以看到這個模型的詳細信息
Snip20171121_7.md.png
下面是這個模型的官方介紹Detects the dominant objects present in an image from a set of 1000 categories such as trees, animals, food, vehicles, people, and more.大意為可以從1000個類別中篩選傳樹木、動物、食品、汽車、人等等。
-
模型解讀
inputs中寫了需要一個image 大小299*299;outputs里會有兩個參數(shù)classLabelProbs和classLabel
,classLabelProbs是一個[string:Double]的字典數(shù)組,數(shù)組里每一個字典就是這個輸入圖片分析得出可能的一個結(jié)果string就是對圖片類型的描述,而double就是可能性百分比。另一個classLabel就是最有可能的一個一個結(jié)果描述Model Class下面有這個類文件點進去可以看到如下三個類
input輸入源,可以看到它需要一個CVPixelBuffer格式的圖片作為輸入
output可以看到輸出的兩個參數(shù)classLabel和classLabelProbs正式我們上面有介紹過的所有可能的結(jié)果數(shù)組與最有可能的結(jié)果描述
Snip20171121_9.md.png
inceptionv3調(diào)用這個類的Prediction方法來開始進行分析
Snip20171121_10.md.png 編寫代碼
定義一個imageView,一個Label,一個button
點擊按鈕打開相冊選取圖片,選取完成執(zhí)行下面的方法,然后再label顯示分析結(jié)果
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 {
// 調(diào)用model的prediction方法進行分析
let output = try model.prediction(image: pixelBuffer)
// 打印輸出結(jié)果
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)
}
}
運行效果


Demo
??Demo下載
如果有幫助煩請點star





