Zelfstudie: Geautomatiseerde visuele inspectie met behulp van overdrachtsleer met de ML.NET Afbeeldingsclassificatie-API

Leer hoe u een aangepast deep learning-model traint met behulp van overdrachtsleer, een vooraf getraind TensorFlow-model en de ML.NET Afbeeldingsclassificatie-API om afbeeldingen van betonnen oppervlakken te classificeren als gebarsten of niet-gescheurd.

In deze zelfstudie leert u het volgende:

  • Inzicht in het probleem
  • Meer informatie over ML.NET afbeeldingsclassificatie-API
  • Het vooraf getrainde model begrijpen
  • Overdrachtsleer gebruiken om een aangepast TensorFlow-afbeeldingsclassificatiemodel te trainen
  • Afbeeldingen classificeren met het aangepaste model

Vereisten

Overzicht van voorbeeld van overdracht van afbeeldingsclassificatie

Dit voorbeeld is een C# .NET Core-consoletoepassing waarmee afbeeldingen worden geclassificeerd met behulp van een vooraf getraind Deep Learning TensorFlow-model. De code voor dit voorbeeld vindt u in de voorbeeldbrowser.

Inzicht in het probleem

Afbeeldingsclassificatie is een probleem met Computer Vision. Afbeeldingsclassificatie neemt een afbeelding als invoer en categoriseert deze in een voorgeschreven klasse. Modellen voor afbeeldingsclassificatie worden doorgaans getraind met behulp van deep learning en neurale netwerken. Zie Deep learning versus machine learning voor meer informatie.

Enkele scenario's waarin afbeeldingsclassificatie nuttig is, zijn onder andere:

  • Gezichtsherkenning
  • Emotiedetectie
  • Medische diagnose
  • Oriëntatiepuntdetectie

In deze zelfstudie wordt een aangepast model voor afbeeldingsclassificatie getraind om automatische visuele inspectie van brugdekken uit te voeren om structuren te identificeren die beschadigd zijn door scheuren.

ML.NET Afbeeldingsclassificatie-API

ML.NET biedt verschillende manieren om afbeeldingsclassificatie uit te voeren. In deze zelfstudie wordt overdrachtsleer toegepast met behulp van de Afbeeldingsclassificatie-API. De Afbeeldingsclassificatie-API maakt gebruik van TensorFlow.NET, een bibliotheek op laag niveau die C#-bindingen biedt voor de TensorFlow C++-API.

Wat is kennisoverdracht?

Kennis overdragen past kennis toe die is opgedaan bij het oplossen van het ene probleem naar het andere gerelateerde probleem.

Voor het trainen van een volledig nieuw deep learning-model zijn het instellen van verschillende parameters, een grote hoeveelheid gelabelde trainingsgegevens en een enorme hoeveelheid rekenresources (honderden GPU-uren) vereist. Met behulp van een vooraf getraind model in combinatie met overdrachtsleer kunt u het trainingsproces versnellen.

Trainingsproces

De Afbeeldingsclassificatie-API start het trainingsproces door een vooraf getraind TensorFlow-model te laden. Het trainingsproces bestaat uit twee stappen:

  1. Knelpuntfase
  2. Trainingsfase

Trainingsstappen

Knelpuntfase

Tijdens de knelpuntfase wordt de set trainingsafbeeldingen geladen en worden de pixelwaarden gebruikt als invoer of functies voor de bevroren lagen van het vooraf getrainde model. De bevroren lagen omvatten alle lagen in het neurale netwerk tot de voorlaatste laag, informeel bekend als de knelpuntlaag. Deze lagen worden bevroren genoemd omdat er geen training op deze lagen plaatsvindt en bewerkingen passthrough zijn. In deze bevroren lagen worden de patronen op het lagere niveau berekend die een model helpen onderscheid te maken tussen de verschillende klassen. Hoe groter het aantal lagen, hoe meer rekenintensief deze stap is. Omdat dit een eenmalige berekening is, kunnen de resultaten in de cache worden opgeslagen en in latere uitvoeringen worden gebruikt bij het experimenteren met verschillende parameters.

Trainingsfase

