Aracılığıyla paylaş


Eğitim Kılavuzu: ML.NET sınıflandırma modelini görüntüleri kategorilere ayırmak amacıyla eğitme

Görüntü işleme için önceden eğitilmiş bir TensorFlow modeli kullanarak görüntüleri kategorilere ayırmak için sınıflandırma modelini eğitmeyi öğrenin.

TensorFlow modeli, görüntüleri bin kategoriye ayırmak için eğitildi. TensorFlow modeli görüntülerdeki desenlerin nasıl tanınabileceğini bildiği için, ML.NET modeli ham görüntüleri sınıflandırma modelini eğitmek üzere özelliklere veya girişlere dönüştürmek için işlem hattında bu modelin bir kısmını kullanabilir.

Bu eğitimde şunları öğreniyorsunuz:

  • Sorunu anlama
  • Önceden eğitilmiş TensorFlow modelini ML.NET işlem hattına ekleme
  • ML.NET modelini eğitin ve değerlendirin
  • Test görüntüsünü sınıflandırma

Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz. Varsayılan olarak, bu öğreticinin .NET proje yapılandırması .NET core 2.2'yi hedefler.

Önkoşullar

Doğru makine öğrenmesi görevini seçin

Derin öğrenme

Derin öğrenme , görüntü işleme ve konuşma tanıma gibi alanlarda devrim yapan Machine Learning'in bir alt kümesidir.

Derin öğrenme modelleri, birden çok öğrenme katmanı içeren büyük etiketli veri kümeleri ve sinir ağları kullanılarak eğitilir. Derin öğrenme:

  • Görüntü işleme gibi bazı görevlerde daha iyi performans gösterir.
  • Çok büyük miktarda eğitim verileri gerektirir.

Görüntü sınıflandırma, görüntüleri otomatik olarak kategorilere ayırmamıza olanak tanıyan belirli bir sınıflandırma görevidir:

  • Bir görüntüdeki insan yüzünü algılama veya algılamama.
  • Kedileri ve köpekleri algılama.

Ya da aşağıdaki görüntülerde olduğu gibi, bir görüntünün yiyecek, oyuncak veya alet olup olmadığını belirlemek için:

pizza görüntüsü oyuncak ayı görüntüsü tost makinesi görüntüsü

Uyarı

Yukarıdaki görüntüler Wikimedia Commons'a aittir ve aşağıdaki gibi özniteliklendirilir:

Bir görüntü sınıflandırma modelini sıfırdan eğitmek için milyonlarca parametre, bir ton etiketli eğitim verisi ve çok miktarda işlem kaynağı (yüzlerce GPU saati) ayarlanması gerekir. Özel modeli sıfırdan eğitmek kadar etkili olmasa da, önceden eğitilmiş bir model kullanmak, binlerce resimle ve milyonlarca etiketli görüntüyle çalışarak ve oldukça hızlı bir şekilde özelleştirilmiş bir model oluşturarak (GPU olmayan bir makinede bir saat içinde) bu işleme kısayol oluşturmanıza olanak tanır. Bu öğreticide yalnızca bir düzine eğitim görüntüsü kullanılarak daha da azaltılır.

Inception model, görüntüleri bin kategoriye ayıracak şekilde eğitilir, ancak bu öğreticide resimleri daha küçük bir kategori kümesinde ve yalnızca bu kategorilerde sınıflandırmanız gerekir. 'nin resimleri tanıyıp özel görüntü sınıflandırıcınızın yeni sınırlı kategorilerinde sınıflandırabilmesini kullanabilirsiniz Inception model.

  • Gıda
  • Oyuncak
  • Cihaz

Bu öğreticide, ImageNet veri kümesi üzerinde eğitilmiş popüler bir görüntü tanıma modeli olan TensorFlow Inception derin öğrenme modeli kullanılır. TensorFlow modeli tüm görüntüleri "Umbrella", "Jersey" ve "Dishwasher" gibi bin sınıfa sınıflandırır.

