Teilen über


Lernprogramm: Automatisierte visuelle Inspektion mithilfe von Transferlernen mit der ML.NET Bildklassifizierungs-API

Erfahren Sie, wie Sie ein benutzerdefiniertes Deep Learning-Modell mit Transferlernen, einem vortrainierten TensorFlow-Modell und der ML.NET Bildklassifizierungs-API trainieren, um Bilder konkreter Oberflächen als zerbrochen oder ungecrackt zu klassifizieren.

In diesem Tutorial erfahren Sie, wie:

  • Verstehen des Problems
  • Informationen zur ML.NET Bildklassifizierungs-API
  • Grundlegendes zum vortrainierten Modell
  • Verwenden von Transferlernen zum Trainieren eines benutzerdefinierten TensorFlow-Bildklassifizierungsmodells
  • Klassifizieren von Bildern mit dem benutzerdefinierten Modell

Voraussetzungen

Verstehen des Problems

Die Bildklassifizierung ist ein Computervisionsproblem. Die Bildklassifizierung verwendet ein Bild als Eingabe und kategorisiert es in eine vorgeschriebene Klasse. Bildklassifizierungsmodelle werden häufig mithilfe von Deep Learning und neuralen Netzwerken trainiert. Weitere Informationen finden Sie unter Deep Learning im Vergleich zum maschinellen Lernen.

Einige Szenarien, in denen die Bildklassifizierung nützlich ist, umfassen:

  • Gesichtserkennung
  • Emotionserkennung
  • Medizinische Diagnose
  • Orientierungspunkterkennung

In diesem Lernprogramm wird ein benutzerdefiniertes Bildklassifizierungsmodell trainiert, um automatisierte visuelle Inspektionen von Brückendecks durchzuführen, um Strukturen zu identifizieren, die durch Risse beschädigt sind.

ML.NET Bildklassifizierungs-API

ML.NET bietet verschiedene Möglichkeiten zum Ausführen der Bildklassifizierung. In diesem Tutorial wird Transfer-Lernen mithilfe der Bildklassifizierungs-API verwendet. Die Bildklassifizierungs-API verwendet TensorFlow.NET, einer Bibliothek mit niedriger Ebene, die C#-Bindungen für die TensorFlow-C++-API bereitstellt.

Was ist Übertragungslernen?

Transfer Learning wendet Wissen an, das von der Lösung eines Problems auf ein anderes verwandtes Problem gewonnen wurde.

Für das Training eines deep Learning-Modells von Grund auf müssen mehrere Parameter, eine große Menge bezeichneter Schulungsdaten und eine große Menge an Rechenressourcen (Hunderte von GPU-Stunden) festgelegt werden. Die Verwendung eines vortrainierten Modells und von Transferlernen ermöglicht es Ihnen, den Schulungsprozess abzukürzen.

Schulungsprozess

Die Bildklassifizierungs-API startet den Schulungsprozess, indem ein vortrainiertes TensorFlow-Modell geladen wird. Der Schulungsvorgang besteht aus zwei Schritten:

  1. Engpassphase.
  2. Schulungsphase.

Schulungsschritte

Engpassphase

Während der Engpassphase wird der Satz von Trainingsbildern geladen, und die Pixelwerte werden als Eingabe oder Merkmale für die eingefrorenen Schichten des vortrainierten Modells verwendet. Die fixierten Schichten enthalten alle Schichten im neuralen Netzwerk bis zur vorletzten Ebene, die informell als Engpassebene bezeichnet wird. Diese Schichten werden als "eingefroren" bezeichnet, da kein Training in diesen Schichten stattfindet und Vorgänge durchgeschleust werden. Auf diesen eingefrorenen Ebenen werden die Muster auf niedrigerer Ebene berechnet, die einem Modell helfen, zwischen den verschiedenen Klassen zu unterscheiden. Je größer die Anzahl der Ebenen ist, desto rechenintensiver ist dieser Schritt. Da dies eine einmalige Berechnung ist, können die Ergebnisse glücklicherweise zwischengespeichert und später beim Experimentieren mit verschiedenen Parametern verwendet werden.

Schulungsphase

Sobald die Ausgabewerte aus der Engpassphase berechnet wurden, werden sie als Eingabe verwendet, um die endgültige Ebene des Modells neu zu trainieren. Dieser Prozess ist iterativ und wird für die Anzahl der durch Modellparameter angegebenen Male ausgeführt. Während jeder Ausführung werden der Verlust und die Genauigkeit ausgewertet. Anschließend werden die entsprechenden Anpassungen vorgenommen, um das Modell mit dem Ziel zu verbessern, den Verlust zu minimieren und die Genauigkeit zu maximieren. Nach Abschluss der Schulung werden zwei Modellformate ausgegeben. Eine davon ist die .pb Version des Modells, und die andere ist die .zip ML.NET serialisierte Version des Modells. Wenn Sie in Umgebungen arbeiten, die von ML.NET unterstützt werden, empfiehlt es sich, die .zip Version des Modells zu verwenden. In Umgebungen, in denen ML.NET nicht unterstützt wird, haben Sie jedoch die Möglichkeit, die .pb Version zu verwenden.

Grundlegendes zum vortrainierten Modell

Das in diesem Lernprogramm verwendete vortrainierte Modell ist die 101-Layer-Variante des Restnetzwerkmodells (ResNet) v2. Das ursprüngliche Modell wird trainiert, Bilder in tausend Kategorien zu klassifizieren. Das Modell verwendet als Eingabe ein Bild der Größe 224 x 224 und gibt die Klassenwahrscheinlichkeiten für jede der Klassen aus, auf die es trainiert wird. Teil dieses Modells wird verwendet, um ein neues Modell mithilfe von benutzerdefinierten Bildern zu trainieren, um Vorhersagen zwischen zwei Klassen zu erstellen.

Erstellen einer Konsolenanwendung

Nachdem Sie nun ein allgemeines Verständnis für das Übertragen des Lernens und der Imageklassifizierungs-API haben, ist es an der Zeit, die Anwendung zu erstellen.

  1. Erstellen Sie eine C# -Konsolenanwendung namens "DeepLearning_ImageClassification_Binary". Klicken Sie auf die Schaltfläche Weiter .

  2. Wählen Sie .NET 8 als zu verwendende Framework und dann "Erstellen" aus.

  3. Installieren Sie das Microsoft.ML NuGet-Paket:

    Hinweis

    In diesem Beispiel wird die neueste stabile Version der erwähnten NuGet-Pakete verwendet, sofern nichts anderes angegeben ist.

    1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projekt, und wählen Sie "NuGet-Pakete verwalten" aus.
    2. Wählen Sie "nuget.org" als Paketquelle aus.
    3. Wählen Sie die Registerkarte Durchsuchen aus.
    4. Aktivieren Sie das Kontrollkästchen "Vorabversionen einschließen ".
    5. Suchen Sie nach Microsoft.ML.
    6. Wählen Sie die Schaltfläche Installieren aus.
    7. Wählen Sie im Dialogfeld "Lizenzakzeptanz" die Schaltfläche "Ich stimme zu", wenn Sie den Lizenzbedingungen für die aufgeführten Pakete zustimmen.
    8. Wiederholen Sie diese Schritte für die Pakete Microsoft.ML.Vision, SciSharp.TensorFlow.Redist (Version 2.3.1) und Microsoft.ML.ImageAnalytics NuGet.

Vorbereiten und Verstehen der Daten

Hinweis

Die Datasets für dieses Lernprogramm stammen aus Maguire, Marc; Dorafshan, Sattar; und Thomas, Robert J., "SDNET2018: Ein konkretes Rissbild-Dataset für Machine Learning-Anwendungen" (2018). Durchsuchen Sie alle Datasets. Papier 48. https://digitalcommons.usu.edu/all_datasets/48

SDNET2018 ist ein Bild-Dataset, das Anmerkungen für rissige und nicht rissige Betonstrukturen (Brückendecks, Wände und Gehsteige) enthält.

Brückendeckbeispiele aus dem SDNET2018-Datensatz

Die Daten sind in drei Unterverzeichnissen angeordnet:

  • D enthält Bilder des Brückendecks
  • P enthält Pflasterbilder
  • W enthält Wandbilder

Jedes dieser Unterverzeichnisse enthält zwei zusätzliche Unterverzeichnisse mit Präfix:

  • C ist das Präfix, das für rissige Oberflächen verwendet wird.
  • U ist das Präfix, das für uncracked Surfaces verwendet wird.

In diesem Lernprogramm werden nur Bilder des Brückendecks verwendet.

  1. Laden Sie das Dataset herunter, und entpacken Sie es.
  2. Erstellen Sie ein Verzeichnis mit dem Namen "Assets" in Ihrem Projekt, um Ihre Datasetdateien zu speichern.
  3. Kopieren Sie die CD- und UD-Unterverzeichnisse aus dem kürzlich extrahierten Verzeichnis in das Assets-Verzeichnis.

Erstellen von Eingabe- und Ausgabeklassen

  1. Öffnen Sie die Program.cs Datei, und ersetzen Sie den vorhandenen Inhalt durch die folgenden using Direktiven:

    using Microsoft.ML;
    using Microsoft.ML.Vision;
    using static Microsoft.ML.DataOperationsCatalog;
    
  2. Erstellen Sie eine Klasse namens ImageData. Diese Klasse wird verwendet, um die anfänglich geladenen Daten darzustellen.

    class ImageData
    {
        public string? ImagePath { get; set; }
        public string? Label { get; set; }
    }
    

    ImageData enthält die folgenden Eigenschaften:

    • ImagePath ist der vollqualifizierte Pfad, in dem das Bild gespeichert ist.
    • Label ist die Kategorie, zu der das Bild gehört. Dies ist der wert, der vorhergesagt werden soll.
  3. Erstellen Sie Klassen für Ihre Eingabe- und Ausgabedaten.

    1. Definieren Sie unter der ImageData Klasse das Schema Ihrer Eingabedaten in einer neuen Klasse namens ModelInput.

      class ModelInput
      {
          public byte[]? Image { get; set; }
          public uint LabelAsKey { get; set; }
          public string? ImagePath { get; set; }
          public string? Label { get; set; }
      }
      

      ModelInput enthält die folgenden Eigenschaften:

      • Image ist die byte[] Darstellung des Bilds. Das Modell erwartet, dass Bilddaten dieser Art für die Schulung vorliegen.
      • LabelAsKey ist die numerische Darstellung der Label.
      • ImagePath ist der vollqualifizierte Pfad, in dem das Bild gespeichert ist.
      • Label ist die Kategorie, zu der das Bild gehört. Dies ist der wert, der vorhergesagt werden soll.

      Nur Image und LabelAsKey werden verwendet, um das Modell zu trainieren und Vorhersagen zu machen. Die Eigenschaften ImagePath und Label werden beibehalten, um den Zugriff auf den ursprünglichen Bilddateinamen und die ursprüngliche Kategorie zu erleichtern.

    2. Definieren Sie dann unter der ModelInput Klasse das Schema Ihrer Ausgabedaten in einer neuen Klasse namens ModelOutput.

      class ModelOutput
      {
          public string? ImagePath { get; set; }
          public string? Label { get; set; }
          public string? PredictedLabel { get; set; }
      }
      

      ModelOutput enthält die folgenden Eigenschaften:

      • ImagePath ist der vollqualifizierte Pfad, in dem das Bild gespeichert ist.
      • Label ist die ursprüngliche Kategorie, zu der das Bild gehört. Dies ist der wert, der vorhergesagt werden soll.
      • PredictedLabel ist der vom Modell vorhergesagte Wert.

      Ähnlich wie ModelInput, nur die PredictedLabel ist erforderlich, um Vorhersagen zu machen, da sie die vom Modell vorgenommene Vorhersage enthält. Die ImagePath- und Label-Eigenschaften werden zur Vereinfachung des Zugriffs auf den ursprünglichen Bilddateinamen und die ursprüngliche Kategorie beibehalten.