Zodra de uitvoerwaarden van de knelpuntfase zijn berekend, worden ze gebruikt als invoer om de laatste laag van het model opnieuw te trainen. Dit proces is iteratief en wordt uitgevoerd voor het aantal keren dat is opgegeven door modelparameters. Tijdens elke uitvoering worden het verlies en de nauwkeurigheid geëvalueerd. Vervolgens worden de juiste aanpassingen aangebracht om het model te verbeteren met als doel het verlies te minimaliseren en de nauwkeurigheid te maximaliseren. Zodra de training is voltooid, worden er twee modelindelingen uitgevoerd. Een van deze is de .pb versie van het model en de andere is de .zip ML.NET geserialiseerde versie van het model. Wanneer u werkt in omgevingen die worden ondersteund door ML.NET, wordt aanbevolen om de .zip versie van het model te gebruiken. In omgevingen waarin ML.NET niet wordt ondersteund, hebt u echter de mogelijkheid om de .pb versie te gebruiken.

Het vooraf getrainde model begrijpen

Het vooraf getrainde model dat in deze zelfstudie wordt gebruikt, is de 101-laags variant van het restnetwerk (ResNet) v2-model. Het oorspronkelijke model is getraind om afbeeldingen in duizend categorieën te classificeren. Het model gebruikt als invoer een afbeelding met een grootte van 224 x 224 en voert de klasse waarschijnlijkheden uit voor elk van de klassen waarop het is getraind. Een deel van dit model wordt gebruikt om een nieuw model te trainen met behulp van aangepaste afbeeldingen om voorspellingen te doen tussen twee klassen.

Consoletoepassing maken

Nu u een algemeen begrip hebt van transfer learning en de Afbeeldingsclassificatie-API, is het tijd om de toepassing te bouwen.

  1. Maak een C# -consoletoepassing met de naam 'DeepLearning_ImageClassification_Binary'. Klik op de knop Next

  2. Kies .NET 6 als het framework dat u wilt gebruiken. Klik op de knop Maken.

  3. Installeer het Microsoft.ML NuGet-pakket:

    Notitie

    In dit voorbeeld wordt de meest recente stabiele versie van de genoemde NuGet-pakketten gebruikt, tenzij anders vermeld.

    1. Klik in Solution Explorer met de rechtermuisknop op uw project en selecteer NuGet-pakketten beheren.
    2. Kies 'nuget.org' als pakketbron.
    3. Selecteer het tabblad Bladeren.
    4. Schakel het selectievakje Voorlopige versie opnemen in.
    5. Zoek naar Microsoft.ML.
    6. Selecteer de knop Installeren .
    7. Selecteer de knop OK in het dialoogvenster Voorbeeld van wijzigingen en selecteer vervolgens de knop Ik ga akkoord in het dialoogvenster Licentie-acceptatie als u akkoord gaat met de licentievoorwaarden voor de vermelde pakketten.
    8. Herhaal deze stappen voor de NuGet-pakketten Microsoft.ML.Vision, SciSharp.TensorFlow.Redist versie 2.3.1 en Microsoft.ML.ImageAnalytics .

De gegevens voorbereiden en begrijpen

Notitie

De gegevenssets voor deze zelfstudie zijn van Maguire, Marc; Dorafshan, Sattar; en Thomas, Robert J., "SDNET2018: A concrete crack image dataset for machine learning applications" (2018). Door alle gegevenssets bladeren. Papier 48. https://digitalcommons.usu.edu/all_datasets/48

SDNET2018 is een gegevensset met afbeeldingen die aantekeningen bevat voor gebarsten en niet-gebarsten betonconstructies (brugdekken, muren en bestrating).

Voorbeelden van sdnet2018-gegevenssetsbrug

De gegevens zijn geordend in drie submappen:

  • D bevat afbeeldingen van brugdek
  • P bevat stoepafbeeldingen
  • W bevat wandafbeeldingen

Elk van deze submappen bevat twee extra submappen met een voorvoegsel:

  • C is het voorvoegsel dat wordt gebruikt voor gebarsten oppervlakken
  • U is het voorvoegsel dat wordt gebruikt voor niet-gekraakte oppervlakken

In deze zelfstudie worden alleen brugdekinstallatiekopieën gebruikt.

  1. Download de gegevensset en pak het uit.
  2. Maak een map met de naam 'assets' in uw project om uw gegevenssetbestanden op te slaan.
  3. Kopieer de submappen cd en UD van de onlangs uitgepakte map naar de map assets .