Inception model binlerce farklı görüntü üzerinde önceden eğitildiğinden, dahili olarak görüntü tanımlama için gereken görüntü özelliklerini içerir. Çok daha az sınıfa sahip yeni bir model eğitmek için modeldeki bu iç görüntü özelliklerinden yararlanabiliriz.

Aşağıdaki diyagramda gösterildiği gibi, .NET veya .NET Framework uygulamalarınızdaki ML.NET NuGet paketlerine bir başvuru eklersiniz. ML.NET, perde arkasında, var olan eğitilmiş bir TensorFlow model dosyasını yükleyen kod yazmanızı sağlayan yerel TensorFlow kitaplığını içerir ve buna başvurur.

TensorFlow dönüştürme ML.NET Mimari diyagramı

Çok sınıflı sınıflandırma

TensorFlow başlangıç modelini kullanarak klasik makine öğrenmesi algoritmasına giriş olarak uygun özellikleri ayıkladıktan sonra, ML.NET çok sınıflı sınıflandırıcı eklersiniz.

Bu durumda kullanılan özel eğitmen , çok terimli lojistik regresyon algoritmasıdır.

Bu eğitmen tarafından uygulanan algoritma, görüntü verileri üzerinde çalışan derin öğrenme modeli için geçerli olan çok sayıda özellik ile ilgili sorunlar üzerinde iyi performans gösterir.

Daha fazla bilgi için bkz . Derin öğrenme ve makine öğrenmesi.

Data

İki veri kaynağı vardır: .tsv dosya ve görüntü dosyaları. Dosya tags.tsv iki sütun içerir: birincisi olarak ImagePath tanımlanır ve ikincisi görüntüye karşılık gelen sütundur Label . Aşağıdaki örnek dosyanın üst bilgi satırı yoktur ve şuna benzer:

broccoli.jpg	food
pizza.jpg	food
pizza2.jpg	food
teddy2.jpg	toy
teddy3.jpg	toy
teddy4.jpg	toy
toaster.jpg	appliance
toaster2.png	appliance

Eğitim ve test görüntüleri, bir zip dosyasında indirebileceğiniz varlık klasörlerinde bulunur. Bu görüntüler Wikimedia Commons'a aittir.

Wikimedia Commons, ücretsiz medya deposu. 10:48, 17 Ekim 2018' den alındı: https://commons.wikimedia.org/wiki/Pizzahttps://commons.wikimedia.org/wiki/Toasterhttps://commons.wikimedia.org/wiki/Teddy_bear

Kurulum

Proje oluştur

  1. "TransferLearningTF" adlı bir C# Konsol Uygulaması oluşturun. İleri düğmesine tıklayın.

  2. Kullanılacak çerçeve olarak .NET 8'i seçin. Oluştur düğmesine tıklayın.

  3. Microsoft.ML NuGet Paketini yükleyin:

    Uyarı

    Bu örnek, aksi belirtilmedikçe bahsedilen NuGet paketlerinin en son kararlı sürümünü kullanır.

    • Çözüm Gezgini'nde projenize sağ tıklayın ve NuGet Paketlerini Yönet'i seçin.
    • Paket kaynağı olarak "nuget.org" seçeneğini belirleyin, Gözat sekmesini seçin, Microsoft.ML arayın.
    • Yükle düğmesini seçin.
    • Değişiklikleri Önizle iletişim kutusunda Tamam düğmesini seçin.
    • Listelenen paketlerin lisans koşullarını kabul ediyorsanız Lisans Kabulü iletişim kutusunda Kabul Ediyorum düğmesini seçin.
    • Microsoft.ML.ImageAnalytics, SciSharp.TensorFlow.Redist ve Microsoft.ML.TensorFlow için bu adımları yineleyin.

