Aracılığıyla paylaş


Xamarin.iOS'ta CoreML'ye Giriş

CoreML, makine öğrenmesini iOS'a getirir. Uygulamalar, sorun çözmeden görüntü tanımaya kadar her türlü görevi gerçekleştirmek için eğitilen makine öğrenmesi modellerinden yararlanabilir.

Bu giriş, aşağıdakileri kapsar:

CoreML'i Kullanmaya Başlama

Bu adımlar, iOS projesine CoreML'nin nasıl ekleneceğini açıklar.

Mars Habitat Price Predictor örneği ekran görüntüsü

1. CoreML modelini projeye ekleme

Projenin Resources dizinine bir CoreML modeli (.mlmodel uzantısına sahip bir dosya) ekleyin.

Model dosyasının özelliklerinde Derleme eylemi CoreMLModel olarak ayarlanır. Bu, uygulama oluşturulduğunda bir .mlmodelc dosyasında derlenmesi anlamına gelir.

2. Modeli yükleme

Statik yöntemi kullanarak MLModel.Create modeli yükleyin:

var assetPath = NSBundle.MainBundle.GetUrlForResource("NameOfModel", "mlmodelc");
model = MLModel.Create(assetPath, out NSError error1);

3. Parametreleri ayarlayın

Model parametreleri, uygulayan IMLFeatureProviderbir kapsayıcı sınıfı kullanılarak içeri ve dışarı geçirilir.

Özellik sağlayıcısı sınıfları, her özellik değerinin basit bir dize veya sayı, dizi veya veri ya da görüntü içeren bir piksel arabelleği olabileceği bir dize ve MLFeatureValues sözlüğü gibi davranır.

Tek değerli özellik sağlayıcısının kodu aşağıda gösterilmiştir:

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
  }

Bunun gibi sınıflar kullanılarak giriş parametreleri CoreML tarafından anlaşılacak şekilde sağlanabilir. Özelliklerin adları (kod örneğindeki gibi myParam ) modelin beklediğiyle eşleşmelidir.

4. Modeli çalıştırma

Modelin kullanılması, özellik sağlayıcısının örneğini oluşturmasını ve parametrelerin ayarlanmasını ve ardından yöntemin GetPrediction çağrılmış olmasını gerektirir:

var input = new MyInput {MyParam = 13};
var outFeatures = model.GetPrediction(inputFeatures, out NSError error2);

5. Sonuçları ayıklama

Tahmin sonucu outFeatures aynı zamanda bir örneğidirIMLFeatureProvider; çıkış değerlerine şu örnekte olduğu gibi her çıkış parametresinin adıyla (örneğintheResult) kullanılarak GetFeatureValue erişilebilir:

var result = outFeatures.GetFeatureValue("theResult").DoubleValue; // eg. 6227020800

CoreML'yi Vision Framework ile kullanma

CoreML, görüntü üzerinde şekil tanıma, nesne tanımlama ve diğer görevler gibi işlemleri gerçekleştirmek için Görüntü İşleme çerçevesiyle birlikte de kullanılabilir.

Aşağıdaki adımlar CoreML ve Görüntü İşleme'nin birlikte nasıl kullanılabileceğini açıklar. Örnek, görüntü çerçevesinin dikdörtgen tanımasını MNINSTClassifier CoreML modeliyle birleştirerek fotoğraftaki el yazısı bir rakamı tanımlar.

3 sayısının görüntü tanıması5 sayısının görüntü tanıması

1. Vision CoreML modeli oluşturma

CoreML modeli MNISTClassifier yüklenir ve ardından modeli Görüntü İşleme görevleri için kullanılabilir hale getiren bir VNCoreMLModel içine sarmalanır. Bu kod ayrıca iki Görüntü İşleme isteği oluşturur: önce görüntüdeki dikdörtgenleri bulmak ve ardından CoreML modeliyle bir dikdörtgeni işlemek için:

// 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);

Sınıfın yine de aşağıdaki 3. ve 4. adımlarda gösterilen Görüntü İşleme istekleri için ve HandleClassification yöntemlerini uygulaması HandleRectangles gerekir.

2. Görüntü İşleme'yi başlatın

Aşağıdaki kod isteği işlemeye başlar. CoreMLVision örneğinde bu kod, kullanıcı bir görüntü seçtikten sonra çalışır:

// 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);
});

Bu işleyici, 1. adımda oluşturulan Görüntü İşleme çerçevesine VNDetectRectanglesRequest iletirciImage.

3. Görüntü işlemenin sonuçlarını işleme

Dikdörtgen algılama tamamlandıktan sonra, ilk dikdörtgeni HandleRectangles ayıklamak için görüntüyü kırpan, dikdörtgen görüntüsünü gri tonlamaya dönüştüren ve sınıflandırma için CoreML modeline geçiren yöntemini yürütür.

request Bu yönteme geçirilen parametre Görüntü İşleme isteğinin ayrıntılarını içerir ve yöntemini kullanarak GetResults<VNRectangleObservation>() görüntüde bulunan dikdörtgenlerin listesini döndürür. İlk dikdörtgen observations[0] ayıklanır ve CoreML modeline geçirilir:

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 sonraki adımda tanımlanan yöntemi kullanmak HandleClassification için 1. adımda başlatıldı.

4. CoreML'yi işleme

request Bu yönteme geçirilen parametre CoreML isteğinin ayrıntılarını içerir ve yöntemini kullanarak GetResults<VNClassificationObservation>() güvene göre sıralanmış olası sonuçların bir listesini döndürür (önce en yüksek güvenilirlik):

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