Ú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. Praktický příklad najdete v ukázce Mars Habitat Pricer.

Mars Habitat Price Predictor sample screenshot

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 MLFeatureValues, 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 theResultje 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 CoreML a Vision používají společně v ukázce CoreMLVision. Ukázka kombinuje rozpoznávání obdélníků z architektury Vision s modelem MNINSTClassifier CoreML k identifikaci ručně psané číslice ve fotografii.

Image recognition of number 3Image recognition of number 5

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}%";
  });
}

Ukázky

Můžete vyzkoušet tři ukázky CoreML:

  • Ukázka prediktoru ceny za prostředí Mars Habitat má jednoduché číselné vstupy a výstupy.

  • Ukázka Vision &CoreML přijímá parametr obrázku a používá architekturu Vision k identifikaci čtvercových oblastí na obrázku, které se předávají modelu CoreML, který rozpoznává jednotlivé číslice.

  • Nakonec ukázka rozpoznávání obrázků CoreML používá CoreML k identifikaci funkcí na fotce. Ve výchozím nastavení používá menší model SqueezeNet (5 MB), ale je napsaný tak, abyste si mohli stáhnout a začlenit větší model VGG16 (553 MB). Další informace najdete v souboru readme ukázky.