Invoer- en uitvoerklassen maken

  1. Open het bestand Program.cs en vervang de bestaande using instructies boven aan het bestand door het volgende:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.IO;
    using Microsoft.ML;
    using static Microsoft.ML.DataOperationsCatalog;
    using Microsoft.ML.Vision;
    
  2. Maak onder de Program klasse in Program.cs een klasse met de naam ImageData. Deze klasse wordt gebruikt om de oorspronkelijk geladen gegevens weer te geven.

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

    ImageData bevat de volgende eigenschappen:

    • ImagePath is het volledig gekwalificeerde pad waar de installatiekopieën zijn opgeslagen.
    • Label is de categorie waartoe de afbeelding behoort. Dit is de waarde die moet worden voorspeld.
  3. Klassen maken voor uw invoer- en uitvoergegevens

    1. Definieer onder de ImageData klasse het schema van uw invoergegevens in een nieuwe klasse met de naam ModelInput.

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

      ModelInput bevat de volgende eigenschappen:

      • Image is de byte[] weergave van de afbeelding. Het model verwacht dat afbeeldingsgegevens van dit type zijn voor training.
      • LabelAsKey is de numerieke weergave van de Label.
      • ImagePath is het volledig gekwalificeerde pad waar de installatiekopieën zijn opgeslagen.
      • Label is de categorie waartoe de afbeelding behoort. Dit is de waarde die moet worden voorspeld.

      Alleen Image en LabelAsKey worden gebruikt om het model te trainen en voorspellingen te doen. De ImagePath eigenschappen en Label worden voor het gemak bewaard om toegang te krijgen tot de naam en categorie van het oorspronkelijke afbeeldingsbestand.

    2. Definieer vervolgens onder de ModelInput klasse het schema van uw uitvoergegevens in een nieuwe klasse met de naam ModelOutput.

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

      ModelOutput bevat de volgende eigenschappen:

      • ImagePath is het volledig gekwalificeerde pad waar de installatiekopieën zijn opgeslagen.
      • Label is de oorspronkelijke categorie waartoe de afbeelding behoort. Dit is de waarde die moet worden voorspeld.
      • PredictedLabel is de waarde die door het model wordt voorspeld.

      ModelInputNet als , is alleen de PredictedLabel vereist om voorspellingen te doen, omdat deze de voorspelling bevat die door het model is gedaan. De ImagePath eigenschappen en Label worden voor het gemak bewaard voor toegang tot de oorspronkelijke bestandsnaam en categorie van de installatiekopieën.

Werkruimtemap maken

Wanneer training- en validatiegegevens niet vaak worden gewijzigd, is het raadzaam om de berekende knelpuntwaarden in de cache op te slaan voor verdere uitvoeringen.

  1. Maak in uw project een nieuwe map met de naam werkruimte om de berekende knelpuntwaarden en .pb de versie van het model op te slaan.

Paden definiëren en variabelen initialiseren

  1. Definieer onder de using-instructies de locatie van uw assets, berekende knelpuntwaarden en .pb de versie van het model.

    var projectDirectory = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "../../../"));
    var workspaceRelativePath = Path.Combine(projectDirectory, "workspace");
    var assetsRelativePath = Path.Combine(projectDirectory, "assets");
    
  2. Initialiseer de mlContext variabele met een nieuw exemplaar van MLContext.

    MLContext mlContext = new MLContext();
    

    De mlContext-klasse is een startpunt voor alle ML.NET bewerkingen. Als u mlContext initialiseert, wordt er een nieuwe ML.NET omgeving gemaakt die kan worden gedeeld met de werkstroomobjecten voor het maken van modellen. Het is conceptueel DbContext vergelijkbaar met in Entity Framework.

De gegevens laden

Hulpprogrammamethode voor het laden van gegevens maken

De afbeeldingen worden opgeslagen in twee submappen. Voordat de gegevens worden geladen, moet deze worden opgemaakt in een lijst ImageData met objecten. U doet dit door de LoadImagesFromDirectory methode te maken.

IEnumerable<ImageData> LoadImagesFromDirectory(string folder, bool useFolderNameAsLabel = true)
{

}
  1. Voeg in de LoadImagesFromDirectoryde volgende code toe om alle bestandspaden uit de submappen op te halen:

    var files = Directory.GetFiles(folder, "*",
        searchOption: SearchOption.AllDirectories);
    
  2. Herhaal vervolgens elk van de bestanden met behulp van een foreach -instructie.

    foreach (var file in files)
    {
    
    }
    
  3. Controleer in de foreach -instructie of de bestandsextensies worden ondersteund. De Afbeeldingsclassificatie-API ondersteunt JPEG- en PNG-indelingen.

    if ((Path.GetExtension(file) != ".jpg") && (Path.GetExtension(file) != ".png"))
        continue;
    
    
  4. Haal vervolgens het label voor het bestand op. Als de useFolderNameAsLabel parameter is ingesteld op true, wordt de bovenliggende map waarin het bestand is opgeslagen als label gebruikt. Anders wordt verwacht dat het label een voorvoegsel is van de bestandsnaam of de bestandsnaam zelf.

    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.Substring(0, index);
                break;
            }
        }
    }
    
  5. Maak ten slotte een nieuw exemplaar van ModelInput.

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

