Aracılığıyla paylaş


Öğretici: Görüntüleri kategorilere ayırmak için ML.NET sınıflandırma modelini eğitme

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

TensorFlow modeli, görüntüleri bin kategoride sınıflandı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 öğreticide şunların nasıl yapıldığını öğreneceksiniz:

  • 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 öğretici için .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 Bir Makine Öğrenmesi 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 şu kategorilere sınıflandı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ı belirleme:

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

Not

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. Sıfırdan özel bir modeli eğitmek kadar etkili olmasa da, önceden eğitilmiş bir model kullanmak binlerce resimle ve milyonlarca etiketli görüntüyle çalışarak ve özelleştirilmiş bir modeli oldukça hızlı bir şekilde oluşturarak (GPU olmayan bir makinede bir saat içinde) bu süreci kısayollamanıza olanak tanır. Bu öğretici, yalnızca bir düzine eğitim görüntüsü kullanarak bu işlemin ölçeğini daha da azaltıyor.

, Inception model görüntüleri bin kategoride sınıflandırmak için eğitilir, ancak bu öğretici için görüntüleri daha küçük bir kategori kümesinde ve yalnızca bu kategorilerde sınıflandırmanız gerekir. 'nin özel görüntü sınıflandırıcınızın yeni sınırlı kategorilerinde görüntüleri tanıyıp sınıflandırabilme özelliğini kullanabilirsiniz Inception model.

  • Gıda
  • Oyuncak
  • Alet

Bu öğreticide, veri kümesinde ImageNet eğitilen 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 "Bulaşık Makinesi" gibi bin sınıfa sınıflandırır.

Inception model zaten binlerce farklı görüntü üzerinde önceden eğitilmiş olduğundan, 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 Core veya .NET Framework uygulamalarınızdaki ML.NET NuGet paketlerine bir başvuru eklersiniz. ML.NET, mevcut eğitilmiş TensorFlow model dosyasını yükleyen kod yazmanızı sağlayan yerel TensorFlow kitaplığı içerir ve bunlara başvurur.

TensorFlow dönüştürme ML.NET Arch 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 çok sınıflı bir ML.NET sınıflandırıcısı ekleyeceğiz.

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 .

Veriler

İ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 resme karşılık gelen sütundur Label . Aşağıdaki örnek dosyanın üst bilgi satırı yoktur ve şöyle görünür:

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 indirdiğ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şturma

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

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

  3. Microsoft.ML NuGet Paketini yükleyin:

    Not

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

    • Çözüm Gezgini'da projenize sağ tıklayın ve NuGet Paketlerini Yönet'i seçin.
    • Paket kaynağı olarak "nuget.org" öğesini seçin, 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 kutusundaki 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ırmasını 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ı (bir sonraki adımda indirip ekleyeceğiniz Başlangıç modeli hariç) içerir.

  3. Inception modelini indirin ve sıkıştırmasını açın.

  4. Dizininizin inception5h içeriğinin sıkıştırmasını hemen TransferLearningTF proje assets/inception dizininize 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 dizini içeriği

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

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

  1. Aşağıdaki ek using deyimleri Program.cs dosyasının en üstüne ekleyin:

    using Microsoft.ML;
    using Microsoft.ML.Data;
    
  2. Varlık yollarını belirtmek için aşağıdaki kodu using deyimlerinin hemen altındaki satıra 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 verileri, tahmin edilen değerler ve model 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şlatma mlContext işlemi, 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 modelinin geçirmeniz gereken çeşitli parametreleri vardır. Değişkenin başlatılmasından hemen sonra parametre değerlerini aşağıdaki kodla kolay adlarla eşlemek mlContext için bir yapı oluşturun:

    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üyü 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 ImagePathbir için tam yolu ve görüntü dosyası adını içeren bir ImageData nesne oluşturun. Yönteminde sonraki satırlar ClassifySingleImage() olarak aşağıdaki kodu 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, uygulamanızın PredictionEnginePoolPredictionEngine tamamında kullanılmak üzere bir ObjectPool nesne oluşturan hizmeti kullanın. ASP.NET Core Web API'sinde kullanma PredictionEnginePoolhakkında bu kılavuza bakın.

    Not

    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ı, tahmin aracı zinciridir. İşlem hattı oluşturma sırasında yürütme gerçekleşmez. Tahmin aracı nesneleri oluşturulur ancak yürütülmez.

  1. Modeli oluşturmak için 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 karşı değerlendirir.

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

    ITransformer GenerateModel(MLContext mlContext)
    {
    
    }
    
  2. Görüntü verilerindeki 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 bir çıkış oluşturma, Puanlama olarak adlandırılır. Modeli bütün olarak 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 çıktısı etiketlenmiştir softmax_2_preactivation. Bu katmanın çıkışı, özgün giriş görüntülerini niteleyen 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ğitmen, etiketlerinin rastgele dizeler yerine biçimde olmasını key gerektirir. Anahtar, bir 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 aracını ekleyerek tahmin edilen anahtar değerini bir dizeye geri eşleyin:

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

Modeli eğitme

  1. LoadFromTextFile sarmalayıcısını kullanarak eğitim verilerini yükleyin. Yönteminde sonraki satır GenerateModel() olarak aşağıdaki kodu ekleyin:

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

    ML.NET'daki veriler bir 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. Yönteminin sonraki satırına aşağıdaki kodu 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, model tarafından dönüştürülebilmeleri için bunların da 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 bir sonraki satır olarak döndürmek için aşağıdaki kodu ekleyin:

    return model;
    

Uygulamayı çalıştırın!

  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önteminin çağrısını GenerateModel() ekleyin:

    ClassifySingleImage(mlContext, model);
    
  3. Konsol uygulamanızı (Ctrl + F5) çalıştırın. 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ıldığı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.