Öğ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:
Not
Yukarıdaki görüntüler Wikimedia Commons'a aittir ve aşağıdaki gibi özniteliklendirilir:
- "220px-Pepperoni_pizza.jpg" Ortak Etki Alanı, , https://commons.wikimedia.org/w/index.php?curid=79505
- "119px-Nalle_-_a_small_brown_teddy_bear.jpg" Jonik tarafından - Self-photographed, CC BY-SA 2.0, https://commons.wikimedia.org/w/index.php?curid=48166.
- "193px-Broodrooster.jpg" By M.Minderhoud - Kendi çalışması, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=27403
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.
Ç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
"TransferLearningTF" adlı bir C# Konsol Uygulaması oluşturun. İleri düğmesine tıklayın.
Kullanılacak çerçeve olarak .NET 6'yı seçin. Oluştur düğmesine tıklayın.
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
Proje varlıkları dizini zip dosyasını indirin ve sıkıştırmasını açın.
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.Inception modelini indirin ve sıkıştırmasını açın.
Dizininizin
inception5h
içeriğinin sıkıştırmasını hemen TransferLearningTF projeassets/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:Çö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
Aşağıdaki ek
using
deyimleri Program.cs dosyasının en üstüne ekleyin:using Microsoft.ML; using Microsoft.ML.Data;
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");
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.
için
ImagePrediction
projenize 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 birstring
()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
değişkenini
mlContext
yeni bir örneğiyleMLContext
baş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'tekineDBContext
benzer, kavramsal olarak.
Inception modeli parametreleri için bir yapı oluşturma
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.
DisplayResults()
Aşağıdaki kodu kullanarak yapıdanInceptionSettings
hemen sonra yöntemini oluşturun:void DisplayResults(IEnumerable<ImagePrediction> imagePredictionData) { }
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
ClassifySingleImage()
Aşağıdaki kodu kullanarak yöntemindenDisplayResults()
hemen önce yöntemini oluşturun:void ClassifySingleImage(MLContext mlContext, ITransformer model) { }
Tek
ImagePath
bir için tam yolu ve görüntü dosyası adını içeren birImageData
nesne oluşturun. Yönteminde sonraki satırlarClassifySingleImage()
olarak aşağıdaki kodu ekleyin:var imageData = new ImageData() { ImagePath = _predictSingleImage };
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ınPredictionEnginePool
PredictionEngine
tamamında kullanılmak üzere birObjectPool
nesne oluşturan hizmeti kullanın. ASP.NET Core Web API'sinde kullanmaPredictionEnginePool
hakkında bu kılavuza bakın.Not
PredictionEnginePool
hizmet uzantısı şu anda önizleme aşamasındadır.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.
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ındanInceptionSettings
hemen sonra ve yönteminDisplayResults()
hemen öncesinde yöntemini oluşturun:ITransformer GenerateModel(MLContext mlContext) { }
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.
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.
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.ML.NET eğitim algoritmasını ekleyin:
.Append(mlContext.MulticlassClassification.Trainers.LbfgsMaximumEntropy(labelColumnName: "LabelKey", featureColumnName: "softmax2_pre_activation"))
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
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ı) birIDataView
nesneye yüklenebilir.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
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
IDataView
yüklenmesi gerekir.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
labels
karşılaştırır). - Model performans ölçümlerini döndürür.
- Modeli değerlendirir (tahmin edilen değerleri test veri kümesiyle
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.
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!
sınıfı oluşturulduktan sonra çağrısı
GenerateModel
ekleyin MLContext :ITransformer model = GenerateModel(mlContext);
yönteminin çağrısından
ClassifySingleImage()
sonra yönteminin çağrısınıGenerateModel()
ekleyin:ClassifySingleImage(mlContext, model);
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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin