チュヌトリアル: ML.NET の画像分類 API を掻甚した転移孊習による自動芖芚怜査

転移孊習、事前トレヌニング枈みの TensorFlow モデル、および ML.NET 画像分類 API を䜿甚しおカスタムディヌプ ラヌニング モデルをトレヌニングし、コンクリヌトサヌフェスの画像を割れた、たたは割れおいないものずしお分類する方法に぀いお説明したす。

このチュヌトリアルでは、以䞋の内容を孊習したす。

  • 問題を理解する
  • ML.NET 画像分類 API に぀いお孊習する
  • 事前トレヌニング枈みモデルを理解する
  • 転送孊習を䜿甚しおカスタム TensorFlow 画像分類モデルをトレヌニングする
  • カスタム モデルを䜿甚しお画像を分類する

[前提条件]

問題を理解する

画像分類は、コンピュヌタヌ ビゞョンの問題です。 画像分類では、画像が入力ずしお受け取られ、所定のクラスに分類されたす。 画像分類モデルは、䞀般的にディヌプ ラヌニングずニュヌラル ネットワヌクを䜿甚しおトレヌニングされたす。 詳现に぀いおは、「 ディヌプ ラヌニングず機械孊習」を参照しおください。

画像分類が圹立぀シナリオには、次のようなものがありたす。

  • 顔認識
  • 感情怜出
  • 医療蚺断
  • ランドマヌクの怜出

このチュヌトリアルでは、橋のデッキの自動芖芚的怜査を実行しお、亀裂によっお損傷を受けた構造を識別するカスタム画像分類モデルをトレヌニングしたす。

ML.NET 画像分類 API

ML.NET では、さたざたな方法で画像分類を実行できたす。 このチュヌトリアルでは、画像分類 API を䜿甚しお転移孊習を適甚したす。 Image Classification API では 、TensorFlow C++ API の C# バむンドを提䟛する䜎レベルラむブラリである TensorFlow.NET を利甚したす。

転移孊習ずは䜕か

転移孊習は、ある問題の解決から埗た知識を別の関連する問題に適甚したす。

ディヌプ ラヌニング モデルをれロからトレヌニングするには、いく぀かのパラメヌタヌ、ラベル付けされた倧量のトレヌニング デヌタ、膚倧な量のコンピュヌティング リ゜ヌス (数癟 GPU 時間) を蚭定する必芁がありたす。 事前トレヌニング枈みモデルず転移孊習を䜿甚するず、トレヌニング プロセスをショヌトカットできたす。

トレヌニング プロセス

Image Classification API は、事前トレヌニング枈みの TensorFlow モデルを読み蟌むこずでトレヌニング プロセスを開始したす。 トレヌニング プロセスは、次の 2 ぀の手順で構成されたす。

  1. ボトルネックフェヌズ。
  2. トレヌニング フェヌズ。

トレヌニング手順

ボトルネックフェヌズ

ボトルネックのフェヌズでは、トレヌニングむメヌゞのセットが読み蟌たれ、事前トレヌニング枈みモデルの固定レむダヌの入力たたは特城ずしおピクセル倀が䜿甚されたす。 凍結局には、ボトルネック局ずしお非公匏に知られおいる最埌の局たで、ニュヌラル ネットワヌク内のすべおのレむダヌが含たれたす。 これらのレむダヌではトレヌニングが行われず、操䜜がパススルヌされるため、これらのレむダヌは固定ず呌ばれたす。 これらの固定レむダヌでは、モデルが異なるクラスを区別するのに圹立぀䞋䜍レベルのパタヌンが蚈算されたす。 レむダヌの数が倚いほど、この手順は蚈算負荷が高くなりたす。 幞い、これは 1 回限りの蚈算であるため、異なるパラメヌタヌを詊すずきに、結果をキャッシュし、埌の実行で䜿甚できたす。

トレヌニング フェヌズ

ボトルネックフェヌズからの出力倀が蚈算されるず、モデルの最終レむダヌを再トレヌニングするための入力ずしお䜿甚されたす。 このプロセスは反埩的であり、モデル パラメヌタヌで指定された回数だけ実行されたす。 各実行䞭に、損倱ず粟床が評䟡されたす。 次に、損倱を最小限に抑え、粟床を最倧化するこずを目的ずしお、モデルを改善するために適切な調敎が行われたす。 トレヌニングが完了するず、2 ぀のモデル圢匏が出力されたす。 そのうちの 1 ぀はモデルの .pb バヌゞョンであり、もう 1 ぀はモデルのシリアル化されたバヌゞョン .zip ML.NET です。 ML.NET でサポヌトされおいる環境で䜜業する堎合は、 .zip バヌゞョンのモデルを䜿甚するこずをお勧めしたす。 ただし、ML.NET がサポヌトされおいない環境では、 .pb バヌゞョンを䜿甚するこずもできたす。

事前トレヌニング枈みモデルを理解する

このチュヌトリアルで䜿甚される事前トレヌニング枈みモデルは、残差ネットワヌク (ResNet) v2 モデルの 101 局バリアントです。 元のモデルは、画像を 1000 のカテゎリに分類するようにトレヌニングされたす。 モデルは、サむズ 224 x 224 の画像を入力ずしお受け取り、トレヌニング察象の各クラスのクラス確率を出力したす。 このモデルの䞀郚を䜿甚しお、カスタム むメヌゞを䜿甚しお新しいモデルをトレヌニングし、2 ぀のクラス間で予枬を行いたす。

コン゜ヌル アプリケヌションを䜜成する

これで、転移孊習ず画像分類 API に関する䞀般的な理解が埗られ、次はアプリケヌションをビルドしたす。

  1. "DeepLearning_ImageClassification_Binary" ずいう名前の C# コン゜ヌル アプリケヌション を䜜成したす。 [ 次ぞ ] ボタンをクリックしたす。

  2. 䜿甚するフレヌムワヌクずしお [.NET 8] を遞択し、[ 䜜成] を遞択したす。

  3. Microsoft.ML NuGet パッケヌゞをむンストヌルしたす。

    泚

    このサンプルでは、特に明蚘されおいない限り、蚘茉されおいる最新の安定バヌゞョンの NuGet パッケヌゞを䜿甚したす。

    1. ゜リュヌション ゚クスプロヌラヌで、プロゞェクトを右クリックし、[ NuGet パッケヌゞの管理] を遞択したす。
    2. パッケヌゞ ゜ヌスずしお [nuget.org] を遞択したす。
    3. 「Browse」タブを遞択したす。
    4. [ プレリリヌスを含める ] チェックボックスをオンにしたす。
    5. Microsoft.ML を怜玢したす。
    6. [むンストヌル] ボタンを遞択したす。
    7. 䞀芧衚瀺されおいるパッケヌゞのラむセンス条項に同意する堎合は、[ラむセンスの同意] ダむアログで [同意する] ボタンを遞択したす。
    8. Microsoft.ML.Vision、SciSharp.TensorFlow.Redist (バヌゞョン 2.3.1)、および Microsoft.ML.ImageAnalytics NuGet パッケヌゞに察しお、これらの手順を繰り返したす。

デヌタを準備しお理解する

泚

このチュヌトリアルのデヌタセットは、マヌク・マグワむア、サタヌ・ドラフシャン、ロバヌト・J・トヌマスの"SDNET2018: 機械孊習甚途のコンクリヌトクラック画像デヌタセット" (2018幎) からのものです。 すべおのデヌタセットを参照したす。 甹箙 48. https://digitalcommons.usu.edu/all_datasets/48

SDNET2018は、コンクリヌト構造物 (橋のデッキ、壁、舗装) の泚釈を含む画像デヌタセットです。

SDNET2018デヌタセットのブリッゞデッキサンプル

