Bagikan melalui


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 mempelajari cara:

  • Memahami masalahnya
  • Pelajari tentang API Klasifikasi Gambar ML.NET
  • Memahami model yang sudah dilatih sebelumnya
  • Menggunakan pembelajaran transfer untuk melatih model klasifikasi gambar TensorFlow kustom
  • Mengklasifikasikan gambar dengan model kustom

Prasyarat

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 jaringan pembelajaran mendalam dan neural. Untuk informasi selengkapnya, lihat Pembelajaran mendalam vs. pembelajaran mesin.

Beberapa skenario di mana klasifikasi gambar berguna meliputi:

  • Pengenalan wajah
  • Deteksi emosi
  • Diagnosa medis
  • Deteksi penanda lokasi

Tutorial ini melatih model klasifikasi gambar kustom untuk melakukan pemeriksaan visual otomatis dek jembatan untuk mengidentifikasi struktur yang rusak oleh retakan.

API Klasifikasi Gambar ML.NET

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 mempercepat proses pelatihan.

Proses pelatihan

API Klasifikasi Gambar memulai proses pelatihan dengan memuat model TensorFlow yang telah dilatih sebelumnya. Proses pelatihan terdiri dari dua langkah:

  1. Fase penyempitan.
  2. Fase pelatihan.

Langkah Pelatihan

Fase penyempitan

Selama fase penyempitan, set 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 beku karena tidak ada pelatihan yang akan dilakukan pada lapisan-lapisan ini dan operasinya dilalui begitu saja. Di lapisan beku inilah pola tingkat lebih rendah yang membantu model mendiferensiasi 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 dihasilkan. Salah satunya adalah versi .pb dari model tersebut, dan yang lainnya adalah versi .zip dari model yang diserialisasikan dengan ML.NET. Saat bekerja di lingkungan yang didukung oleh ML.NET, disarankan untuk menggunakan versi model yang .zip. Namun, di lingkungan di mana ML.NET tidak didukung, Anda memiliki opsi untuk menggunakan versi .pb.

Memahami model yang sudah 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.

  1. Buat sebuah Aplikasi Konsol C# yang dinamai "DeepLearning_ImageClassification_Binary". Klik tombol Berikutnya.

  2. Pilih .NET 8 sebagai kerangka kerja yang akan digunakan, lalu pilih Buat.

  3. Instalasi Paket NuGet Microsoft.ML:

    Nota

    Sampel ini menggunakan versi stabil terbaru dari paket NuGet yang disebutkan kecuali dinyatakan lain.

    1. Di Penjelajah Solusi, klik kanan proyek Anda dan pilih Kelola Paket NuGet.
    2. Pilih "nuget.org" sebagai sumber Paket.
    3. Pilih tab Telusuri.
    4. Centang kotak Sertakan prarilis.
    5. Cari Microsoft.ML.
    6. Pilih tombol Instal.
    7. Pilih tombol Saya Terima pada dialog Penerimaan Lisensi jika Anda setuju dengan ketentuan lisensi untuk paket yang tercantum.
    8. Ulangi langkah-langkah ini untuk Microsoft.ML.Vision, SciSharp.TensorFlow.Redist (versi 2.3.1), dan paket Microsoft.ML.ImageAnalytics NuGet.

Menyiapkan dan memahami data

Nota

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).

himpunan data SDNET2018 sampel bridge deck

Data diatur dalam tiga subdirektori:

  • D berisi gambar dek jembatan
  • 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 retak

Dalam tutorial ini, hanya gambar dek jembatan yang digunakan.

  1. Unduh himpunan data dan ekstrak.
  2. Buat direktori bernama "Aset" di proyek Anda untuk menyimpan file himpunan data Anda.
  3. Salin subdirektori CD dan subdirektori UD dari direktori yang baru saja di-unzip ke direktori Aset.

Membuat kelas input dan output

  1. Buka file Program.cs dan ganti konten yang ada dengan arahan using berikut:

    using Microsoft.ML;
    using Microsoft.ML.Vision;
    using static Microsoft.ML.DataOperationsCatalog;
    
  2. Buat kelas yang disebut ImageData. 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.
    • Gambar ini termasuk dalam kategori Label. Ini adalah nilai yang akan diprediksi.
  3. Buat kelas untuk data input dan output Anda.

    1. Di bawah kelas ImageData, tentukan skema data input Anda di kelas baru yang disebut ModelInput.

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

      ModelInput berisi properti berikut:

      • Image adalah representasi byte[] dari gambar. Model ini mengharapkan data gambar dari jenis ini dalam pelatihan.
      • LabelAsKey adalah representasi numerik dari Label.
      • ImagePath adalah jalur yang sepenuhnya memenuhi syarat tempat gambar disimpan.
      • Gambar ini termasuk dalam kategori Label. Nilai ini yang akan diprediksi.

      Hanya Image dan LabelAsKey yang digunakan untuk melatih model dan membuat prediksi. Properti ImagePath dan Label disimpan untuk kenyamanan mengakses nama dan kategori file gambar asli.

    2. Kemudian, di bawah kelas ModelInput, tentukan skema data output Anda di kelas baru yang disebut ModelOutput.

      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 tempat gambar berada. Ini adalah nilai yang akan diprediksi.
      • PredictedLabel adalah nilai yang diprediksi oleh model.

      Mirip dengan ModelInput, hanya PredictedLabel yang diperlukan untuk membuat prediksi karena berisi prediksi yang dibuat oleh model. Properti ImagePath dan Label dipertahankan untuk kenyamanan mengakses nama dan kategori file gambar asli.