Definieren von Pfaden und Initialisieren von Variablen

  1. Fügen Sie unter den using Direktiven den folgenden Code hinzu:

    • Definieren Sie den Speicherort der Objekte.

    • Initialisieren Sie die mlContext Variable mit einer neuen Instanz von MLContext.

      Die MLContext-Klasse ist ein Ausgangspunkt für alle ML.NET Vorgänge, und die Initialisierung von mlContext erstellt eine neue ML.NET Umgebung, die für die Workflowobjekte der Modellerstellung freigegeben werden kann. Es ist konzeptionell ähnlich wie DbContext im Entity Framework.

    var projectDirectory = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "../../../"));
    var assetsRelativePath = Path.Combine(projectDirectory, "Assets");
    
    MLContext mlContext = new();
    

Laden der Daten

Erstellen einer Hilfsprogrammmethode für das Laden von Daten

Die Bilder werden in zwei Unterverzeichnissen gespeichert. Vor dem Laden der Daten muss sie in eine Liste von ImageData Objekten formatiert werden. Erstellen Sie dazu die LoadImagesFromDirectory Methode:

static IEnumerable<ImageData> LoadImagesFromDirectory(string folder, bool useFolderNameAsLabel = true)
{
    var files = Directory.GetFiles(folder, "*",
        searchOption: SearchOption.AllDirectories);

    foreach (var file in files)
    {
        if ((Path.GetExtension(file) != ".jpg") && (Path.GetExtension(file) != ".png"))
            continue;

        var label = Path.GetFileName(file);

        if (useFolderNameAsLabel)
            label = Directory.GetParent(file)?.Name;
        else
        {
            for (int index = 0; index < label.Length; index++)
            {
                if (!char.IsLetter(label[index]))
                {
                    label = label[..index];
                    break;
                }
            }
        }

        yield return new ImageData()
        {
            ImagePath = file,
            Label = label
        };
    }
}

Die LoadImagesFromDirectory-Methode:

  • Ruft alle Dateipfade aus den Unterverzeichnissen ab.
  • Durchlaufen Sie jede einzelne Datei mithilfe einer foreach Anweisung und überprüfen Sie, ob die Dateierweiterungen unterstützt werden. Die Bildklassifizierungs-API unterstützt JPEG- und PNG-Formate.
  • Ruft die Bezeichnung für die Datei ab. Wenn der useFolderNameAsLabel Parameter auf true festgelegt ist, wird das übergeordnete Verzeichnis, in dem die Datei gespeichert wird, als Bezeichnung verwendet. Andernfalls erwartet sie, dass die Bezeichnung ein Präfix des Dateinamens oder des Dateinamens selbst ist.
  • Erstellt eine neue Instanz von ModelInput.

Vorbereiten der Daten

Fügen Sie den folgenden Code nach der Zeile hinzu, in der Sie eine neue Instanz von MLContext erstellen.

IEnumerable<ImageData> images = LoadImagesFromDirectory(folder: assetsRelativePath, useFolderNameAsLabel: true);

IDataView imageData = mlContext.Data.LoadFromEnumerable(images);

IDataView shuffledData = mlContext.Data.ShuffleRows(imageData);

var preprocessingPipeline = mlContext.Transforms.Conversion.MapValueToKey(
        inputColumnName: "Label",
        outputColumnName: "LabelAsKey")
    .Append(mlContext.Transforms.LoadRawImageBytes(
        outputColumnName: "Image",
        imageFolder: assetsRelativePath,
        inputColumnName: "ImagePath"));