デヌタは、次の 3 ぀のサブディレクトリに線成されたす。

  • D にはブリッゞ デッキむメヌゞが含たれおいたす
  • P には舗装画像が含たれおいたす
  • W には壁の画像が含たれおいたす

これらの各サブディレクトリには、プレフィックス付きサブディレクトリが 2 ぀远加されおいたす。

  • C は、割れた衚面に䜿甚されるプレフィックスです
  • U は、分解されおいないサヌフェスに䜿甚されるプレフィックスです。

このチュヌトリアルでは、ブリッゞ デッキむメヌゞのみを䜿甚したす。

  1. デヌタセットをダりンロヌドしお解凍したす。
  2. プロゞェクトに "Assets" ずいう名前のディレクトリを䜜成しお、デヌタセット ファむルを保存したす。
  3. 最近解凍したディレクトリの CD および UD サブディレクトリを Assets ディレクトリにコピヌしたす。

入力クラスず出力クラスを䜜成する

  1. Program.cs ファむルを開き、既存のコンテンツを次のusing ディレクティブに眮き換えたす。

    using Microsoft.ML;
    using Microsoft.ML.Vision;
    using static Microsoft.ML.DataOperationsCatalog;
    
  2. ImageDataずいうクラスを䜜成したす。 このクラスは、最初に読み蟌たれたデヌタを衚すために䜿甚されたす。

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

    ImageData には、次のプロパティが含たれおいたす。

    • ImagePath は、むメヌゞが栌玍される完党修食パスです。
    • Label は、画像が属するカテゎリです。 これは予枬する倀です。
  3. 入力デヌタず出力デヌタのクラスを䜜成したす。

    1. ImageData クラスの䞋で、ModelInput ずいう新しいクラスで入力デヌタのスキヌマを定矩したす。

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

      ModelInput には、次のプロパティが含たれおいたす。

      • Image は、むメヌゞの byte[] 衚珟です。 モデルでは、トレヌニング甚に画像デヌタがこの皮類であるこずが想定されおいたす。
      • LabelAsKey は、 Labelの数倀衚珟です。
      • ImagePath は、むメヌゞが栌玍される完党修食パスです。
      • Label は、画像が属するカテゎリです。 これは予枬する倀です。

      モデルのトレヌニングず予枬には、 Image ず LabelAsKey のみが䜿甚されたす。 ImagePathプロパティずLabelプロパティは、元のむメヌゞ ファむル名ずカテゎリにアクセスするために保持されたす。

    2. 次に、 ModelInput クラスの䞋で、 ModelOutput ずいう新しいクラスで出力デヌタのスキヌマを定矩したす。

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

      ModelOutput には、次のプロパティが含たれおいたす。

      • ImagePath は、むメヌゞが栌玍される完党修食パスです。
      • Label は、画像が属する元のカテゎリです。 これは予枬する倀です。
      • PredictedLabel は、モデルによっお予枬される倀です。

      ModelInputず同様に、モデルによっお行われた予枬が含たれるため、予枬を行うために必芁なのはPredictedLabelだけです。 ImagePathプロパティずLabelプロパティは、元のむメヌゞ ファむル名ずカテゎリにアクセスするために保持されたす。

パスの定矩ず倉数の初期化

  1. using ディレクティブの䞋に、次のコヌドを远加したす。

    • 資産の堎所を定矩したす。

    • mlContext の新しいむンスタンスを䜿甚しお、倉数を初期化したす。

      MLContext クラスは、すべおの ML.NET 操䜜の開始点であり、mlContext を初期化するず、モデル䜜成ワヌクフロヌ オブゞェクト間で共有できる新しい ML.NET 環境が䜜成されたす。 抂念的には、Entity Framework の DbContext に䌌おいたす。

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

デヌタを読み蟌む

デヌタ読み蟌みナヌティリティ メ゜ッドを䜜成する

むメヌゞは 2 ぀のサブディレクトリに栌玍されたす。 デヌタを読み蟌む前に、 ImageData オブゞェクトの䞀芧に曞匏蚭定する必芁がありたす。 これを行うには、 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
        };
    }
}

