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

  1. Fase penyempitan
  2. Fase pelatihan

Langkah-langkah 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.

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

  2. Pilih .NET 6 sebagai kerangka kerja yang akan digunakan. Klik tombol Buat.

  3. Instal Paket NuGet Microsoft.ML :

    Catatan

    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 OK pada dialog Pratinjau Perubahan lalu pilih tombol Saya Terima pada dialog Penerimaan Lisensi jika Anda setuju dengan ketentuan lisensi untuk paket yang tercantum.
    8. 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).

Sampel dek jembatan himpunan data SDNET2018

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.

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

Membuat kelas input dan output

  1. 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;
    
  2. Program Di bawah kelas di Program.cs, 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.
    • Label adalah kategori milik gambar. Ini adalah nilai yang akan diprediksi.
  3. Membuat kelas untuk data input dan output Anda

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

      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:

      • Imagebyte[] adalah representasi gambar. Model mengharapkan data gambar menjadi jenis ini untuk pelatihan.
      • LabelAsKey adalah representasi numerik dari Label.
      • ImagePath adalah jalur yang sepenuhnya memenuhi syarat tempat gambar disimpan.
      • Label adalah kategori milik gambar. Ini adalah nilai yang akan diprediksi.

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

    2. Kemudian, di ModelInput bawah kelas , 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 yang dimiliki gambar. Ini adalah nilai yang akan diprediksi.
      • PredictedLabel adalah nilai yang diprediksi oleh model.

      Mirip ModelInputdengan , hanya yang PredictedLabel 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.

Membuat direktori ruang kerja

Ketika data pelatihan dan validasi tidak sering berubah, ada baiknya untuk menyimpan nilai penyempitan komputasi untuk eksekusi lebih lanjut.

  1. Dalam proyek Anda, buat direktori baru yang disebut ruang kerja untuk menyimpan nilai penyempitan komputasi dan .pb versi model.

Menentukan jalur dan menginisialisasi variabel

  1. 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");
    
  2. 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)
{

}
  1. LoadImagesFromDirectoryDi dalam , tambahkan kode berikut untuk mendapatkan semua jalur file dari subdirektori:

    var files = Directory.GetFiles(folder, "*",
        searchOption: SearchOption.AllDirectories);
    
  2. Kemudian, iterasi melalui setiap file menggunakan foreach pernyataan .

    foreach (var file in files)
    {
    
    }
    
  3. 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;
    
    
  4. Kemudian, dapatkan label untuk file tersebut. useFolderNameAsLabel Jika parameter diatur ke true, 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;
            }
        }
    }
    
  5. Terakhir, buat instans ModelInputbaru .

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

Menyiapkan data

  1. LoadImagesFromDirectory Panggil metode utilitas untuk mendapatkan daftar gambar yang digunakan untuk pelatihan setelah menginisialisasi mlContext variabel.

    IEnumerable<ImageData> images = LoadImagesFromDirectory(folder: assetsRelativePath, useFolderNameAsLabel: true);
    
  2. Kemudian, muat gambar ke dalam IDataView menggunakan LoadFromEnumerable metode .

    IDataView imageData = mlContext.Data.LoadFromEnumerable(images);
    
  3. Data dimuat dalam urutan dibaca dari direktori. Untuk menyeimbangkan data, acak menggunakan ShuffleRows metode .

    IDataView shuffledData = mlContext.Data.ShuffleRows(imageData);
    
  4. Model pembelajaran mesin mengharapkan input berada dalam format numerik. Oleh karena itu, beberapa pra-pemrosesan perlu dilakukan pada data sebelum pelatihan. EstimatorChain Membuat terdiri dari MapValueToKey transformasi dan LoadRawImageBytes . MapValueToKey Transformasi mengambil nilai kategoris dalam Label kolom, mengonversinya menjadi nilai numerik KeyType dan menyimpannya di kolom baru yang disebut LabelAsKey. LoadImages mengambil nilai dari ImagePath kolom bersama dengan imageFolder 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"));
    
  5. Fit Gunakan metode untuk menerapkan data ke preprocessingPipelineEstimatorChain yang diikuti dengan Transform metode , yang mengembalikan yang berisi data yang IDataView telah diproses sebelumnya.

    IDataView preProcessedData = preprocessingPipeline
                        .Fit(shuffledData)
                        .Transform(shuffledData);
    
  6. 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.

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

  1. 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.
    • ValidationSetIDataView 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 mirip ReuseTrainSetBottleneckCachedValues dengan yang dalam hal ini untuk himpunan data validasi.
    • WorkspacePath menentukan direktori tempat menyimpan nilai penyempitan komputasi dan .pb versi model.
  2. Tentukan EstimatorChain alur pelatihan yang terdiri dari mapLabelEstimator dan ImageClassificationTrainer.

    var trainingPipeline = mlContext.MulticlassClassification.Trainers.ImageClassification(classifierOptions)
        .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
    
  3. 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

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

    void ClassifySingleImage(MLContext mlContext, IDataView data, ITransformer trainedModel)
    {
    
    }
    
  2. Buat di PredictionEngine dalam ClassifySingleImage 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);
    
  3. Untuk mengakses satu ModelInput instans, konversikan dataIDataView menjadi IEnumerable menggunakan CreateEnumerable metode lalu dapatkan pengamatan pertama.

    ModelInput image = mlContext.Data.CreateEnumerable<ModelInput>(data,reuseRowObject:true).First();
    
  4. Predict Gunakan metode untuk mengklasifikasikan gambar.

    ModelOutput prediction = predictionEngine.Predict(image);
    
  5. Keluarkan prediksi ke konsol dengan OutputPrediction metode .

    Console.WriteLine("Classifying single image");
    OutputPrediction(prediction);
    
  6. Panggil ClassifySingleImage di bawah ini memanggil Fit metode menggunakan kumpulan gambar pengujian.

    ClassifySingleImage(mlContext, testSet, trainedModel);
    

Mengklasifikasikan beberapa gambar

  1. Tambahkan metode baru yang disebut ClassifyImages di bawah ClassifySingleImage metode untuk membuat dan menghasilkan beberapa prediksi gambar.

    void ClassifyImages(MLContext mlContext, IDataView data, ITransformer trainedModel)
    {
    
    }
    
  2. Buat yang IDataView berisi prediksi dengan menggunakan Transform metode . Tambahkan kode berikut di dalam metode ClassifyImages.

    IDataView predictionData = trainedModel.Transform(data);
    
  3. Untuk melakukan iterasi atas prediksi, konversikan predictionDataIDataView menjadi IEnumerable menggunakan CreateEnumerable metode dan kemudian dapatkan 10 pengamatan pertama.

    IEnumerable<ModelOutput> predictions = mlContext.Data.CreateEnumerable<ModelOutput>(predictionData, reuseRowObject: true).Take(10);
    
  4. Iterasi dan keluarkan label asli dan yang diprediksi untuk prediksi.

    Console.WriteLine("Classifying multiple images");
    foreach (var prediction in predictions)
    {
        OutputPrediction(prediction);
    }
    
  5. Terakhir, panggil ClassifyImages di bawah ClassifySingleImage() 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.

Gambar himpunan data SDNET2018 yang digunakan untuk prediksi

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.