Tutorial: Inspeksi visual otomatis menggunakan pembelajaran transfer dengan API Klasifikasi Gambar ML.NET
Pelajari cara melatih model pembelajaran mendalam kustom menggunakan pembelajaran transfer, model TensorFlow yang telah dilatih sebelumnya, dan API Klasifikasi Gambar ML.NET untuk mengklasifikasikan gambar permukaan beton sebagai retak atau tidak terklasifikasi.
Dalam tutorial ini, Anda akan mempelajari cara:
- Memahami masalahnya
- Pelajari tentang API Klasifikasi Gambar ML.NET
- Memahami model yang telah dilatih sebelumnya
- Menggunakan pembelajaran transfer untuk melatih model klasifikasi gambar TensorFlow kustom
- Mengklasifikasikan gambar dengan model kustom
Prasyarat
Gambaran umum sampel pembelajaran transfer klasifikasi gambar
Sampel ini adalah aplikasi konsol C# .NET Core yang mengklasifikasikan gambar menggunakan model TensorFlow pembelajaran mendalam yang telah dilatih sebelumnya. Kode untuk sampel ini dapat ditemukan di browser sampel.
Memahami masalahnya
Klasifikasi gambar adalah masalah visi komputer. Klasifikasi gambar mengambil gambar sebagai input dan mengategorikannya ke dalam kelas yang ditentukan. Model klasifikasi gambar umumnya dilatih menggunakan pembelajaran mendalam dan jaringan neural. Lihat Pembelajaran mendalam vs. pembelajaran mesin untuk informasi selengkapnya.
Beberapa skenario di mana klasifikasi gambar berguna meliputi:
- Pengenalan wajah
- Deteksi emosi
- Diagnosis medis
- Deteksi tengara
Tutorial ini melatih model klasifikasi gambar kustom untuk melakukan inspeksi visual otomatis dek jembatan untuk mengidentifikasi struktur yang rusak oleh retakan.
ML.NET API Klasifikasi Gambar
ML.NET menyediakan berbagai cara untuk melakukan klasifikasi gambar. Tutorial ini menerapkan pembelajaran transfer menggunakan API Klasifikasi Gambar. API Klasifikasi Gambar menggunakan TensorFlow.NET, pustaka tingkat rendah yang menyediakan pengikatan C# untuk API TensorFlow C++.
Apa itu pembelajaran transfer?
Pembelajaran transfer menerapkan pengetahuan yang diperoleh dari memecahkan satu masalah ke masalah terkait lainnya.
Melatih model pembelajaran mendalam dari awal memerlukan pengaturan beberapa parameter, sejumlah besar data pelatihan berlabel, dan sejumlah besar sumber daya komputasi (ratusan jam GPU). Menggunakan model yang telah dilatih sebelumnya bersama dengan pembelajaran transfer memungkinkan Anda untuk pintasan proses pelatihan.
Proses pelatihan
API Klasifikasi Gambar memulai proses pelatihan dengan memuat model TensorFlow yang telah dilatih sebelumnya. Proses pelatihan terdiri dari dua langkah:
- Fase penyempitan
- Fase pelatihan
Fase penyempitan
Selama fase penyempitan, kumpulan gambar pelatihan dimuat dan nilai piksel digunakan sebagai input, atau fitur, untuk lapisan beku dari model yang telah dilatih sebelumnya. Lapisan beku mencakup semua lapisan dalam jaringan neural hingga lapisan penultimate, secara informal dikenal sebagai lapisan penyempitan. Lapisan-lapisan ini disebut sebagai dibekukan karena tidak ada pelatihan yang akan terjadi pada lapisan dan operasi ini adalah pass-through. Ini pada lapisan beku ini di mana pola tingkat bawah yang membantu model membedakan antara kelas yang berbeda dihitung. Semakin besar jumlah lapisan, semakin intensif komputasi langkah ini. Untungnya, karena ini adalah perhitungan satu kali, hasilnya dapat di-cache dan digunakan dalam eksekusi nanti saat bereksperimen dengan parameter yang berbeda.
Fase pelatihan
Setelah nilai output dari fase penyempitan dihitung, nilai tersebut digunakan sebagai input untuk melatih kembali lapisan akhir model. Proses ini berulang dan berjalan untuk berapa kali ditentukan oleh parameter model. Selama setiap eksekusi, kerugian dan akurasi dievaluasi. Kemudian, penyesuaian yang sesuai dilakukan untuk meningkatkan model dengan tujuan meminimalkan kerugian dan memaksimalkan akurasi. Setelah pelatihan selesai, dua format model adalah output. Salah satunya adalah .pb
versi model dan yang lainnya adalah .zip
versi model yang ML.NET diserialisasikan. Saat bekerja di lingkungan yang didukung oleh ML.NET, disarankan untuk menggunakan .zip
versi model. Namun, di lingkungan di mana ML.NET tidak didukung, Anda memiliki opsi untuk menggunakan versi ..pb
Memahami model yang telah dilatih sebelumnya
Model yang telah dilatih sebelumnya yang digunakan dalam tutorial ini adalah varian lapisan 101 dari model Residual Network (ResNet) v2. Model asli dilatih untuk mengklasifikasikan gambar ke dalam seribu kategori. Model ini mengambil sebagai input gambar ukuran 224 x 224 dan menghasilkan probabilitas kelas untuk setiap kelas yang dilatihnya. Bagian dari model ini digunakan untuk melatih model baru menggunakan gambar kustom untuk membuat prediksi antara dua kelas.
Membuat aplikasi konsol
Sekarang setelah Anda memiliki pemahaman umum tentang pembelajaran transfer dan API Klasifikasi Gambar, saatnya untuk membangun aplikasi.
Buat Aplikasi Konsol C# yang disebut "DeepLearning_ImageClassification_Binary". Klik tombol Berikutnya.
Pilih .NET 6 sebagai kerangka kerja yang akan digunakan. Klik tombol Buat.
Instal Paket NuGet Microsoft.ML :
Catatan
Sampel ini menggunakan versi stabil terbaru dari paket NuGet yang disebutkan kecuali dinyatakan lain.
- Di Penjelajah Solusi, klik kanan proyek Anda dan pilih Kelola Paket NuGet.
- Pilih "nuget.org" sebagai sumber Paket.
- Pilih tab Telusuri.
- Centang kotak sertakan prarilis .
- Cari Microsoft.ML.
- Pilih tombol Instal.
- Pilih tombol OK pada dialog Pratinjau Perubahan lalu pilih tombol Saya Terima pada dialog Penerimaan Lisensi jika Anda setuju dengan ketentuan lisensi untuk paket yang tercantum.
- Ulangi langkah-langkah ini untuk paket Microsoft.ML.Vision, SciSharp.TensorFlow.Redist versi 2.3.1, dan Microsoft.ML.ImageAnalytics NuGet.
Menyiapkan dan memahami data
Catatan
Himpunan data untuk tutorial ini berasal dari Maguire, Marc; Dorafshan, Sattar; dan Thomas, Robert J., "SDNET2018: Himpunan data gambar retak konkret untuk aplikasi pembelajaran mesin" (2018). Telusuri semua Himpunan Data. Kertas 48. https://digitalcommons.usu.edu/all_datasets/48
SDNET2018 adalah himpunan data gambar yang berisi anotasi untuk struktur beton retak dan tidak retak (dek jembatan, dinding, dan trotoar).
Data diatur dalam tiga subdirektori:
- D berisi gambar bridge deck
- P berisi gambar trotoar
- W berisi gambar dinding
Masing-masing subdirektori ini berisi dua subdirektori awalan tambahan:
- C adalah awalan yang digunakan untuk permukaan retak
- U adalah awalan yang digunakan untuk permukaan yang tidak terakrak
Dalam tutorial ini, hanya gambar dek jembatan yang digunakan.
- Unduh himpunan data dan unzip.
- Buat direktori bernama "aset" di proyek Anda untuk menyimpan file himpunan data Anda.
- Salin subdirektori CD dan UD dari direktori yang baru-baru ini di-unzip ke direktori aset .
Membuat kelas input dan output
Buka file Program.cs dan ganti pernyataan yang ada
using
di bagian atas file dengan yang berikut ini:using System; using System.Collections.Generic; using System.Linq; using System.IO; using Microsoft.ML; using static Microsoft.ML.DataOperationsCatalog; using Microsoft.ML.Vision;
Program
Di bawah kelas di Program.cs, buat kelas yang disebutImageData
. Kelas ini digunakan untuk mewakili data yang awalnya dimuat.class ImageData { public string ImagePath { get; set; } public string Label { get; set; } }
ImageData
berisi properti berikut:ImagePath
adalah jalur yang sepenuhnya memenuhi syarat tempat gambar disimpan.Label
adalah kategori milik gambar. Ini adalah nilai yang akan diprediksi.
Membuat kelas untuk data input dan output Anda
ImageData
Di bawah kelas , tentukan skema data input Anda di kelas baru yang disebutModelInput
.class ModelInput { public byte[] Image { get; set; } public UInt32 LabelAsKey { get; set; } public string ImagePath { get; set; } public string Label { get; set; } }
ModelInput
berisi properti berikut:Image
byte[]
adalah representasi gambar. Model mengharapkan data gambar menjadi jenis ini untuk pelatihan.LabelAsKey
adalah representasi numerik dariLabel
.ImagePath
adalah jalur yang sepenuhnya memenuhi syarat tempat gambar disimpan.Label
adalah kategori milik gambar. Ini adalah nilai yang akan diprediksi.
Hanya
Image
danLabelAsKey
digunakan untuk melatih model dan membuat prediksi. PropertiImagePath
danLabel
disimpan untuk kenyamanan untuk mengakses nama dan kategori file gambar asli.Kemudian, di
ModelInput
bawah kelas , tentukan skema data output Anda di kelas baru yang disebutModelOutput
.class ModelOutput { public string ImagePath { get; set; } public string Label { get; set; } public string PredictedLabel { get; set; } }
ModelOutput
berisi properti berikut:ImagePath
adalah jalur yang sepenuhnya memenuhi syarat tempat gambar disimpan.Label
adalah kategori asli yang dimiliki gambar. Ini adalah nilai yang akan diprediksi.PredictedLabel
adalah nilai yang diprediksi oleh model.
Mirip
ModelInput
dengan , hanya yangPredictedLabel
diperlukan untuk membuat prediksi karena berisi prediksi yang dibuat oleh model. PropertiImagePath
danLabel
dipertahankan untuk kenyamanan mengakses nama dan kategori file gambar asli.
Membuat direktori ruang kerja
Ketika data pelatihan dan validasi tidak sering berubah, ada baiknya untuk menyimpan nilai penyempitan komputasi untuk eksekusi lebih lanjut.
- Dalam proyek Anda, buat direktori baru yang disebut ruang kerja untuk menyimpan nilai penyempitan komputasi dan
.pb
versi model.
Menentukan jalur dan menginisialisasi variabel
Di bawah pernyataan penggunaan, tentukan lokasi aset Anda, nilai penyempitan komputasi, dan
.pb
versi model.var projectDirectory = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "../../../")); var workspaceRelativePath = Path.Combine(projectDirectory, "workspace"); var assetsRelativePath = Path.Combine(projectDirectory, "assets");
Inisialisasi
mlContext
variabel dengan instans baru MLContext.MLContext mlContext = new MLContext();
Kelas MLContext adalah titik awal untuk semua operasi ML.NET, dan menginisialisasi mlContext membuat lingkungan ML.NET baru yang dapat dibagikan di seluruh objek alur kerja pembuatan model. Ini mirip, secara konseptual, hingga
DbContext
dalam Kerangka Kerja Entitas.
Muat data
Membuat metode utilitas pemuatan data
Gambar disimpan dalam dua subdirektori. Sebelum memuat data, data perlu diformat ke dalam daftar ImageData
objek. Untuk melakukannya, buat LoadImagesFromDirectory
metode .
IEnumerable<ImageData> LoadImagesFromDirectory(string folder, bool useFolderNameAsLabel = true)
{
}
LoadImagesFromDirectory
Di dalam , tambahkan kode berikut untuk mendapatkan semua jalur file dari subdirektori:var files = Directory.GetFiles(folder, "*", searchOption: SearchOption.AllDirectories);
Kemudian, iterasi melalui setiap file menggunakan
foreach
pernyataan .foreach (var file in files) { }
foreach
Di dalam pernyataan , periksa apakah ekstensi file didukung. API Klasifikasi Gambar mendukung format JPEG dan PNG.if ((Path.GetExtension(file) != ".jpg") && (Path.GetExtension(file) != ".png")) continue;
Kemudian, dapatkan label untuk file tersebut.
useFolderNameAsLabel
Jika parameter diatur ketrue
, maka direktori induk tempat file disimpan digunakan sebagai label. Jika tidak, itu mengharapkan label menjadi awalan dari nama file atau nama file itu sendiri.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; } } }
Terakhir, buat instans
ModelInput
baru .yield return new ImageData() { ImagePath = file, Label = label };
Menyiapkan data
LoadImagesFromDirectory
Panggil metode utilitas untuk mendapatkan daftar gambar yang digunakan untuk pelatihan setelah menginisialisasimlContext
variabel.IEnumerable<ImageData> images = LoadImagesFromDirectory(folder: assetsRelativePath, useFolderNameAsLabel: true);
Kemudian, muat gambar ke dalam
IDataView
menggunakanLoadFromEnumerable
metode .IDataView imageData = mlContext.Data.LoadFromEnumerable(images);
Data dimuat dalam urutan dibaca dari direktori. Untuk menyeimbangkan data, acak menggunakan
ShuffleRows
metode .IDataView shuffledData = mlContext.Data.ShuffleRows(imageData);
Model pembelajaran mesin mengharapkan input berada dalam format numerik. Oleh karena itu, beberapa pra-pemrosesan perlu dilakukan pada data sebelum pelatihan.
EstimatorChain
Membuat terdiri dariMapValueToKey
transformasi danLoadRawImageBytes
.MapValueToKey
Transformasi mengambil nilai kategoris dalamLabel
kolom, mengonversinya menjadi nilai numerikKeyType
dan menyimpannya di kolom baru yang disebutLabelAsKey
.LoadImages
mengambil nilai dariImagePath
kolom bersama denganimageFolder
parameter untuk memuat gambar untuk pelatihan.var preprocessingPipeline = mlContext.Transforms.Conversion.MapValueToKey( inputColumnName: "Label", outputColumnName: "LabelAsKey") .Append(mlContext.Transforms.LoadRawImageBytes( outputColumnName: "Image", imageFolder: assetsRelativePath, inputColumnName: "ImagePath"));
Fit
Gunakan metode untuk menerapkan data kepreprocessingPipeline
EstimatorChain
yang diikuti denganTransform
metode , yang mengembalikan yang berisi data yangIDataView
telah diproses sebelumnya.IDataView preProcessedData = preprocessingPipeline .Fit(shuffledData) .Transform(shuffledData);
Untuk melatih model, penting untuk memiliki himpunan data pelatihan serta himpunan data validasi. Model ini dilatih pada set pelatihan. Seberapa baik membuat prediksi pada data yang tidak terlihat diukur oleh performa terhadap set validasi. Berdasarkan hasil performa itu, model membuat penyesuaian dengan apa yang telah dipelajarinya dalam upaya untuk meningkatkan. Kumpulan validasi dapat berasal dari memisahkan himpunan data asli Anda atau dari sumber lain yang telah disisihkan untuk tujuan ini. Dalam hal ini, himpunan data yang telah diproses sebelumnya dibagi menjadi pelatihan, validasi, dan set pengujian.
TrainTestData trainSplit = mlContext.Data.TrainTestSplit(data: preProcessedData, testFraction: 0.3); TrainTestData validationTestSplit = mlContext.Data.TrainTestSplit(trainSplit.TestSet);
Sampel kode di atas melakukan dua pemisahan. Pertama, data yang telah diproses sebelumnya dibagi dan 70% digunakan untuk pelatihan sementara 30% sisanya digunakan untuk validasi. Kemudian, set validasi 30% dibagi lebih lanjut menjadi validasi dan set pengujian di mana 90% digunakan untuk validasi dan 10% digunakan untuk pengujian.
Cara untuk memikirkan tujuan partisi data ini adalah mengikuti ujian. Ketika belajar untuk ujian, Anda meninjau catatan, buku, atau sumber daya lainnya untuk mendapatkan pemahaman tentang konsep yang ada pada ujian. Inilah tujuan dari rangkaian kereta. Kemudian, Anda mungkin mengikuti ujian tiruan untuk memvalidasi pengetahuan Anda. Di sinilah set validasi berguna. Anda ingin memeriksa apakah Anda memiliki pemahaman yang baik tentang konsep sebelum mengikuti ujian aktual. Berdasarkan hasil tersebut, Anda mencatat apa yang Anda salah atau tidak mengerti dengan baik dan menggabungkan perubahan Anda saat Anda meninjau untuk ujian nyata. Akhirnya, Anda mengikuti ujian. Untuk inilah set pengujian digunakan. Anda belum pernah melihat pertanyaan yang ada pada ujian dan sekarang menggunakan apa yang Anda pelajari dari pelatihan dan validasi untuk menerapkan pengetahuan Anda ke tugas yang ada.
Tetapkan partisi nilai masing-masing untuk data pelatihan, validasi, dan pengujian.
IDataView trainSet = trainSplit.TrainSet; IDataView validationSet = validationTestSplit.TrainSet; IDataView testSet = validationTestSplit.TestSet;
Menentukan alur pelatihan
Pelatihan model terdiri dari beberapa langkah. Pertama, API Klasifikasi Gambar digunakan untuk melatih model. Kemudian, label yang dikodekan dalam kolom dikonversi PredictedLabel
kembali ke nilai kategoris aslinya menggunakan MapKeyToValue
transformasi.
Buat variabel baru untuk menyimpan sekumpulan parameter yang diperlukan dan opsional untuk 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 };
Mengambil ImageClassificationTrainer beberapa parameter opsional:
FeatureColumnName
adalah kolom yang digunakan sebagai input untuk model.LabelColumnName
adalah kolom untuk nilai yang akan diprediksi.ValidationSet
IDataView
adalah yang berisi data validasi.Arch
menentukan arsitektur model mana yang telah dilatih sebelumnya untuk digunakan. Tutorial ini menggunakan varian lapisan 101 dari model ResNetv2.MetricsCallback
mengikat fungsi untuk melacak kemajuan selama pelatihan.TestOnTrainSet
memberi tahu model untuk mengukur performa terhadap set pelatihan ketika tidak ada set validasi yang ada.ReuseTrainSetBottleneckCachedValues
memberi tahu model apakah akan menggunakan nilai cache dari fase penyempitan dalam eksekusi berikutnya. Fase penyempitan adalah komputasi pass-through satu kali yang secara komputasi intensif saat pertama kali dilakukan. Jika data pelatihan tidak berubah dan Anda ingin bereksperimen menggunakan jumlah epoch atau ukuran batch yang berbeda, menggunakan nilai cache secara signifikan mengurangi jumlah waktu yang diperlukan untuk melatih model.ReuseValidationSetBottleneckCachedValues
hanya miripReuseTrainSetBottleneckCachedValues
dengan yang dalam hal ini untuk himpunan data validasi.WorkspacePath
menentukan direktori tempat menyimpan nilai penyempitan komputasi dan.pb
versi model.
Tentukan
EstimatorChain
alur pelatihan yang terdiri darimapLabelEstimator
dan ImageClassificationTrainer.var trainingPipeline = mlContext.MulticlassClassification.Trainers.ImageClassification(classifierOptions) .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
Fit
Gunakan metode untuk melatih model Anda.ITransformer trainedModel = trainingPipeline.Fit(trainSet);
Menggunakan model
Sekarang setelah Anda melatih model Anda, saatnya untuk menggunakannya untuk mengklasifikasikan gambar.
Buat metode utilitas baru yang disebut OutputPrediction
untuk menampilkan informasi prediksi di konsol.
private static void OutputPrediction(ModelOutput prediction)
{
string imageName = Path.GetFileName(prediction.ImagePath);
Console.WriteLine($"Image: {imageName} | Actual Value: {prediction.Label} | Predicted Value: {prediction.PredictedLabel}");
}
Mengklasifikasikan satu gambar
Buat metode baru yang disebut
ClassifySingleImage
untuk membuat dan menghasilkan satu prediksi gambar.void ClassifySingleImage(MLContext mlContext, IDataView data, ITransformer trainedModel) { }
Buat di
PredictionEngine
dalamClassifySingleImage
metode .PredictionEngine
adalah API kenyamanan, yang memungkinkan Anda untuk masuk dan kemudian melakukan prediksi pada satu instans data.PredictionEngine<ModelInput, ModelOutput> predictionEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(trainedModel);
Untuk mengakses satu
ModelInput
instans, konversikandata
IDataView
menjadiIEnumerable
menggunakanCreateEnumerable
metode lalu dapatkan pengamatan pertama.ModelInput image = mlContext.Data.CreateEnumerable<ModelInput>(data,reuseRowObject:true).First();
Predict
Gunakan metode untuk mengklasifikasikan gambar.ModelOutput prediction = predictionEngine.Predict(image);
Keluarkan prediksi ke konsol dengan
OutputPrediction
metode .Console.WriteLine("Classifying single image"); OutputPrediction(prediction);
Panggil
ClassifySingleImage
di bawah ini memanggilFit
metode menggunakan kumpulan gambar pengujian.ClassifySingleImage(mlContext, testSet, trainedModel);
Mengklasifikasikan beberapa gambar
Tambahkan metode baru yang disebut
ClassifyImages
di bawahClassifySingleImage
metode untuk membuat dan menghasilkan beberapa prediksi gambar.void ClassifyImages(MLContext mlContext, IDataView data, ITransformer trainedModel) { }
Buat yang
IDataView
berisi prediksi dengan menggunakanTransform
metode . Tambahkan kode berikut di dalam metodeClassifyImages
.IDataView predictionData = trainedModel.Transform(data);
Untuk melakukan iterasi atas prediksi, konversikan
predictionData
IDataView
menjadiIEnumerable
menggunakanCreateEnumerable
metode dan kemudian dapatkan 10 pengamatan pertama.IEnumerable<ModelOutput> predictions = mlContext.Data.CreateEnumerable<ModelOutput>(predictionData, reuseRowObject: true).Take(10);
Iterasi dan keluarkan label asli dan yang diprediksi untuk prediksi.
Console.WriteLine("Classifying multiple images"); foreach (var prediction in predictions) { OutputPrediction(prediction); }
Terakhir, panggil
ClassifyImages
di bawahClassifySingleImage()
metode menggunakan kumpulan gambar pengujian.ClassifyImages(mlContext, testSet, trainedModel);
Menjalankan aplikasi
Jalankan aplikasi konsol Anda. Output harus mirip dengan yang di bawah ini. Anda mungkin melihat peringatan atau memproses pesan, tetapi pesan ini telah dihapus dari hasil berikut untuk kejelasan. Untuk keringkasan, output telah dikondensasi.
Fase penyempitan
Tidak ada nilai yang dicetak untuk nama gambar karena gambar dimuat sebagai byte[]
oleh karena itu tidak ada nama gambar untuk ditampilkan.
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
Fase pelatihan
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
Mengklasifikasikan output gambar
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
Setelah memeriksa gambar 7001-220.jpg , Anda dapat melihat bahwa gambar tersebut sebenarnya tidak retak.
Selamat! Anda sekarang telah berhasil membangun model pembelajaran mendalam untuk mengklasifikasikan gambar.
Tingkatkan modelnya
Jika Anda tidak puas dengan hasil model, Anda dapat mencoba meningkatkan performanya dengan mencoba beberapa pendekatan berikut:
- Lebih Banyak Data: Semakin banyak contoh yang dipelajari model, semakin baik performanya. Unduh himpunan data SDNET2018 lengkap dan gunakan untuk melatih.
- Menambah data: Teknik umum untuk menambahkan variasi ke data adalah menambah data dengan mengambil gambar dan menerapkan transformasi yang berbeda (memutar, membalik, menggeser, memangkas). Ini menambahkan contoh yang lebih bervariasi untuk dipelajari model.
- Latih untuk waktu yang lebih lama: Semakin lama Anda melatih, semakin disesuaikan modelnya. Meningkatkan jumlah epoch dapat meningkatkan performa model Anda.
- Bereksperimen dengan parameter hiper: Selain parameter yang digunakan dalam tutorial ini, parameter lain dapat disetel untuk berpotensi meningkatkan performa. Mengubah tingkat pembelajaran, yang menentukan besarnya pembaruan yang dilakukan pada model setelah setiap periode dapat meningkatkan performa.
- Gunakan arsitektur model yang berbeda: Tergantung pada seperti apa data Anda, model yang paling baik dapat mempelajari fitur-fiturnya mungkin berbeda. Jika Anda tidak puas dengan performa model Anda, coba ubah arsitektur.
Langkah berikutnya
Dalam tutorial ini, Anda mempelajari cara membangun model pembelajaran mendalam kustom menggunakan pembelajaran transfer, model TensorFlow klasifikasi gambar yang telah dilatih sebelumnya dan API Klasifikasi Gambar ML.NET untuk mengklasifikasikan gambar permukaan beton sebagai retak atau tidak terklasifikasi.
Lanjutkan ke tutorial berikutnya untuk mempelajari lebih lanjut.