Xamarin.iOS 中的 CoreML 簡介
CoreML 將機器學習帶入 iOS – 應用程式可以利用定型的機器學習模型來執行各種工作,從解決問題到影像辨識。
本簡介涵蓋下列各項:
CoreML 用戶入門
這些步驟說明如何將 CoreML 新增至 iOS 專案。
1.將 CoreML 模型新增至專案
將 CoreML 模型(擴展名為 .mlmodel 的檔案)新增至 專案的 Resources 目錄。
在模型檔案的屬性中,其 [建置] 動作 會設定為 CoreMLModel。 這表示它會在建置應用程式時編譯成 .mlmodelc 檔案。
2.載入模型
使用 MLModel.Create
靜態方法載入模型:
var assetPath = NSBundle.MainBundle.GetUrlForResource("NameOfModel", "mlmodelc");
model = MLModel.Create(assetPath, out NSError error1);
3.設定參數
模型參數會使用實作 的 IMLFeatureProvider
容器類別來傳入和傳出。
特徵提供者類別的行為就像字串和 MLFeatureValue
的字典,其中每個特徵值可以是簡單的字串或數位、陣列或數據,或是包含影像的圖元緩衝區。
單一值功能提供者的程式代碼如下所示:
public class MyInput : NSObject, IMLFeatureProvider
{
public double MyParam { get; set; }
public NSSet<NSString> FeatureNames => new NSSet<NSString>(new NSString("myParam"));
public MLFeatureValue GetFeatureValue(string featureName)
{
if (featureName == "myParam")
return MLFeatureValue.FromDouble(MyParam);
return MLFeatureValue.FromDouble(0); // default value
}
使用這類類別時,可以使用 CoreML 所瞭解的方式提供輸入參數。 特徵的名稱(例如 myParam
在程式碼範例中),必須符合模型預期的名稱。
4.執行模型
使用模型需要具現化功能提供者並設定參數,然後 GetPrediction
呼叫 方法:
var input = new MyInput {MyParam = 13};
var outFeatures = model.GetPrediction(inputFeatures, out NSError error2);
5.擷取結果
預測結果 outFeatures
也是 的 IMLFeatureProvider
實例;輸出值可以使用 搭配每個輸出參數的名稱來存取 GetFeatureValue
,如 theResult
下列範例所示:
var result = outFeatures.GetFeatureValue("theResult").DoubleValue; // eg. 6227020800
搭配視覺架構使用 CoreML
CoreML 也可以與視覺架構搭配使用,以在影像上執行作業,例如圖形辨識、對象識別和其他工作。
下列步驟說明 CoreML 和 Vision 如何搭配使用。 此範例結合 視覺架構中的矩形辨識 與 MNINSTClassifier CoreML 模型,以識別相片中的手寫數位。
1.建立 Vision CoreML 模型
CoreML 模型 MNISTClassifier 會載入,然後包裝在 中 VNCoreMLModel
,讓模型可供視覺工作使用。 此程式代碼也會建立兩個視覺要求:先尋找影像中的矩形,然後使用 CoreML 模型處理矩形:
// Load the ML model
var bundle = NSBundle.MainBundle;
var assetPath = bundle.GetUrlForResource("MNISTClassifier", "mlmodelc");
NSError mlErr, vnErr;
var mlModel = MLModel.Create(assetPath, out mlErr);
var model = VNCoreMLModel.FromMLModel(mlModel, out vnErr);
// Initialize Vision requests
RectangleRequest = new VNDetectRectanglesRequest(HandleRectangles);
ClassificationRequest = new VNCoreMLRequest(model, HandleClassification);
類別仍然需要針對視覺要求實 HandleRectangles
作 和 HandleClassification
方法,如下面的步驟 3 和 4 所示。
2.啟動視覺處理
下列程式代碼會開始處理要求。 在 CoreMLVision 範例中,此程式代碼會在使用者選取映射之後執行:
// Run the rectangle detector, which upon completion runs the ML classifier.
var handler = new VNImageRequestHandler(ciImage, uiImage.Orientation.ToCGImagePropertyOrientation(), new VNImageOptions());
DispatchQueue.DefaultGlobalQueue.DispatchAsync(()=>{
handler.Perform(new VNRequest[] {RectangleRequest}, out NSError error);
});
此處理程式會將 傳遞 ciImage
至步驟 1 中建立的視覺架構 VNDetectRectanglesRequest
。
3.處理視覺處理的結果
矩形偵測完成後,它會執行 HandleRectangles
方法,以裁剪影像以擷取第一個矩形、將矩形影像轉換成灰階,並將它傳遞給 CoreML 模型以進行分類。
request
傳遞給這個方法的參數包含視覺要求的詳細數據,並使用 GetResults<VNRectangleObservation>()
方法,它會傳回影像中找到的矩形清單。 第一個矩形 observations[0]
會擷取並傳遞至 CoreML 模型:
void HandleRectangles(VNRequest request, NSError error) {
var observations = request.GetResults<VNRectangleObservation>();
// ... omitted error handling ...
var detectedRectangle = observations[0]; // first rectangle
// ... omitted cropping and greyscale conversion ...
// Run the Core ML MNIST classifier -- results in handleClassification method
var handler = new VNImageRequestHandler(correctedImage, new VNImageOptions());
DispatchQueue.DefaultGlobalQueue.DispatchAsync(() => {
handler.Perform(new VNRequest[] {ClassificationRequest}, out NSError err);
});
}
ClassificationRequest
已在步驟 1 中初始化,HandleClassification
以使用下一個步驟中定義的方法。
4.處理 CoreML
request
傳遞至此方法的參數包含 CoreML 要求的詳細數據,並使用 GetResults<VNClassificationObservation>()
方法,它會傳回依信賴順序排序的可能結果清單(最信賴度優先):
void HandleClassification(VNRequest request, NSError error){
var observations = request.GetResults<VNClassificationObservation>();
// ... omitted error handling ...
var best = observations[0]; // first/best classification result
// render in UI
DispatchQueue.MainQueue.DispatchAsync(()=>{
ClassificationLabel.Text = $"Classification: {best.Identifier} Confidence: {best.Confidence * 100f:#.00}%";
});
}