IDataView preProcessedData = preprocessingPipeline
                    .Fit(shuffledData)
                    .Transform(shuffledData);

TrainTestData trainSplit = mlContext.Data.TrainTestSplit(data: preProcessedData, testFraction: 0.3);
TrainTestData validationTestSplit = mlContext.Data.TrainTestSplit(trainSplit.TestSet);

IDataView trainSet = trainSplit.TrainSet;
IDataView validationSet = validationTestSplit.TrainSet;
IDataView testSet = validationTestSplit.TestSet;

Der vorherige Code:

  • Ruft die LoadImagesFromDirectory Hilfsmethode auf, um die Liste der Bilder abzurufen, die nach der Initialisierung der mlContext Variablen für die Schulung verwendet werden.

  • Lädt die Bilder in eine IDataView mithilfe der LoadFromEnumerable Methode.

  • Löscht die Daten mithilfe der ShuffleRows Methode. Die Daten werden in der Reihenfolge geladen, in der sie aus den Verzeichnissen gelesen wurde. Der Shuffle wird ausgeführt, um es auszugleichen.

  • Führt vor der Schulung einige Vorverarbeitungen der Daten durch. Dies geschieht, weil Machine Learning-Modelle erwarten, dass eingaben im numerischen Format vorliegen. Der Vorverarbeitungscode erstellt eine EstimatorChain Mischung aus den MapValueToKey Und LoadRawImageBytes Transformationen. Die MapValueToKey-Transformation nimmt den kategorischen Wert in der Label-Spalte, konvertiert ihn in einen numerischen KeyType-Wert und speichert ihn in einer neuen Spalte namens LabelAsKey. Die Werte aus der ImagePath Spalte werden zusammen mit dem imageFolder Parameter verwendet, um Bilder für das Training zu laden.

  • Verwendet die Fit Methode, um die Daten auf die preprocessingPipelineEstimatorChainTransform gefolgte Methode anzuwenden, die eine IDataView mit den vorverarbeiteten Daten zurückgibt.

  • Teilt die Daten in Schulungs-, Validierungs- und Testsätze auf.

    Um ein Modell zu trainieren, ist es wichtig, über ein Schulungsdatenset sowie ein Validierungsdatenset zu verfügen. Das Modell wird auf dem Trainingssatz trainiert. Wie gut es Vorhersagen für nicht angezeigte Daten macht, wird durch die Leistung anhand des Überprüfungssatzes gemessen. Basierend auf den Ergebnissen dieser Leistung nimmt das Modell Anpassungen an das, was es gelernt hat, um dies zu verbessern. Der Überprüfungssatz kann entweder aus dem Teilen Ihres ursprünglichen Datasets oder aus einer anderen Quelle stammen, die bereits für diesen Zweck reserviert wurde.

    Im Codebeispiel werden zwei Aufteilungen durchgeführt. Zunächst werden die vorverarbeiteten Daten aufgeteilt und 70% für schulungen verwendet, während die verbleibenden 30% zur Überprüfung verwendet werden. Anschließend wird der 30% Validierungssatz weiter in Validierungs- und Testsätze aufgeteilt, bei denen 90% für die Validierung verwendet werden und 10% für Tests verwendet wird.

    Eine Möglichkeit, über den Zweck dieser Datenpartitionen nachzudenken, besteht darin, eine Prüfung zu absolvieren. Beim Lernen für eine Prüfung überprüfen Sie Ihre Notizen, Bücher oder andere Ressourcen, um die Konzepte zu verstehen, die in der Prüfung vorkommen. Dies ist das Eisenbahnset. Dann können Sie eine Pseudoprüfung durchführen, um Ihr Wissen zu überprüfen. Hier kommt der Validierungssatz ins Spiel. Sie möchten prüfen, ob Sie die Konzepte gut verstanden haben, bevor Sie die eigentliche Prüfung absolvieren. Basierend auf diesen Ergebnissen notieren Sie sich, was Sie falsch gemacht haben oder nicht gut verstanden haben, und integrieren Sie Ihre Änderungen, während Sie die eigentliche Prüfung überprüfen. Schließlich nehmen Sie die Prüfung ab. Dies ist der Zweck des Testsatzes. Sie haben die Fragen, die im Examen vorkommen, noch nie gesehen und wenden jetzt an, was Sie aus der Schulung und Validierung gelernt haben, um Ihr Wissen auf die Aufgabe, die vor Ihnen liegt, anzuwenden.

  • Den Partitionen werden ihre jeweiligen Werte für die Trainings-, Validierungs- und Testdaten zugewiesen.