Varlıkları indirme

  1. Proje varlıkları dizini zip dosyasını indirin ve sıkıştırmayı açın.

  2. assets Dizini TransferLearningTF proje dizininize kopyalayın. Bu dizin ve alt dizinleri, bu öğretici için gereken verileri ve destek dosyalarını (sonraki adımda indirip ekleyeceğiniz Inception modeli hariç) içerir.

  3. Inception modelini indirin ve sıkıştırılmış dosyayı açın.

  4. Yeni sıkıştırmadan çıkarılan inception5h dizinindeki içerikleri TransferLearningTF projenizin assets/inception dizinine kopyalayın. Bu dizin, aşağıdaki görüntüde gösterildiği gibi bu öğretici için gereken modeli ve ek destek dosyalarını içerir:

    Inception dizin içeriği

  5. Çözüm Gezgini'nde varlık dizinindeki ve alt dizinlerdeki dosyaların her birine sağ tıklayın ve Özellikler'i seçin. Gelişmiş altında, Çıkış Dizinine Kopyala değerini Daha yeniyse kopyala olarak değiştirin.

Sınıf oluşturma ve yolları tanımlama

  1. using dosyasının en üstüne aşağıdaki ek yönergeleri ekleyin:

    using Microsoft.ML;
    using Microsoft.ML.Data;
    
  2. Varlık yollarını belirtmek için yönergelerin hemen altındaki using satıra aşağıdaki kodu ekleyin:

    string _assetsPath = Path.Combine(Environment.CurrentDirectory, "assets");
    string _imagesFolder = Path.Combine(_assetsPath, "images");
    string _trainTagsTsv = Path.Combine(_imagesFolder, "tags.tsv");
    string _testTagsTsv = Path.Combine(_imagesFolder, "test-tags.tsv");
    string _predictSingleImage = Path.Combine(_imagesFolder, "toaster3.jpg");
    string _inceptionTensorFlowModel = Path.Combine(_assetsPath, "inception", "tensorflow_inception_graph.pb");
    
  3. Giriş verileriniz ve tahminleriniz için sınıflar oluşturun.

    public class ImageData
    {
        [LoadColumn(0)]
        public string? ImagePath;
    
        [LoadColumn(1)]
        public string? Label;
    }
    

    ImageData giriş görüntüsü veri sınıfıdır ve aşağıdaki String alanlara sahiptir:

    • ImagePath görüntü dosyası adını içerir.
    • Label resim etiketi için bir değer içerir.
  4. için ImagePredictionprojenize yeni bir sınıf ekleyin:

    public class ImagePrediction : ImageData
    {
        public float[]? Score;
    
        public string? PredictedLabelValue;
    }
    

    ImagePrediction görüntü tahmin sınıfıdır ve aşağıdaki alanlara sahiptir:

    • Score belirli bir görüntü sınıflandırması için güvenilirlik yüzdesini içerir.
    • PredictedLabelValue , tahmin edilen görüntü sınıflandırma etiketi için bir değer içerir.

    ImagePrediction , model eğitildikten sonra tahmin için kullanılan sınıftır. Görüntü yolu için bir string (ImagePath) vardır. Label modeli yeniden kullanmak ve eğitmek için kullanılır. PredictedLabelValue tahmin ve değerlendirme sırasında kullanılır. Değerlendirme için eğitim verilerini, tahmin edilen değerleri ve modeli içeren bir giriş kullanılır.

Değişkenleri başlatma

  1. değişkenini mlContext yeni bir örneğiyle MLContextbaşlatın. Console.WriteLine("Hello World!") satırını aşağıdaki kodla değiştirin:

    MLContext mlContext = new MLContext();
    

    MLContext sınıfı tüm ML.NET işlemleri için bir başlangıç noktasıdır ve başlatmamlContext, model oluşturma iş akışı nesneleri arasında paylaşılabilen yeni bir ML.NET ortamı oluşturur. Entity Framework'tekine DBContext benzer, kavramsal olarak.

Inception modeli parametreleri için bir yapı oluşturma

  1. Inception modelinde geçirmeniz gereken birkaç parametre vardır. Değişkeni başlattıktan hemen sonra, parametre değerlerini kullanıcı dostu isimlerle eşlemek için aşağıdaki kodla bir yapı oluşturun: mlContext

    struct InceptionSettings
    {
        public const int ImageHeight = 224;
        public const int ImageWidth = 224;
        public const float Mean = 117;
        public const float Scale = 1;
        public const bool ChannelsLast = true;
    }
    

Görüntüleme yardımcı programı yöntemi oluşturma