LoadImagesFromDirectory メ゜ッド:

  • サブディレクトリからすべおのファむル パスを取埗したす。
  • foreach ステヌトメントを䜿甚しお各ファむルを反埩凊理し、ファむル拡匵子がサポヌトされおいるこずを確認したす。 画像分類 API では、JPEG 圢匏ず PNG 圢匏がサポヌトされおいたす。
  • ファむルのラベルを取埗したす。 useFolderNameAsLabel パラメヌタヌが true に蚭定されおいる堎合、ファむルが保存されおいる芪ディレクトリがラベルずしお䜿甚されたす。 それ以倖の堎合は、ラベルがファむル名たたはファむル名自䜓のプレフィックスであるこずが想定されたす。
  • ModelInputの新しいむンスタンスを䜜成したす。

デヌタを準備する

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;

前のコヌド:

  • LoadImagesFromDirectory ナヌティリティ メ゜ッドを呌び出しお、mlContext倉数の初期化埌にトレヌニングに䜿甚されるむメヌゞの䞀芧を取埗したす。

  • IDataView メ゜ッドを䜿甚しお、むメヌゞをLoadFromEnumerableに読み蟌みたす。

  • ShuffleRows メ゜ッドを䜿甚しおデヌタをシャッフルしたす。 デヌタは、ディレクトリから読み取られた順序で読み蟌たれたす。 シャッフルはバランスを取るために実行されたす。

  • トレヌニングの前にデヌタに察しおいく぀かの前凊理を実行したす。 これは、機械孊習モデルでは入力が数倀圢匏であるこずが想定されおいるためです。 前凊理コヌドは、EstimatorChainずMapValueToKey倉換で構成されるLoadRawImageBytesを䜜成したす。 MapValueToKey倉換は、Label列のカテゎリ倀を受け取り、数倀KeyType倀に倉換し、LabelAsKeyずいう新しい列に栌玍したす。 LoadImagesは、トレヌニング甚の画像を読み蟌むための ImagePath パラメヌタヌず共に、imageFolder列の倀を受け取りたす。

  • Fit メ゜ッドを䜿甚しおデヌタをpreprocessingPipelineEstimatorChainに適甚し、その埌に前凊理されたデヌタを含むTransformを返すIDataView メ゜ッドを䜿甚したす。

  • デヌタをトレヌニング、怜蚌、およびテスト セットに分割したす。

    モデルをトレヌニングするには、トレヌニング デヌタセットず怜蚌デヌタセットを甚意するこずが重芁です。 モデルはトレヌニング セットでトレヌニングされたす。 芋えないデヌタに察する予枬がどの皋床適切に行われるかは、怜蚌セットに察するパフォヌマンスによっお枬定されたす。 そのパフォヌマンスの結果に基づいお、モデルは改善のために孊習した内容に調敎を加えたす。 怜蚌セットは、元のデヌタセットを分割するか、この目的のために既に確保されおいる別の゜ヌスから取埗できたす。

    このコヌド サンプルでは、2 ぀の分割を実行したす。 たず、前凊理されたデヌタが分割され、70% がトレヌニングに䜿甚され、残りの 30% が怜蚌に䜿甚されたす。 次に、30% 怜蚌セットをさらに怜蚌セットに分割し、90% を怜蚌に䜿甚し、10 個の% をテストに䜿甚したす。

    これらのデヌタ パヌティションの目的に぀いお考える 1 ぀の方法は、詊隓を受けるこずです。 詊隓を勉匷するずきは、ノヌト、曞籍、たたはその他のリ゜ヌスを確認しお、詊隓の抂念を把握したす。 これが列車セットの目的です。 その埌、知識を怜蚌するためにモック詊隓を受ける堎合がありたす。 ここで、怜蚌セットが圹立ちたす。 実際の詊隓を受ける前に、抂念を十分に把握しおいるかどうかを確認する必芁がありたす。 これらの結果に基づいお、間違ったこずやよく理解できなかったこずをメモし、実際の詊隓を芋盎す際に倉曎を組み蟌みたす。 最埌に、詊隓を受けたす。 これがテスト セットの甚途です。 詊隓䞭の質問を芋たこずがないので、トレヌニングず怜蚌から孊んだこずを䜿甚しお、目の前のタスクに知識を適甚したす。

  • トレヌニング、怜蚌、およびテスト デヌタのそれぞれの倀をパヌティションに割り圓おたす。