Definieren der Schulungspipeline

Die Modellschulung besteht aus zwei Schritten. Zunächst wird die Bildklassifizierungs-API verwendet, um das Modell zu trainieren. Anschließend werden die codierten Beschriftungen in der PredictedLabel-Spalte mithilfe der MapKeyToValue-Transformation wieder in ihren ursprünglichen kategorialen Wert konvertiert.

var classifierOptions = new ImageClassificationTrainer.Options()
{
    FeatureColumnName = "Image",
    LabelColumnName = "LabelAsKey",
    ValidationSet = validationSet,
    Arch = ImageClassificationTrainer.Architecture.ResnetV2101,
    MetricsCallback = (metrics) => Console.WriteLine(metrics),
    TestOnTrainSet = false,
    ReuseTrainSetBottleneckCachedValues = true,
    ReuseValidationSetBottleneckCachedValues = true
};

var trainingPipeline = mlContext.MulticlassClassification.Trainers.ImageClassification(classifierOptions)
    .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));

ITransformer trainedModel = trainingPipeline.Fit(trainSet);

Der vorherige Code:

  • Erstellt eine neue Variable zum Speichern einer Reihe von erforderlichen und optionalen Parametern für ein ImageClassificationTrainer. Eine ImageClassificationTrainer akzeptiert mehrere optionale Parameter:

    • FeatureColumnName ist die Spalte, die als Eingabe für das Modell verwendet wird.
    • LabelColumnName ist die Spalte für den zu prognostizierenden Wert.
    • ValidationSet enthält die IDataView Überprüfungsdaten.
    • Arch definiert, welche der vortrainierten Modellarchitekturen verwendet werden sollen. In diesem Lernprogramm wird die 101-Layer-Variante des ResNetv2-Modells verwendet.
    • MetricsCallback bindet eine Funktion, um den Fortschritt während der Schulung nachzuverfolgen.
    • TestOnTrainSet weist das Modell an, die Leistung anhand des Trainingssatzes zu messen, wenn kein Validierungssatz vorhanden ist.
    • ReuseTrainSetBottleneckCachedValues teilt dem Modell mit, ob die zwischengespeicherten Werte aus der Engpassphase in nachfolgenden Ausführungen verwendet werden sollen. Die Engpassphase ist eine einmalige Pass-Through-Berechnung, die rechenintensiv ist, wenn sie zum ersten Mal ausgeführt wird. Wenn sich die Schulungsdaten nicht ändern und sie mit einer anderen Anzahl von Epochen oder Batchgrößen experimentieren möchten, reduziert die Verwendung der zwischengespeicherten Werte erheblich die Zeit, die zum Trainieren eines Modells erforderlich ist.
    • ReuseValidationSetBottleneckCachedValues ist ReuseTrainSetBottleneckCachedValues ähnlich, nur dass es sich in diesem Fall um den Validierungsdatensatz handelt.
  • Definiert die EstimatorChain-Schulungspipeline, die sich sowohl aus dem mapLabelEstimator als auch aus dem ImageClassificationTrainer zusammensetzt.

  • Verwendet die Fit Methode, um das Modell zu trainieren.

Verwenden Sie das Modell