Menentukan jalur dan menginisialisasi variabel

  1. Di bawah arahan using, tambahkan kode berikut ke:

    • Tentukan lokasi aset.

    • Inisialisasikan variabel mlContext dengan instance baru dari 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, untuk DbContext dalam Entity Framework.

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

Muat datanya

Membuat metode utilitas pemuatan data

Gambar disimpan dalam dua subdirektori. Sebelum memuat data, data perlu diformat ke dalam daftar objek ImageData. Untuk melakukannya, buat metode LoadImagesFromDirectory:

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

Metode LoadImagesFromDirectory:

  • Mendapatkan semua jalur berkas dari semua subdirektori.
  • Melakukan iterasi melalui setiap file menggunakan pernyataan foreach dan memeriksa apakah ekstensi file didukung. API Klasifikasi Gambar mendukung format JPEG dan PNG.
  • Mengambil label dari file. Jika parameter useFolderNameAsLabel diatur ke true, maka direktori induk tempat file disimpan digunakan sebagai label. Jika tidak, label diharapkan menjadi awalan nama file atau nama file itu sendiri.
  • Membuat instans baru ModelInput.

Menyiapkan data

Tambahkan kode berikut setelah baris di mana Anda membuat instans baru MLContext.

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;

Kode sebelumnya:

  • Memanggil metode utilitas LoadImagesFromDirectory untuk mendapatkan daftar gambar yang digunakan untuk pelatihan setelah menginisialisasi variabel mlContext.

  • Memuat gambar ke dalam IDataView menggunakan metode LoadFromEnumerable.

  • Mengacak data menggunakan metode ShuffleRows. Data dimuat dalam urutan dibaca dari direktori. Pengacakan dilakukan untuk menyeimbangkan.

  • Melakukan beberapa pra-pemrosesan pada data sebelum pelatihan. Ini dilakukan karena model pembelajaran mesin mengharapkan input berada dalam format numerik. Kode pra-pemrosesan membuat EstimatorChain terdiri dari transformasi MapValueToKey dan LoadRawImageBytes. Transformasi MapValueToKey mengambil nilai kategoris di kolom Label, mengonversinya menjadi nilai KeyType numerik dan menyimpannya di kolom baru yang disebut LabelAsKey. LoadImages mengambil nilai dari kolom ImagePath bersama dengan parameter imageFolder untuk memuat gambar untuk pelatihan.

  • Menggunakan metode Fit untuk menerapkan data ke preprocessingPipelineEstimatorChain diikuti dengan metode Transform, yang mengembalikan IDataView yang berisi data yang telah diproses sebelumnya.

  • Membagi data menjadi set pelatihan, set validasi, dan set data uji.

    Untuk melatih model, penting untuk memiliki himpunan data pelatihan serta himpunan data validasi. Model ini dilatih pada set pelatihan. Seberapa baik prediksi pada data yang tidak terlihat diukur oleh performa terhadap set validasi. Berdasarkan hasil performa tersebut, model membuat penyesuaian pada 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.

    Contoh kode ini melakukan dua kali pemisahan. Pertama, data yang telah diproscesikan 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.

    Salah satu cara untuk memikirkan tujuan partisi data ini adalah mengikuti ujian. Saat belajar untuk ujian, Anda meninjau catatan, buku, atau sumber daya lainnya untuk memahami konsep yang ada pada ujian. Ini adalah tujuan dari rangkaian kereta. Kemudian, Anda mungkin mengikuti ujian tiruan untuk memvalidasi pengetahuan Anda. Di sinilah kegunaan set validasi. Anda ingin memeriksa apakah Anda memiliki pemahaman konsep yang baik sebelum mengikuti ujian aktual. Berdasarkan hasil tersebut, Anda mencatat kesalahan Anda atau hal-hal yang tidak Anda mengerti dengan baik dan menggabungkan perubahan tersebut saat Anda meninjau untuk ujian sesungguhnya. Akhirnya, Anda mengambil ujian. Set pengujian ini digunakan untuk ini. 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 ditangani.

  • Menetapkan partisi nilai masing-masing untuk data pelatihan, validasi, dan pengujian.