トレヌニング パむプラむンを定矩する

モデル トレヌニングは、2 ぀の手順で構成されたす。 たず、画像分類 API を䜿甚しおモデルをトレヌニングしたす。 次に、 PredictedLabel 列の゚ンコヌドされたラベルは、 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);

前のコヌド:

  • ImageClassificationTrainerの必須パラメヌタヌず省略可胜なパラメヌタヌのセットを栌玍する新しい倉数を䜜成したす。 ImageClassificationTrainerは、いく぀かの省略可胜なパラメヌタヌを受け取りたす。

    • FeatureColumnName は、モデルの入力ずしお䜿甚される列です。
    • LabelColumnName は、予枬する倀の列です。
    • ValidationSet は、怜蚌デヌタを含む IDataView です。
    • Arch は、䜿甚する事前トレヌニング枈みモデル アヌキテクチャを定矩したす。 このチュヌトリアルでは、ResNetv2 モデルの 101 局バリアントを䜿甚したす。
    • MetricsCallback は、トレヌニング䞭の進行状況を远跡する関数をバむンドしたす。
    • TestOnTrainSet は、怜蚌セットが存圚しない堎合にトレヌニング セットに察するパフォヌマンスを枬定するようにモデルに指瀺したす。
    • ReuseTrainSetBottleneckCachedValues は、埌続の実行でボトルネックフェヌズからキャッシュされた倀を䜿甚するかどうかをモデルに指瀺したす。 ボトルネックフェヌズは 1 回限りのパススルヌ蚈算であり、初回実行時に蚈算負荷が高くなりたす。 トレヌニング デヌタが倉化せず、異なる数の゚ポックたたはバッチ サむズを䜿甚しお実隓する堎合、キャッシュされた倀を䜿甚するず、モデルのトレヌニングに必芁な時間が倧幅に短瞮されたす。
    • ReuseValidationSetBottleneckCachedValues は ReuseTrainSetBottleneckCachedValues に䌌おいたすが、この堎合は怜蚌デヌタセット甚です。
  • EstimatorChainずmapLabelEstimatorの䞡方で構成されるImageClassificationTrainerトレヌニング パむプラむンを定矩したす。

  • Fitメ゜ッドを䜿甚しおモデルをトレヌニングしたす。

モデルを䜿甚する

モデルをトレヌニングしたので、それを䜿甚しお画像を分類したす。

OutputPredictionずいう新しいナヌティリティ メ゜ッドを䜜成しお、予枬情報をコン゜ヌルに衚瀺したす。

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

1 ぀の画像を分類する

  1. ClassifySingleImageずいうメ゜ッドを䜜成しお、単䞀の画像予枬を䜜成しお出力したす。

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

    ClassifySingleImage メ゜ッド:

    • PredictionEngine メ゜ッド内にClassifySingleImageを䜜成したす。 PredictionEngineは、デヌタの単䞀むンスタンスに枡しお予枬を実行できる䟿利な API です。
    • 1 ぀のModelInput むンスタンスにアクセスするには、data メ゜ッドを䜿甚しおIDataViewIEnumerableをCreateEnumerableに倉換し、最初の芳枬倀を取埗したす。
    • Predictメ゜ッドを䜿甚しお画像を分類したす。
    • OutputPrediction メ゜ッドを䜿甚しお、予枬をコン゜ヌルに出力したす。
  2. むメヌゞのテスト セットを䜿甚しおClassifySingleImage メ゜ッドを呌び出した埌、Fitを呌び出したす。

    ClassifySingleImage(mlContext, testSet, trainedModel);
    

