Úvod do CoreML v Xamarin.iOS
CoreML přináší strojové učení do iOS – aplikace můžou využívat natrénované modely strojového učení k provádění nejrůznějších úloh, od řešení problémů až po rozpoznávání obrázků.
Tento úvod popisuje následující:
Začínáme s CoreML
Tento postup popisuje, jak přidat CoreML do projektu iOS.
1. Přidání modelu CoreML do projektu
Do adresáře Resources projektu přidejte model CoreML (soubor s příponou .mlmodel).
Ve vlastnostech souboru modelu je jeho akce sestavení nastavena na CoreMLModel. To znamená, že se při sestavení aplikace zkompiluje do souboru .mlmodelc .
2. Načtení modelu
Načtěte model pomocí MLModel.Create
statické metody:
var assetPath = NSBundle.MainBundle.GetUrlForResource("NameOfModel", "mlmodelc");
model = MLModel.Create(assetPath, out NSError error1);
3. Nastavení parametrů
Parametry modelu se předávají a odkládají pomocí třídy kontejneru, která implementuje IMLFeatureProvider
.
Třídy zprostředkovatele funkcí se chovají jako slovník řetězců a MLFeatureValue
s, kde každá hodnota funkce může být jednoduchý řetězec nebo číslo, pole nebo data nebo vyrovnávací paměť pixelů obsahující obrázek.
Kód zprostředkovatele funkce s jednou hodnotou je uvedený níže:
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
}
Pomocí tříd, jako je tato, lze vstupní parametry poskytnout způsobem, který je pochopit CoreML. Názvy funkcí (například myParam
v příkladu kódu) musí odpovídat očekávanému modelu.
4. Spuštění modelu
Použití modelu vyžaduje, aby poskytovatel funkcí vytvořil instanci a nastavil parametry a pak volal metodu GetPrediction
:
var input = new MyInput {MyParam = 13};
var outFeatures = model.GetPrediction(inputFeatures, out NSError error2);
5. Extrahování výsledků
Výsledek outFeatures
předpovědi je také instance IMLFeatureProvider
; výstupní hodnoty lze získat přístup pomocí GetFeatureValue
názvu každého výstupního parametru (například ), jako theResult
je v tomto příkladu:
var result = outFeatures.GetFeatureValue("theResult").DoubleValue; // eg. 6227020800
Použití CoreML s architekturou Vision Framework
CoreML lze také použít ve spojení s architekturou Zpracování obrazu k provádění operací s obrázkem, jako je rozpoznávání obrazců, identifikace objektů a další úlohy.
Následující postup popisuje, jak se dá CoreML a Vision používat společně. Ukázka kombinuje rozpoznávání obdélníků z architektury Vision s modelem MNINSTClassifier CoreML k identifikaci ručně psané číslice ve fotografii.
1. Vytvoření modelu Vision CoreML
Model CoreML MNISTClassifier se načte a pak zabalí do VNCoreMLModel
modelu, který model zpřístupní pro úlohy zpracování obrazu. Tento kód také vytvoří dva požadavky zpracování obrazu: nejprve pro vyhledání obdélníků na obrázku a následné zpracování obdélníku pomocí modelu 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);
Třída stále potřebuje implementovat HandleRectangles
a HandleClassification
metody pro požadavky zpracování obrazu, jak je znázorněno v krocích 3 a 4 níže.
2. Zahájení zpracování obrazu
Následující kód zahájí zpracování požadavku. V ukázce CoreMLVision se tento kód spustí poté, co uživatel vybral obrázek:
// 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);
});
Tato obslužná rutina předá ciImage
architekturu VNDetectRectanglesRequest
Vision vytvořenou v kroku 1.
3. Zpracování výsledků zpracování obrazu
Po dokončení detekce obdélníku provede metodu HandleRectangles
, která ořízl obrázek tak, aby extrahovali první obdélník, převede obdélníkový obrázek na stupně šedé a předá ho do modelu CoreML pro klasifikaci.
Parametr request
předaný této metodě obsahuje podrobnosti požadavku vision a pomocí GetResults<VNRectangleObservation>()
metody vrátí seznam obdélníků nalezených na obrázku. První obdélník observations[0]
se extrahuje a předá modelu 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);
});
}
Inicializoval ClassificationRequest
se v kroku 1, aby se použila HandleClassification
metoda definovaná v dalším kroku.
4. Zpracování CoreML
Parametr request
předaný této metodě obsahuje podrobnosti požadavku CoreML a pomocí GetResults<VNClassificationObservation>()
této metody vrátí seznam možných výsledků seřazených podle spolehlivosti (nejvyšší spolehlivost první):
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}%";
});
}