De gegevens voorbereiden

  1. Roep de LoadImagesFromDirectory hulpprogrammamethode aan om de lijst met afbeeldingen op te halen die worden gebruikt voor training na het initialiseren van de mlContext variabele.

    IEnumerable<ImageData> images = LoadImagesFromDirectory(folder: assetsRelativePath, useFolderNameAsLabel: true);
    
  2. Laad vervolgens de afbeeldingen in een IDataView met behulp van de LoadFromEnumerable methode .

    IDataView imageData = mlContext.Data.LoadFromEnumerable(images);
    
  3. De gegevens worden geladen in de volgorde waarin ze zijn gelezen uit de mappen. Als u de gegevens wilt verdelen, moet u deze in willekeurige volgorde verdelen met behulp van de ShuffleRows methode .

    IDataView shuffledData = mlContext.Data.ShuffleRows(imageData);
    
  4. Machine learning-modellen verwachten dat invoer een numerieke indeling heeft. Daarom moet er voorafgaand aan de training enige voorverwerking worden uitgevoerd op de gegevens. Maak een EstimatorChain die bestaat uit de MapValueToKey transformaties en LoadRawImageBytes . De MapValueToKey transformatie neemt de categorische waarde in de kolom, converteert deze naar een numerieke KeyType waarde en slaat deze op in een nieuwe kolom met de Label naam LabelAsKey. De LoadImages neemt de waarden uit de ImagePath kolom samen met de parameter voor het imageFolder laden van afbeeldingen voor training.

    var preprocessingPipeline = mlContext.Transforms.Conversion.MapValueToKey(
            inputColumnName: "Label",
            outputColumnName: "LabelAsKey")
        .Append(mlContext.Transforms.LoadRawImageBytes(
            outputColumnName: "Image",
            imageFolder: assetsRelativePath,
            inputColumnName: "ImagePath"));
    
  5. Gebruik de Fit methode om de gegevens toe te passen op de preprocessingPipelineEstimatorChain gevolgd door de Transform methode, die een IDataView retourneert die de voorbewerkte gegevens bevat.

    IDataView preProcessedData = preprocessingPipeline
                        .Fit(shuffledData)
                        .Transform(shuffledData);
    
  6. Als u een model wilt trainen, is het belangrijk dat u een trainingsgegevensset en een validatiegegevensset hebt. Het model wordt getraind op de trainingsset. Hoe goed het voorspellingen doet over ongeziene gegevens, wordt gemeten aan de hand van de prestaties van de validatieset. Op basis van de resultaten van die prestaties maakt het model aanpassingen in wat het heeft geleerd in een poging om te verbeteren. De validatieset kan afkomstig zijn van het splitsen van uw oorspronkelijke gegevensset of van een andere bron die al voor dit doel is gereserveerd. In dit geval wordt de vooraf verwerkte gegevensset gesplitst in trainings-, validatie- en testsets.

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

    In het bovenstaande codevoorbeeld worden twee splitsingen uitgevoerd. Eerst worden de voorbewerkte gegevens gesplitst en wordt 70% gebruikt voor training, terwijl de resterende 30% wordt gebruikt voor validatie. Vervolgens wordt de validatieset van 30% verder gesplitst in validatie- en testsets, waarbij 90% wordt gebruikt voor validatie en 10% voor testen.

    Een manier om na te denken over het doel van deze gegevenspartities is het afleggen van een examen. Wanneer u voor een examen studeert, bekijkt u uw notities, boeken of andere bronnen om inzicht te krijgen in de concepten die op het examen staan. Dit is waar de treinset voor is. Vervolgens kunt u een proefexamen maken om uw kennis te valideren. Hier komt de validatieset van pas. U wilt controleren of u de concepten goed begrijpt voordat u het daadwerkelijke examen aflegt. Op basis van deze resultaten noteert u wat er verkeerd is gegaan of wat u niet goed begreep en neemt u uw wijzigingen op tijdens het beoordelen van het echte examen. Ten slotte doe je het examen. Dit is waarvoor de testset wordt gebruikt. U hebt de vragen die op het examen staan nog nooit gezien en gebruikt nu wat u hebt geleerd van training en validatie om uw kennis toe te passen op de taak die u uitvoert.

  7. Wijs de partities hun respectieve waarden toe voor de train-, validatie- en testgegevens.

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