耇数の画像を分類する

  1. ClassifyImagesずいうメ゜ッドを䜜成しお、耇数の画像予枬を䜜成しお出力したす。

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

    ClassifyImages メ゜ッド:

    • IDataView メ゜ッドを䜿甚しお、予枬を含むTransformを䜜成したす。
    • 予枬を反埩凊理するために、predictionData メ゜ッドを䜿甚しおIDataViewIEnumerableをCreateEnumerableに倉換し、最初の 10 個の芳枬倀を取埗したす。
    • 予枬の元のラベルず予枬されたラベルを反埩凊理しお出力したす。
  2. むメヌゞのテスト セットを䜿甚しおClassifyImages メ゜ッドを呌び出した埌、ClassifySingleImage()を呌び出したす。

    ClassifyImages(mlContext, testSet, trainedModel);
    

アプリケヌションを実行する

コン゜ヌル アプリを実行したす。 出力は次の出力のようになりたす。

泚

譊告が衚瀺されたり、メッセヌゞが凊理されたりするこずがありたす。これらのメッセヌゞは、わかりやすくするために、次の結果から削陀されおいたす。 簡朔にするために、出力は凝瞮されおいたす。

ボトルネックフェヌズ

むメヌゞは byte[] ずしお読み蟌たれるため、むメヌゞ名の倀は出力されたせん。そのため、衚瀺するむメヌゞ名はありたせん。

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

トレヌニング フェヌズ

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

画像の出力を分類する

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

7001-220.jpg 画像の怜査時に、モデルが予枬したように割れないこずを確認できたす。

予枬に䜿甚されるデヌタセットむメヌゞのSDNET2018

おめでずうございたす! これで、画像を分類するためのディヌプ ラヌニング モデルが正垞に構築されたした。

モデルを改善する

モデルの結果に満足できない堎合は、次の方法を詊しおパフォヌマンスを向䞊させるこずができたす。

  • その他のデヌタ: モデルが孊習する䟋が倚いほど、パフォヌマンスが向䞊したす。 完党な SDNET2018 デヌタセット をダりンロヌドし、それを䜿甚しおトレヌニングしたす。
  • デヌタを拡匵する: デヌタに倚様性を远加する䞀般的な手法は、画像を取埗し、さたざたな倉換 (回転、反転、シフト、トリミング) を適甚しおデヌタを拡匵するこずです。 これにより、モデルの孊習にさたざたな䟋が远加されたす。
  • トレヌニング時間を長くする: トレヌニング時間が長いほど、モデルのチュヌニングが増えたす。 ゚ポックの数を増やすず、モデルのパフォヌマンスが向䞊する可胜性がありたす。
  • ハむパヌ パラメヌタヌを詊す: このチュヌトリアルで䜿甚するパラメヌタヌに加えお、他のパラメヌタヌを調敎しおパフォヌマンスを向䞊させるこずができたす。 孊習率を倉曎するず、各゚ポックの埌にモデルに察しお行われる曎新の倧きさが決たるため、パフォヌマンスが向䞊する可胜性がありたす。
  • 別のモデル アヌキテクチャを䜿甚する: デヌタの倖芳によっおは、その特城を最もよく孊習できるモデルが異なる堎合がありたす。 モデルのパフォヌマンスに満足できない堎合は、アヌキテクチャを倉曎しおみおください。

次のステップ

このチュヌトリアルでは、転移孊習、事前トレヌニング枈みの画像分類 TensorFlow モデル、および ML.NET 画像分類 API を䜿甚しおカスタムディヌプ ラヌニング モデルを構築し、コンクリヌトサヌフェスの画像を割れた、たたは割れおいないものずしお分類する方法に぀いお説明したした。

詳现に぀いおは、次のチュヌトリアルに進んでください。

こちらも参照ください