初探 iOS 機器學習

Apple 隨著 iOS 11 一併推出 CoreML,可以快速將機器學習模型整合至 iOS app。以下將示範如何入手以 iOS 進行機器學習,即開發一款應用程式,使用預先訓練好的模型進行圖像分類。

1*3POam-fIxhFc9WQybTgGeA

這裡所使用的是 MobileNet 模型,另還有一些由 Apple 所提供的模型可在此取用。 這些裝置主要用於推演而非訓練。在此假設讀者已熟悉 iOS,故我們直接切入正題。步驟如下:

1. 由此下載機器學習模型,拖放到 Xcode 計畫案目錄中,務必選擇計畫案的目標成員資格。

2. 由於此應用程式的目的在於圖像分類,因此應採用亦於 iOS 11 所引入的 Vision 框架。Apple 對 Vision 框架的說明為:「高效能圖像分析和電腦視覺技術,以識別人臉、偵測特徵,並針對圖像和視訊中的場景進行分類。」

import CoreML
import Vision

3. 接下來用 VNCoreMLRequest 方法向 CoreML 模型發出圖像分析請求來處理圖像。要注意的是,VNCoreMLRequest 需要 VNCoreMLModel 類別模型和 completion handler(完成處理程序),因此我們要用以下程式行來轉換模型:

let modelFile = MobileNet()
let model = try! VNCoreMLModel(for: modelFile.model)

4. 接下來編寫 completion handler(完成處理程序),抽取出最高機率的結果

func processResults(request: VNRequest, error: Error?) {

guard let results = request.results as? [VNClassificationObservation] else {

fatalError(“Could not get results from ML Vision requests")

}
var bestPrediction = “"
var bestConfidence: VNConfidence = 0
for classification in results {

if classification.confidence > bestConfidence {

bestConfidence = classification.confidence
bestPrediction = classification.identifier

}

}
self.resultLabel.text = “\(bestPrediction) with confidence of \(bestConfidence) of 1″

}

5. 向 CoreML 送出圖像分析請求以處理圖像

let request = VNCoreMLRequest(model: model, completionHandler: processResults)

6. 最後,需要一個物件針對 VNImageRequestHandler 類別中的圖像來處理一個或多個圖像請求。

let handler = VNImageRequestHandler(data: imageData)

注意事項:

  • 這以位元組來處理圖像資料而非 UIImage,是出於性能考量,CoreModel 要求的不是 UIImage,而是 CVPixelBuffer 類型的資料
  • Vision 框架負責處理 CVPixelBuffer 資料的轉換

7. 執行請求

try! handler.perform([ request ])

如想進一步了解 Core ML 相關資訊,請參考 Apple 網站上的 Core ML 文件