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.
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 IMLFeatureProvider
bir 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 MLFeatureValue
s 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.
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}%";
});
}