Nachdem Sie das Modell trainiert haben, ist es an der Zeit, es zum Klassifizieren von Bildern zu verwenden.

Erstellen Sie eine neue Hilfsmethode, die aufgerufen wird OutputPrediction , um Vorhersageinformationen in der Konsole anzuzeigen.

static void OutputPrediction(ModelOutput prediction)
{
    string? imageName = Path.GetFileName(prediction.ImagePath);
    Console.WriteLine($"Image: {imageName} | Actual Value: {prediction.Label} | Predicted Value: {prediction.PredictedLabel}");
}

Klassifizieren eines einzelnen Bilds

  1. Erstellen Sie eine Methode, die aufgerufen wird ClassifySingleImage , um eine einzelne Bildvorhersage zu erstellen und auszugeben.

    static void ClassifySingleImage(MLContext mlContext, IDataView data, ITransformer trainedModel)
    {
        PredictionEngine<ModelInput, ModelOutput> predictionEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(trainedModel);
    
        ModelInput image = mlContext.Data.CreateEnumerable<ModelInput>(data, reuseRowObject: true).First();
    
        ModelOutput prediction = predictionEngine.Predict(image);
    
        Console.WriteLine("Classifying single image");
        OutputPrediction(prediction);
    }
    

    Die ClassifySingleImage-Methode:

    • Erstellt eine PredictionEngine innerhalb der ClassifySingleImage Methode. Dies PredictionEngine ist eine Komfort-API, mit der Sie eine Vorhersage für eine einzelne Dateninstanz durchführen können.
    • Wenn Sie auf eine einzelne ModelInput Instanz zugreifen möchten, konvertiert sie dataIDataView in eine IEnumerable mithilfe der CreateEnumerable Methode und ruft dann die erste Beobachtung ab.
    • Verwendet die Predict Methode zum Klassifizieren des Bilds.
    • Gibt die Vorhersage mit der OutputPrediction Methode an die Konsole aus.
  2. Rufen Sie ClassifySingleImage auf, nachdem Sie die Fit-Methode mit dem Testsatz von Bildern aufgerufen haben.

    ClassifySingleImage(mlContext, testSet, trainedModel);
    

Klassifizieren mehrerer Bilder

  1. Erstellen Sie eine Methode, die aufgerufen wird ClassifyImages , um mehrere Bildvorhersagen zu erstellen und auszugeben.

    static void ClassifyImages(MLContext mlContext, IDataView data, ITransformer trainedModel)
    {
        IDataView predictionData = trainedModel.Transform(data);
    
        IEnumerable<ModelOutput> predictions = mlContext.Data.CreateEnumerable<ModelOutput>(predictionData, reuseRowObject: true).Take(10);
    
        Console.WriteLine("Classifying multiple images");
        foreach (var prediction in predictions)
        {
            OutputPrediction(prediction);
        }
    }
    

    Die ClassifyImages-Methode:

    • Erstellt eine IDataView mit der Methode enthaltende Transform Vorhersage.
    • Um über die Vorhersagen zu iterieren, werden predictionDataIDataView mittels der Methode CreateEnumerable in ein IEnumerable umgewandelt und die ersten 10 Beobachtungen abgerufen.
    • Durchläuft und gibt die ursprünglichen und vorhergesagten Labels für die Prognosen aus.
  2. Rufen Sie ClassifyImages auf, nachdem Sie die ClassifySingleImage()-Methode mit dem Testsatz von Bildern aufgerufen haben.

    ClassifyImages(mlContext, testSet, trainedModel);
    

Ausführen der Anwendung

Führen Sie Ihre Konsolen-App aus. Die Ausgabe sollte der folgenden Ausgabe ähneln.

Hinweis

Möglicherweise werden Warnungen oder die Verarbeitung von Nachrichten angezeigt; Diese Nachrichten wurden aus den folgenden Ergebnissen aus Gründen der Übersichtlichkeit entfernt. Aus Platzgründen wurde die Ausgabe kondensiert.