De trainingspijplijn definiëren

Modeltraining bestaat uit een aantal stappen. Eerst wordt afbeeldingsclassificatie-API gebruikt om het model te trainen. Vervolgens worden de gecodeerde labels in de PredictedLabel kolom met behulp van de transformatie geconverteerd naar hun MapKeyToValue oorspronkelijke categorische waarde.

  1. Maak een nieuwe variabele voor het opslaan van een set vereiste en optionele parameters voor een ImageClassificationTrainer.

    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
    };
    

    Een ImageClassificationTrainer heeft verschillende optionele parameters:

    • FeatureColumnName is de kolom die wordt gebruikt als invoer voor het model.
    • LabelColumnName is de kolom voor de waarde die moet worden voorspeld.
    • ValidationSet is de IDataView die de validatiegegevens bevat.
    • Arch definieert welke van de vooraf getrainde modelarchitecturen moeten worden gebruikt. In deze zelfstudie wordt gebruikgemaakt van de 101-laags variant van het ResNetv2-model.
    • MetricsCallback bindt een functie om de voortgang tijdens de training bij te houden.
    • TestOnTrainSet vertelt het model de prestaties te meten ten opzichte van de trainingsset wanneer er geen validatieset aanwezig is.
    • ReuseTrainSetBottleneckCachedValues vertelt het model of de in de cache opgeslagen waarden uit de knelpuntfase in volgende uitvoeringen moeten worden gebruikt. De knelpuntfase is een eenmalige passthrough-berekening die rekenintensief is wanneer deze voor het eerst wordt uitgevoerd. Als de trainingsgegevens niet veranderen en u wilt experimenteren met een ander aantal epochs of batchgrootte, vermindert het gebruik van de waarden in de cache de hoeveelheid tijd die nodig is om een model te trainen aanzienlijk.
    • ReuseValidationSetBottleneckCachedValues is alleen vergelijkbaar met ReuseTrainSetBottleneckCachedValues dat in dit geval voor de validatiegegevensset.
    • WorkspacePath definieert de map waar de berekende knelpuntwaarden en .pb de versie van het model moeten worden opgeslagen.
  2. Definieer de EstimatorChain trainingspijplijn die bestaat uit zowel de mapLabelEstimator als de ImageClassificationTrainer.

    var trainingPipeline = mlContext.MulticlassClassification.Trainers.ImageClassification(classifierOptions)
        .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
    
  3. Gebruik de Fit methode om uw model te trainen.

    ITransformer trainedModel = trainingPipeline.Fit(trainSet);
    

Het model gebruiken

Nu u uw model hebt getraind, is het tijd om het te gebruiken om afbeeldingen te classificeren.

Maak een nieuwe hulpprogrammamethode met de naam OutputPrediction om voorspellingsgegevens weer te geven in de console.

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

Een enkele afbeelding classificeren

  1. Maak een nieuwe methode met de naam ClassifySingleImage om één afbeeldingsvoorspelling te maken en uit te voeren.

    void ClassifySingleImage(MLContext mlContext, IDataView data, ITransformer trainedModel)
    {
    
    }
    
  2. Maak een PredictionEngine in de ClassifySingleImage methode. De PredictionEngine is een handige API, waarmee u gegevens kunt doorgeven en vervolgens een voorspelling kunt uitvoeren op één exemplaar van gegevens.

    PredictionEngine<ModelInput, ModelOutput> predictionEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(trainedModel);
    
  3. Als u toegang wilt krijgen tot één ModelInput exemplaar, converteert u de dataIDataView naar een IEnumerable met behulp van de CreateEnumerable methode en haalt u vervolgens de eerste waarneming op.

    ModelInput image = mlContext.Data.CreateEnumerable<ModelInput>(data,reuseRowObject:true).First();
    
  4. Gebruik de Predict methode om de afbeelding te classificeren.

    ModelOutput prediction = predictionEngine.Predict(image);
    
  5. Voer de voorspelling uit naar de console met de OutputPrediction methode .

    Console.WriteLine("Classifying single image");
    OutputPrediction(prediction);
    
  6. Roep ClassifySingleImage hieronder de Fit methode aan met behulp van de testset met afbeeldingen.

    ClassifySingleImage(mlContext, testSet, trainedModel);
    