Görüntü verilerini ve ilgili tahminleri birden çok kez görüntüleyeceğinden, görüntü ve tahmin sonuçlarını görüntülemeyi işlemek için bir görüntüleme yardımcı programı yöntemi oluşturun.

  1. DisplayResults() Aşağıdaki kodu kullanarak yapıdan InceptionSettings hemen sonra yöntemini oluşturun:

    void DisplayResults(IEnumerable<ImagePrediction> imagePredictionData)
    {
    
    }
    
  2. Yönteminin gövdesini DisplayResults doldurun:

    foreach (ImagePrediction prediction in imagePredictionData)
    {
        Console.WriteLine($"Image: {Path.GetFileName(prediction.ImagePath)} predicted as: {prediction.PredictedLabelValue} with score: {prediction.Score?.Max()} ");
    }
    

Tahminde bulunmak için yöntem oluşturma

  1. ClassifySingleImage() Aşağıdaki kodu kullanarak yönteminden DisplayResults() hemen önce yöntemini oluşturun:

    void ClassifySingleImage(MLContext mlContext, ITransformer model)
    {
    
    }
    
  2. Tek ImageDatabir için tam yolu ve görüntü dosyası adını içeren bir ImagePath nesne oluşturun. Aşağıdaki kodu yönteminde ClassifySingleImage() sonraki satırlar olarak ekleyin:

    var imageData = new ImageData()
    {
        ImagePath = _predictSingleImage
    };
    
  3. Yönteminde sonraki satır olarak aşağıdaki kodu ekleyerek tek bir tahminde bulunın ClassifySingleImage :

    // Make prediction function (input = ImageData, output = ImagePrediction)
    var predictor = mlContext.Model.CreatePredictionEngine<ImageData, ImagePrediction>(model);
    var prediction = predictor.Predict(imageData);
    

    Tahmini almak için Predict() yöntemini kullanın. PredictionEngine, tek bir veri örneği üzerinde tahmin gerçekleştirmenizi sağlayan kullanışlı bir API'dir. PredictionEngine iş parçacığı güvenli değildir. Tek iş parçacıklı veya prototip ortamlarda kullanılması kabul edilebilir. Üretim ortamlarında iyileştirilmiş performans ve iş parçacığı güvenliği için PredictionEnginePool hizmetini kullanın. Bu hizmet, uygulamanız genelinde kullanılmak üzere bir PredictionEngine nesne ObjectPool oluşturur. ASP.NET Core Web API'sinde kullanma PredictionEnginePoolhakkında bu kılavuza bakın.

    Uyarı

    PredictionEnginePool hizmet uzantısı şu anda önizleme aşamasındadır.

  4. Tahmin sonucunu yönteminde ClassifySingleImage() bir sonraki kod satırı olarak görüntüleyin:

    Console.WriteLine($"Image: {Path.GetFileName(imageData.ImagePath)} predicted as: {prediction.PredictedLabelValue} with score: {prediction.Score?.Max()} ");
    

ML.NET modeli işlem hattını oluşturma

