ML.NET Image Classification

Leveraging Machine Learning for Visual Understanding with .NET

Introduction to Image Classification

Image classification is a fundamental task in computer vision where the goal is to assign a label to an input image from a predefined set of categories. ML.NET, Microsoft's open-source, cross-platform machine learning framework, provides powerful tools and APIs to build custom machine learning models, including those for image classification.

This guide will walk you through the process of building an image classification model using ML.NET. We'll cover data preparation, model training, and evaluation, enabling you to create intelligent applications that can understand visual content.

Getting Started with ML.NET Image Classification

ML.NET simplifies the process of incorporating machine learning into your .NET applications. For image classification, it often leverages transfer learning, where a pre-trained model is fine-tuned on your specific dataset. This approach significantly reduces the amount of data and computational resources required.

Prerequisites

Steps Involved

  1. Set up your Project: Create a new C# Console Application project in Visual Studio.
  2. Install ML.NET NuGet Packages: Add the necessary ML.NET NuGet packages to your project. The primary package is usually Microsoft.ML. For image-specific tasks, you might also need Microsoft.ML.ImageAnalytics and Microsoft.ML.TensorFlow or Microsoft.ML.OnnxTransformer depending on your model source.
  3. Prepare your Data: Organize your images into folders, where each folder name represents a class label.
  4. Load and Transform Data: Use ML.NET's data loading APIs to read your image data and apply transformations like resizing, normalization, and feature extraction.
  5. Define the Model Pipeline: Construct a pipeline that includes data transformations, feature extraction (e.g., using a pre-trained neural network), and a classification trainer.
  6. Train the Model: Train the model using your prepared dataset.
  7. Evaluate the Model: Assess the performance of your trained model using appropriate metrics.
  8. Consume the Model: Integrate the trained model into your application for making predictions on new images.

Example Code Snippet

Here's a simplified look at how you might start building a model pipeline:


using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.Transforms.Image;
using System.IO;

public class ImageData
{
    [LoadColumn(0)]
    [ImageFiles(LabelColumnName = "Label")]
    public string ImagePath;

    [LoadColumn(1)]
    public string Label;
}

public class ImagePrediction
{
    [ColumnName("PredictedLabel")]
    public string PredictedLabel;
}

// ... Inside your Main method or a dedicated class
var mlContext = new MLContext();

// Define data path (replace with your actual dataset path)
string assetsPath = Path.Combine(Environment.CurrentDirectory, "assets");
string trainDataPath = Path.Combine(assetsPath, "images", "train"); // Folder containing class subfolders

// Load your dataset
IDataView trainingDataView = mlContext.Data.LoadFromEnumerable(new List<ImageData>());
// For real usage, you'd load from files, e.g., mlContext.Data.LoadFromTextFile("your_metadata.csv");
// Or use mlContext.Data.LoadFromEnumerable(LoadImagesFromDirectory(trainDataPath));

// Define the model pipeline
var pipeline = mlContext.Transforms.Conversion.MapValueToKey(inputColumnName: "Label", outputColumnName: "LabelAsKey")
    .Append(mlContext.Transforms.LoadImages(outputColumnName: "InputImage", imageFolder: trainDataPath, inputColumnName: nameof(ImageData.ImagePath)))
    .Append(mlContext.Transforms.ResizeImages(outputColumnName: "InputImage", imageWidth: 224, imageHeight: 224, inputColumnName: "InputImage"))
    .Append(mlContext.Transforms.ExtractPixels(outputColumnName: "InputImage", inputColumnName: "InputImage", colorsToExtract: ImagePixelExtractingEstimator.ColorsToExtract.All))
    // Add a pre-trained model for feature extraction (e.g., ResNet, MobileNet)
    // This step often involves using Onnx or TensorFlow transformers.
    // Example placeholder:
    .Append(mlContext.Transforms.TensorFlowModel.Load(
        modelFile: Path.Combine(assetsPath, "model", "resnet50.pb"), // Replace with your model path
        outputColumnNames: new[] { "softmax2_final" }, // Replace with actual output node name
        inputColumnNames: new[] { "input" } // Replace with actual input node name
    ))
    .Append(mlContext.Transforms.Concatenate("Features", "softmax2_final")) // Concatenate extracted features
    .Append(mlContext.MulticlassClassification.Trainers.SdcaLogisticRegression(labelColumnName: "LabelAsKey", featureColumnName: "Features"))
    .Append(mlContext.Transforms.Conversion.MapKeyToValue(outputColumnName: "PredictedLabel", inputColumnName: "PredictedLabel"));

// Train the model
var model = pipeline.Fit(trainingDataView);

// Save the model (optional)
// mlContext.Model.Save(model, trainingDataView.Schema, "imageClassificationModel.zip");

// Prediction engine
// var predictionEngine = mlContext.Model.CreatePredictionEngine<ImageData, ImagePrediction>(model);
// var prediction = predictionEngine.Predict(new ImageData { ImagePath = "path/to/your/new/image.jpg" });
// Console.WriteLine($"Prediction: {prediction.PredictedLabel}");
            

Note: The code snippet above is illustrative. Actual implementation may vary based on the specific pre-trained model used, data loading strategy, and ML.NET version. Ensure you replace placeholder paths and node names with your actual values.

Choosing a Pre-trained Model

ML.NET supports integrating with pre-trained models from various sources, including TensorFlow and ONNX. Popular choices for image classification include:

You can often find pre-trained models on platforms like TensorFlow Hub or model zoos.

Further Exploration

Explore the official ML.NET Image Classification Tutorial for a comprehensive, step-by-step guide with complete code examples.

Learn more about image classification in ML.NET and discover advanced techniques for building robust visual recognition systems.