Menentukan alur pelatihan

Pelatihan model terdiri dari dua langkah. Pertama, API Klasifikasi Gambar digunakan untuk melatih model. Kemudian, label yang dikodekan di kolom PredictedLabel dikonversi kembali ke nilai kategoris aslinya menggunakan transformasi MapKeyToValue.

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

Kode sebelumnya:

  • Membuat variabel baru untuk menyimpan sekumpulan parameter yang diperlukan dan opsional untuk ImageClassificationTrainer. ImageClassificationTrainer mengambil beberapa parameter opsional:

    • FeatureColumnName adalah kolom yang digunakan sebagai input untuk model.
    • LabelColumnName adalah kolom untuk nilai yang akan diprediksi.
    • ValidationSet adalah IDataView yang berisi data validasi.
    • Arch mendefinisikan 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 bottleneck dalam pengoperasian selanjutnya. Fase kemacetan adalah perhitungan satu kali yang membutuhkan banyak sumber daya komputasi 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 mirip dengan ReuseTrainSetBottleneckCachedValues hanya dalam hal ini untuk himpunan data validasi.
  • Menentukan alur pelatihan EstimatorChain yang terdiri dari mapLabelEstimator dan ImageClassificationTrainer.

  • Menggunakan metode Fit untuk melatih model.

Gunakan model

Sekarang setelah Anda melatih model, saatnya untuk menggunakannya untuk mengklasifikasikan gambar.

Buat metode utilitas baru yang disebut OutputPrediction untuk menampilkan informasi prediksi di konsol.

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

  1. Buat metode yang disebut ClassifySingleImage untuk membuat dan menghasilkan prediksi gambar tunggal.

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

    Metode ClassifySingleImage:

    • Membuat PredictionEngine di dalam metode ClassifySingleImage. PredictionEngine adalah API yang memudahkan Anda untuk memasukkan dan kemudian melakukan prediksi pada satu instans data.
    • Untuk mengakses instans ModelInput tunggal, mengonversi dataIDataView menjadi IEnumerable menggunakan metode CreateEnumerable lalu mendapatkan pengamatan pertama.
    • Menggunakan metode Predict untuk mengklasifikasikan gambar.
    • Menghasilkan prediksi ke konsol dengan metode OutputPrediction.
  2. Panggil ClassifySingleImage setelah Anda memanggil metode Fit menggunakan kumpulan gambar pengujian.

    ClassifySingleImage(mlContext, testSet, trainedModel);
    

Mengklasifikasikan beberapa gambar

  1. Buat metode yang disebut ClassifyImages untuk membuat dan menghasilkan beberapa prediksi gambar.

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

    Metode ClassifyImages:

    • Membuat IDataView yang berisi prediksi dengan menggunakan metode Transform.
    • Untuk melakukan iterasi atas prediksi, mengonversi predictionDataIDataView menjadi IEnumerable menggunakan metode CreateEnumerable dan kemudian mendapatkan 10 pengamatan pertama.
    • Melakukan iterasi dan mengeluarkan label asli dan label yang diprediksi.
  2. Panggil ClassifyImages setelah Anda memanggil metode ClassifySingleImage() menggunakan kumpulan gambar pengujian.

    ClassifyImages(mlContext, testSet, trainedModel);
    

Jalankan aplikasi

Jalankan aplikasi konsol Anda. Output harus mirip dengan output berikut.

Nota

Anda mungkin melihat peringatan atau pesan pemrosesan; pesan tersebut telah dihapus dari hasil berikut demi kejelasan. Untuk singkatnya, output telah dipadatkan.

Tahap Kemacetan

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 pemeriksaan gambar 7001-220.jpg, Anda dapat memverifikasi bahwa gambar tersebut tidak retak, seperti yang diprediksi model.

gambar himpunan data SDNET2018 digunakan untuk prediksi

Selamat! Anda sekarang telah berhasil membangun model pembelajaran mendalam untuk mengklasifikasikan gambar.

Tingkatkan model

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 lengkap SDNET2018 dan gunakan untuk melatih.
  • Menambah data: Teknik umum untuk menambahkan variasi ke data adalah dengan menambah data dengan mengambil gambar dan menerapkan transformasi yang berbeda (memutar, membalik, menggeser, memangkas). Ini menambahkan contoh yang lebih bervariasi agar model dapat dipelajari.
  • Berlatih untuk waktu yang lebih lama: Semakin lama Anda berlatih, semakin baik model tersebut akan disesuaikan. Meningkatkan jumlah epoch mungkin dapat meningkatkan performa model Anda.
  • Eksperimen 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 epoch, dapat meningkatkan performa.
  • Gunakan arsitektur model yang berbeda: Bergantung pada tampilan data Anda, model yang paling 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.

Lihat juga