ML.NET model işlem hattı bir tahmin zinciridir. İşlem hattı oluşturma sırasında yürütme gerçekleşmez. Tahmin aracı nesneleri oluşturulur ancak yürütülür.

  1. Modeli oluşturmak için bir yöntem ekleme

    Bu yöntem öğreticinin kalbidir. Model için bir işlem hattı oluşturur ve ML.NET modeli üretmek için işlem hattını eğiter. Ayrıca modeli daha önce görünmeyen bazı test verilerine göre değerlendirir.

    GenerateModel() Aşağıdaki kodu kullanarak, yapıdan InceptionSettings hemen sonra ve yöntemin DisplayResults() hemen öncesinde yöntemini oluşturun:

    ITransformer GenerateModel(MLContext mlContext)
    {
    
    }
    
  2. Görüntü verilerinden pikselleri yüklemek, yeniden boyutlandırmak ve ayıklamak için tahmin edicileri ekleyin:

    IEstimator<ITransformer> pipeline = mlContext.Transforms.LoadImages(outputColumnName: "input", imageFolder: _imagesFolder, inputColumnName: nameof(ImageData.ImagePath))
                    // The image transforms transform the images into the model's expected format.
                    .Append(mlContext.Transforms.ResizeImages(outputColumnName: "input", imageWidth: InceptionSettings.ImageWidth, imageHeight: InceptionSettings.ImageHeight, inputColumnName: "input"))
                    .Append(mlContext.Transforms.ExtractPixels(outputColumnName: "input", interleavePixelColors: InceptionSettings.ChannelsLast, offsetImage: InceptionSettings.Mean))
    

    Görüntü verilerinin TensorFlow modelinin beklediği biçimde işlenmesi gerekir. Bu durumda görüntüler belleğe yüklenir, tutarlı bir boyuta yeniden boyutlandırılır ve pikseller sayısal bir vektöre ayıklanır.

  3. TensorFlow modelini yüklemek için tahmin aracını ekleyin ve puanlayın:

    .Append(mlContext.Model.LoadTensorFlowModel(_inceptionTensorFlowModel).
        ScoreTensorFlowModel(outputColumnNames: new[] { "softmax2_pre_activation" }, inputColumnNames: new[] { "input" }, addBatchDimensionInput: true))
    

    İşlem hattındaki bu aşama TensorFlow modelini belleğe yükler, ardından TensorFlow model ağı aracılığıyla piksel değerlerinin vektörlerini işler. Derin öğrenme modeline giriş uygulama ve modeli kullanarak çıkış oluşturma, Puanlama olarak adlandırılır. Modeli tamamen kullanırken puanlama bir çıkarım veya tahminde bulunur.

    Bu durumda, çıkarım yapan katman olan son katman dışındaki tüm TensorFlow modelini kullanırsınız. Son katmanın çıkışı etiketlenmiştir softmax_2_preactivation. Bu katmanın çıkışı, özgün giriş görüntülerini karakterize eden bir özellik vektördür.

    TensorFlow modeli tarafından oluşturulan bu özellik vektöru, ML.NET eğitim algoritmasına giriş olarak kullanılacaktır.

  4. Eğitim verilerindeki dize etiketlerini tamsayı anahtar değerlerine eşlemek için tahmin aracını ekleyin:

    .Append(mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: "LabelKey", inputColumnName: "Label"))
    

    Sonraki eklenen ML.NET eğitmeni, etiketlerinin rastgele dizeler yerine key biçiminde olmasını gerektirir. Anahtar, dize değeriyle bire bir eşlemesi olan bir sayıdır.

  5. ML.NET eğitim algoritmasını ekleyin:

    .Append(mlContext.MulticlassClassification.Trainers.LbfgsMaximumEntropy(labelColumnName: "LabelKey", featureColumnName: "softmax2_pre_activation"))
    
  6. Tahmin edilen anahtar değerini bir dizeye geri eşlemek için tahmin aracını ekleyin:

    .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabelValue", "PredictedLabel"))
    .AppendCacheCheckpoint(mlContext);
    

Modeli eğitin

  1. LoadFromTextFile sarmalayıcısını kullanarak eğitim verilerini yükleyin. Metodun GenerateModel() satırına aşağıdaki kodu ekleyin:

    IDataView trainingData = mlContext.Data.LoadFromTextFile<ImageData>(path:  _trainTagsTsv, hasHeader: false);
    

    ML.NET'deki veriler IDataView arabirimi olarak temsil edilir. IDataView tablosal verileri (sayısal ve metin) açıklamanın esnek ve verimli bir yoludur. Veriler bir metin dosyasından veya gerçek zamanlı olarak (örneğin, SQL veritabanı veya günlük dosyaları) bir IDataView nesneye yüklenebilir.

  2. Modeli yukarıda yüklenen verilerle eğitin:

    ITransformer model = pipeline.Fit(trainingData);
    

    yöntemi, Fit() eğitim veri kümesini işlem hattına uygulayarak modelinizi eğiter.