Meerdere afbeeldingen classificeren

  1. Voeg een nieuwe methode toe met de naam ClassifyImages onder de ClassifySingleImage -methode om voorspellingen voor meerdere afbeeldingen te doen en uit te voeren.

    void ClassifyImages(MLContext mlContext, IDataView data, ITransformer trainedModel)
    {
    
    }
    
  2. Maak een IDataView met de voorspellingen met behulp van de Transform methode . Voeg de volgende code toe in de ClassifyImages -methode.

    IDataView predictionData = trainedModel.Transform(data);
    
  3. Als u de voorspellingen wilt herhalen, converteert u de predictionDataIDataView naar een IEnumerable met behulp van de CreateEnumerable methode en haalt u vervolgens de eerste 10 waarnemingen op.

    IEnumerable<ModelOutput> predictions = mlContext.Data.CreateEnumerable<ModelOutput>(predictionData, reuseRowObject: true).Take(10);
    
  4. De oorspronkelijke en voorspelde labels voor de voorspellingen herhalen en uitvoeren.

    Console.WriteLine("Classifying multiple images");
    foreach (var prediction in predictions)
    {
        OutputPrediction(prediction);
    }
    
  5. Roep ten slotte ClassifyImages aan onder de ClassifySingleImage() methode met behulp van de testset met afbeeldingen.

    ClassifyImages(mlContext, testSet, trainedModel);
    

De toepassing uitvoeren

Voer uw console-app uit. De uitvoer moet er ongeveer als volgt uitzien. Mogelijk ziet u waarschuwingen of verwerking van berichten, maar deze berichten zijn voor de duidelijkheid verwijderd uit de volgende resultaten. Kortheidshalve is de uitvoer ingekort.

Knelpuntfase

Er wordt geen waarde afgedrukt voor de naam van de afbeelding omdat de afbeeldingen als een byte[] zijn geladen en er dus geen naam voor de afbeelding is om weer te geven.

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

Trainingsfase

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

Uitvoer van afbeeldingen classificeren

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

Bij inspectie van de 7001-220.jpg afbeelding, kunt u zien dat deze in feite niet is gebarsten.

SDNET2018-gegevenssetafbeelding die wordt gebruikt voor voorspelling

Gefeliciteerd U hebt nu een Deep Learning-model gebouwd voor het classificeren van afbeeldingen.

Het model verbeteren

Als u niet tevreden bent met de resultaten van uw model, kunt u proberen de prestaties te verbeteren door een aantal van de volgende benaderingen te proberen:

  • Meer gegevens: hoe meer voorbeelden een model leert, hoe beter het presteert. Download de volledige SDNET2018-gegevensset en gebruik deze om te trainen.
  • De gegevens uitbreiden: een veelgebruikte techniek om variatie toe te voegen aan de gegevens is het uitbreiden van de gegevens door een afbeelding te maken en verschillende transformaties toe te passen (draaien, spiegelen, verschuiven, bijsnijden). Dit voegt meer gevarieerde voorbeelden toe voor het model om van te leren.
  • Trainen voor een langere tijd: hoe langer u traint, hoe beter het model wordt afgestemd. Het verhogen van het aantal tijdvakken kan de prestaties van uw model verbeteren.
  • Experimenteren met de hyperparameters: naast de parameters die in deze zelfstudie worden gebruikt, kunnen andere parameters worden afgestemd om de prestaties mogelijk te verbeteren. Het wijzigen van de leersnelheid, waarmee de grootte van updates in het model na elk tijdvak wordt bepaald, kan de prestaties verbeteren.
  • Een andere modelarchitectuur gebruiken: afhankelijk van hoe uw gegevens eruit zien, kan het model dat de functies het beste kan leren, verschillen. Als u niet tevreden bent met de prestaties van uw model, kunt u de architectuur wijzigen.

Volgende stappen

In deze zelfstudie hebt u geleerd hoe u een aangepast deep learning-model bouwt met behulp van overdrachtsleer, een vooraf getraind TensorFlow-model voor afbeeldingsclassificatie en de ML.NET Api voor afbeeldingsclassificatie om afbeeldingen van betonnen oppervlakken te classificeren als gebarsten of niet-gebarsten.

Ga naar de volgende zelfstudie voor meer informatie.