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:
- Knelpuntfase
- Trainingsfase
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.
Maak een C# -consoletoepassing met de naam 'DeepLearning_ImageClassification_Binary'. Klik op de knop Next
Kies .NET 6 als het framework dat u wilt gebruiken. Klik op de knop Maken.
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.
- Klik in Solution Explorer met de rechtermuisknop op uw project en selecteer NuGet-pakketten beheren.
- Kies 'nuget.org' als pakketbron.
- Selecteer het tabblad Bladeren.
- Schakel het selectievakje Voorlopige versie opnemen in.
- Zoek naar Microsoft.ML.
- Selecteer de knop Installeren .
- 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.
- 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).
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.
- Download de gegevensset en pak het uit.
- Maak een map met de naam 'assets' in uw project om uw gegevenssetbestanden op te slaan.
- Kopieer de submappen cd en UD van de onlangs uitgepakte map naar de map assets .
Invoer- en uitvoerklassen maken
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;
Maak onder de
Program
klasse in Program.cs een klasse met de naamImageData
. 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.
Klassen maken voor uw invoer- en uitvoergegevens
Definieer onder de
ImageData
klasse het schema van uw invoergegevens in een nieuwe klasse met de naamModelInput
.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 debyte[]
weergave van de afbeelding. Het model verwacht dat afbeeldingsgegevens van dit type zijn voor training.LabelAsKey
is de numerieke weergave van deLabel
.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
enLabelAsKey
worden gebruikt om het model te trainen en voorspellingen te doen. DeImagePath
eigenschappen enLabel
worden voor het gemak bewaard om toegang te krijgen tot de naam en categorie van het oorspronkelijke afbeeldingsbestand.Definieer vervolgens onder de
ModelInput
klasse het schema van uw uitvoergegevens in een nieuwe klasse met de naamModelOutput
.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.
ModelInput
Net als , is alleen dePredictedLabel
vereist om voorspellingen te doen, omdat deze de voorspelling bevat die door het model is gedaan. DeImagePath
eigenschappen enLabel
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.
- 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
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");
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)
{
}
Voeg in de
LoadImagesFromDirectory
de volgende code toe om alle bestandspaden uit de submappen op te halen:var files = Directory.GetFiles(folder, "*", searchOption: SearchOption.AllDirectories);
Herhaal vervolgens elk van de bestanden met behulp van een
foreach
-instructie.foreach (var file in files) { }
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;
Haal vervolgens het label voor het bestand op. Als de
useFolderNameAsLabel
parameter is ingesteld optrue
, 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; } } }
Maak ten slotte een nieuw exemplaar van
ModelInput
.yield return new ImageData() { ImagePath = file, Label = label };
De gegevens voorbereiden
Roep de
LoadImagesFromDirectory
hulpprogrammamethode aan om de lijst met afbeeldingen op te halen die worden gebruikt voor training na het initialiseren van demlContext
variabele.IEnumerable<ImageData> images = LoadImagesFromDirectory(folder: assetsRelativePath, useFolderNameAsLabel: true);
Laad vervolgens de afbeeldingen in een
IDataView
met behulp van deLoadFromEnumerable
methode .IDataView imageData = mlContext.Data.LoadFromEnumerable(images);
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);
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 deMapValueToKey
transformaties enLoadRawImageBytes
. DeMapValueToKey
transformatie neemt de categorische waarde in de kolom, converteert deze naar een numeriekeKeyType
waarde en slaat deze op in een nieuwe kolom met deLabel
naamLabelAsKey
. DeLoadImages
neemt de waarden uit deImagePath
kolom samen met de parameter voor hetimageFolder
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"));
Gebruik de
Fit
methode om de gegevens toe te passen op depreprocessingPipeline
EstimatorChain
gevolgd door deTransform
methode, die eenIDataView
retourneert die de voorbewerkte gegevens bevat.IDataView preProcessedData = preprocessingPipeline .Fit(shuffledData) .Transform(shuffledData);
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.
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.
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 deIDataView
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 metReuseTrainSetBottleneckCachedValues
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.
Definieer de
EstimatorChain
trainingspijplijn die bestaat uit zowel demapLabelEstimator
als de ImageClassificationTrainer.var trainingPipeline = mlContext.MulticlassClassification.Trainers.ImageClassification(classifierOptions) .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
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
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) { }
Maak een
PredictionEngine
in deClassifySingleImage
methode. DePredictionEngine
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);
Als u toegang wilt krijgen tot één
ModelInput
exemplaar, converteert u dedata
IDataView
naar eenIEnumerable
met behulp van deCreateEnumerable
methode en haalt u vervolgens de eerste waarneming op.ModelInput image = mlContext.Data.CreateEnumerable<ModelInput>(data,reuseRowObject:true).First();
Gebruik de
Predict
methode om de afbeelding te classificeren.ModelOutput prediction = predictionEngine.Predict(image);
Voer de voorspelling uit naar de console met de
OutputPrediction
methode .Console.WriteLine("Classifying single image"); OutputPrediction(prediction);
Roep
ClassifySingleImage
hieronder deFit
methode aan met behulp van de testset met afbeeldingen.ClassifySingleImage(mlContext, testSet, trainedModel);
Meerdere afbeeldingen classificeren
Voeg een nieuwe methode toe met de naam
ClassifyImages
onder deClassifySingleImage
-methode om voorspellingen voor meerdere afbeeldingen te doen en uit te voeren.void ClassifyImages(MLContext mlContext, IDataView data, ITransformer trainedModel) { }
Maak een
IDataView
met de voorspellingen met behulp van deTransform
methode . Voeg de volgende code toe in deClassifyImages
-methode.IDataView predictionData = trainedModel.Transform(data);
Als u de voorspellingen wilt herhalen, converteert u de
predictionData
IDataView
naar eenIEnumerable
met behulp van deCreateEnumerable
methode en haalt u vervolgens de eerste 10 waarnemingen op.IEnumerable<ModelOutput> predictions = mlContext.Data.CreateEnumerable<ModelOutput>(predictionData, reuseRowObject: true).Take(10);
De oorspronkelijke en voorspelde labels voor de voorspellingen herhalen en uitvoeren.
Console.WriteLine("Classifying multiple images"); foreach (var prediction in predictions) { OutputPrediction(prediction); }
Roep ten slotte
ClassifyImages
aan onder deClassifySingleImage()
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.
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.