Engpassphase

Für den Bildnamen wird kein Wert ausgegeben, da die Bilder als byte[] geladen werden und es aus diesem Grund keinen Bildnamen gibt, der angezeigt werden kann.

Phase: Bottleneck Computation, Dataset used:      Train, Image Index: 279
Phase: Bottleneck Computation, Dataset used:      Train, Image Index: 280
Phase: Bottleneck Computation, Dataset used: Validation, Image Index:   1
Phase: Bottleneck Computation, Dataset used: Validation, Image Index:   2

Schulungsphase

Phase: Training, Dataset used: Validation, Batch Processed Count:   6, Epoch:  21, Accuracy:  0.6797619
Phase: Training, Dataset used: Validation, Batch Processed Count:   6, Epoch:  22, Accuracy:  0.7642857
Phase: Training, Dataset used: Validation, Batch Processed Count:   6, Epoch:  23, Accuracy:  0.7916667

Klassifizieren der Bildausgabe

Classifying single image
Image: 7001-220.jpg | Actual Value: UD | Predicted Value: UD

Classifying multiple images
Image: 7001-220.jpg | Actual Value: UD | Predicted Value: UD
Image: 7001-163.jpg | Actual Value: UD | Predicted Value: UD
Image: 7001-210.jpg | Actual Value: UD | Predicted Value: UD

Bei der Überprüfung des 7001-220.jpg Bildes können Sie feststellen, dass es nicht rissig ist, wie das Modell vorhergesagt hat.

SDNET2018-Datasetbild, das für die Vorhersage verwendet wird

Glückwunsch! Sie haben nun erfolgreich ein Deep Learning-Modell für die Klassifizierung von Bildern erstellt.

Verbessern des Modells

Wenn Sie mit den Ergebnissen des Modells nicht zufrieden sind, können Sie versuchen, die Leistung zu verbessern, indem Sie einige der folgenden Ansätze ausprobieren:

  • Weitere Daten: Je mehr Beispiele ein Modell lernt, desto besser ist es. Laden Sie das vollständige SDNET2018 Dataset herunter, und verwenden Sie es zum Trainieren.
  • Erweitern Sie die Daten: Eine gängige Technik zum Hinzufügen von Vielfalt zu den Daten besteht darin, die Daten zu erweitern, indem sie ein Bild aufnehmen und verschiedene Transformationen anwenden (Drehen, Kippen, Umschalten, Zuschneiden). Dadurch werden vielfältigere Beispiele für das Modell hinzugefügt, aus dem sie lernen können.
  • Trainieren Sie länger: Je länger Sie trainieren, desto besser wird das Modell abgestimmt. Durch die Erhöhung der Anzahl von Epochen kann die Leistung Ihres Modells verbessert werden.
  • Experimentieren Sie mit den Hyperparametern: Zusätzlich zu den in diesem Lernprogramm verwendeten Parametern können andere Parameter optimiert werden, um die Leistung potenziell zu verbessern. Eine Änderung der Lernrate, die die Größe der Aktualisierungen an dem Modell nach jeder Epoche bestimmt, kann die Leistung verbessern.
  • Verwenden Sie eine andere Modellarchitektur: Je nachdem, wie Ihre Daten aussehen, kann sich das Modell, das seine Features am besten erlernen kann, unterscheiden. Wenn Sie mit der Leistung Ihres Modells nicht zufrieden sind, versuchen Sie, die Architektur zu ändern.

Nächste Schritte

In diesem Lernprogramm haben Sie gelernt, wie Sie ein benutzerdefiniertes Deep Learning-Modell mit Transferlernen, ein vortrainiertes TensorFlow-Modell und die ML.NET Bildklassifizierungs-API erstellen, um Bilder konkreter Oberflächen als zerbrochen oder ungecrackt zu klassifizieren.

Wechseln Sie zum nächsten Lernprogramm, um mehr zu erfahren.

Siehe auch