Modelin doğruluğunu değerlendirme

  1. Aşağıdaki kodu yöntemin sonraki satırına ekleyerek test verilerini yükleyin ve dönüştürün GenerateModel :

    IDataView testData = mlContext.Data.LoadFromTextFile<ImageData>(path: _testTagsTsv, hasHeader: false);
    IDataView predictions = model.Transform(testData);
    
    // Create an IEnumerable for the predictions for displaying results
    IEnumerable<ImagePrediction> imagePredictionData = mlContext.Data.CreateEnumerable<ImagePrediction>(predictions, true);
    DisplayResults(imagePredictionData);
    

    Modeli değerlendirmek için kullanabileceğiniz birkaç örnek görüntü vardır. Eğitim verileri gibi bunların da model tarafından dönüştürülebilmesi için içine IDataViewyüklenmesi gerekir.

  2. Modeli değerlendirmek için GenerateModel() yöntemine aşağıdaki kodu ekleyin:

    MulticlassClassificationMetrics metrics =
        mlContext.MulticlassClassification.Evaluate(predictions,
            labelColumnName: "LabelKey",
            predictedLabelColumnName: "PredictedLabel");
    

    Tahmin kümesini aldıktan sonra Evaluate() yöntemi:

    • Modeli değerlendirir (tahmin edilen değerleri test veri kümesiyle labelskarşılaştırır).
    • Model performans ölçümlerini döndürür.
  3. Model doğruluğu ölçümlerini görüntüleme

    Ölçümleri görüntülemek, sonuçları paylaşmak ve bunlar üzerinde işlem yapmak için aşağıdaki kodu kullanın:

    Console.WriteLine($"LogLoss is: {metrics.LogLoss}");
    Console.WriteLine($"PerClassLogLoss is: {String.Join(" , ", metrics.PerClassLogLoss.Select(c => c.ToString()))}");
    

    Aşağıdaki ölçümler görüntü sınıflandırması için değerlendirilir:

    • Log-loss - bkz . Günlük Kaybı. Günlük kaybının mümkün olduğunca sıfıra yakın olmasını istiyorsunuz.
    • Per class Log-loss. Sınıf başına Günlük kaybının mümkün olduğunca sıfıra yakın olmasını istiyorsunuz.
  4. Eğitilen modeli sonraki satır olarak döndürmek için aşağıdaki kodu ekleyin:

    return model;
    

Uygulamayı çalıştırma

  1. sınıfı oluşturulduktan sonra çağrısı GenerateModel ekleyin MLContext :

    ITransformer model = GenerateModel(mlContext);
    
  2. yönteminin çağrısından ClassifySingleImage() sonra yöntemine çağrı ekleyin GenerateModel() :

    ClassifySingleImage(mlContext, model);
    
  3. Konsol uygulamanızı çalıştırın (Ctrl + F5). Sonuçlarınız aşağıdaki çıkışa benzer olmalıdır. (Uyarılar görebilir veya iletileri işleyebilirsiniz, ancak bu iletiler netlik için aşağıdaki sonuçlardan kaldırılmıştır.)

    =============== Training classification model ===============
    Image: broccoli2.jpg predicted as: food with score: 0.8955513
    Image: pizza3.jpg predicted as: food with score: 0.9667718
    Image: teddy6.jpg predicted as: toy with score: 0.9797683
    =============== Classification metrics ===============
    LogLoss is: 0.0653774699265059
    PerClassLogLoss is: 0.110315812569315 , 0.0204391272836966 , 0
    =============== Making single image classification ===============
    Image: toaster3.jpg predicted as: appliance with score: 0.9646884
    

Tebrikler! Görüntü işleme için önceden eğitilmiş bir TensorFlow kullanarak görüntüleri kategorilere ayırmak için ML.NET'de başarıyla bir sınıflandırma modeli oluşturdunuz.

Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz.

Bu öğreticide şunların nasıl yapılacağını öğrendiniz:

  • Sorunu anlama
  • Önceden eğitilmiş TensorFlow modelini ML.NET işlem hattına ekleme
  • ML.NET modelini eğitin ve değerlendirin
  • Test görüntüsünü sınıflandırma

Genişletilmiş görüntü sınıflandırma örneğini keşfetmek için Machine Learning örnekleri GitHub deposuna göz atın.