深層学習を使用したセマンティック セグメンテーション入門
セグメンテーションは、コンピューター ビジョンとイメージ処理に不可欠な手法です。"セマンティック セグメンテーション" は、イメージの各ピクセルをクラス ラベル ("花"、"人物"、"道路"、"自動車" など) に関連付けます。同じクラスに属する別個のオブジェクトを区別することはありません。
領域ベースの手法やエッジ検出などの従来のセマンティック セグメンテーション手法では、現実世界のイメージの多様性や複雑さを処理する上で制約が生じることがよくあります。深層学習ベースの手法、特に、畳み込みニューラル ネットワーク (CNN) や、U-Net、完全畳み込みネットワーク (FCN) などのアーキテクチャを活用する手法は、複雑なパターンを自動的に学習して一般化できるため、さまざまなデータセットで優れたパフォーマンスと適応性を発揮します。
シーンの全体的な構成が重要であるものの、個々のオブジェクトの同定は重視しない複雑なイメージ シーンでは、深層学習ベースのセマンティック セグメンテーションを使用します。インスタンス セグメンテーションを使用して、同じクラスにセグメント化された異なるオブジェクトを区別する場合は、Get Started with Instance Segmentation Using Deep Learningを参照してください。セマンティック セグメンテーションは、以下のようなさまざまなタスクに使用できます。
自動運転
工業検査
衛星画像に表示される地形の分類
医用画像解析
事前学習済みのセマンティック セグメンテーション モデルを使用して、既定のネットワーク オプションでテスト イメージに対して推論を実行したり、カスタム データ セットでセマンティック セグメンテーション ネットワークに学習させたりできます。
セマンティック セグメンテーション モデルの選択
どのセマンティック セグメンテーション手法を選択するかは、多くの場合、用途やセグメント化するイメージの特性によって異なります。以下の表を使用し、用途とイメージ データに基づいて、Computer Vision Toolbox™ で利用できるセマンティック セグメンテーションのアーキテクチャを選択してください。
セマンティック セグメンテーション モデル | 機能 | ユース ケース | 例 |
---|---|---|---|
BiSeNet v2 | bisenetv2 | BiSeNet v2 は、自動運転やビデオ解析など、リアルタイムで正確なセグメンテーションが必要な用途におけるイメージのセグメント化に使用できます。推論速度が優先事項である場合、特に計算リソースが限られている場合は、U-Net や DeepLab v3+ ではなく BiSeNet v2 を使用してください。 事前学習済みの BiSeNet v2 ネットワークを使用して一般的なシーン (人物や車など) を含むイメージに対する推論を実行したり、カスタム データ セットでネットワークに学習させたりできます。 | |
U-Net | U-Net は、一部の医用画像の用途など、学習データが限られている場合のイメージのセグメント化に使用できます。 このネットワークには学習が必要です。 | ||
DeepLab v3+ | deeplabv3plus | DeepLab v3+ は、境界を正確に区別する必要がある用途 (自動運転や衛星写真など) に使用できます。計算リソースが限られている場合や単純なセグメンテーション問題のタスクである場合は、U-Net、BiSeNet V2、またはその他の軽量アーキテクチャの方が適している可能性があります。 このネットワークには学習が必要です。 |
|
モデル アーキテクチャを選択したら、グラウンド トゥルース データを準備し、セマンティック セグメンテーション ネットワークに学習させなければなりません。
事前学習済みのセマンティック セグメンテーション ネットワークを使用した推論の実行
事前学習済みのセマンティック セグメンテーション モデル、Computer Vision Toolbox Model for BiSeNet v2 Semantic Segmentation Network、またはユーザーが学習させる任意のモデルを使用し、テスト イメージに対してセマンティック セグメンテーションを実行するには、以下の手順に従います。このモデルの事前学習済み BiSeNet v2 ネットワークは、COCO Stuff データセットの 171 個のオブジェクト クラスで事前学習を行っています。
Computer Vision Toolbox Model for BiSeNet v2 Semantic Segmentation Network はアドオン エクスプローラーからインストールできます。アドオンのインストールの詳細については、アドオンの入手と管理を参照してください。このアドオンには Deep Learning Toolbox™ も必要です。
bisenetv2
関数を使用して事前学習済みのネットワークを構成します。出力であるpretrainedNet
はdlnetwork
(Deep Learning Toolbox) オブジェクトです。2 番目の出力である classes は、モデルがセグメント化のために事前学習したクラス名を含む string ベクトルです。[pretrainedNet,classes] = bisenetv2();
テスト イメージをワークスペースに読み込みます。テスト イメージのサイズをネットワークの入力サイズに合わせて変更します。イメージを表示します。
I = imread("visionteam.jpg"); inputSize = net.Layers(1).InputSize(1:2); img = imresize(I,inputSize); imshow(I)
semanticseg
関数を使用して、テスト イメージ内のオブジェクトをセグメント化します。この関数は、入力イメージ内の各ピクセルにラベルを関連付ける categorical 配列であるセグメンテーション マップを返します。segMap = semanticseg(I,pretrainedNet,Classes=classes);
labeloverlay
関数を使用し、最小のオブジェクト マスクを一番上に並べたセグメンテーション マップをイメージに重ね合わせて表示します。segmentedImage = labeloverlay(I,segMap,Transparency=0.4); imshow(segmentedImg)
学習済みのセマンティック セグメンテーション ネットワークを使用してテスト イメージの推論を実行するには、手順 2 ~ 4 と同じ処理を使用しますが、semanticseg
関数に対して学習済みのネットワークを指定します。
学習用のグラウンド トゥルース データの準備
セマンティック セグメンテーション ネットワークに学習させるためのグラウンド トゥルース データを準備するには、アプリを使用してグラウンド トゥルース データにラベルを付けるか、既存のラベル付きデータをインポートします。既存のピクセル ラベルを含むデータ セットをインポートする方法の例については、セマンティック セグメンテーションのピクセル ラベル付きデータセットのインポートを参照してください。
以下のアプリを使用すると、イメージ データにピクセル ラベルを対話的に割り当てることができます。
イメージ ラベラー – ピクセルのラベル付けツールを使用して、イメージ コレクションに含まれるグラウンド トゥルース データにラベルを付けます。開始するには、イメージ ラベラー入門を参照してください。
ビデオ ラベラー – ビデオやイメージ シーケンスに含まれるグラウンド トゥルース データ、またはカスタム データ ソース リーダーから取得したグラウンド トゥルース データにラベルを付けます。開始するには、ビデオ ラベラー入門を参照してください。
グラウンド トゥルース ラベラー (Automated Driving Toolbox) – 複数のビデオ、イメージ シーケンス、または LiDAR 点群に含まれるグラウンド トゥルース データにラベルを付けます。開始するには、グラウンド トゥルースのラベル付け入門 (Automated Driving Toolbox)を参照してください。
グラウンド トゥルース データのラベル付けとエクスポート
用途に必要なアプリを選択したら、以下の手順に従い、グラウンド トゥルース データにラベルを付けてエクスポートします。
アプリに組み込まれているアルゴリズムのいずれか 1 つを使用するか、独自のカスタム アルゴリズムを作成して、イメージ データにラベルを付けます。自動セグメンテーション アルゴリズムである Segment Anything など、組み込みのピクセルのラベル付けツールを選択して、イメージ データにラベルを付けるには、セマンティック セグメンテーションのピクセルのラベル付けを参照してください。独自のオートメーション アルゴリズムを作成する方法については、Create Automation Algorithm Function for Labelingを参照してください。
ラベル付けされたグラウンド トゥルース データを
groundTruth
オブジェクトとしてエクスポートします。グラウンド トゥルース ラベラー アプリを使用している場合は、groundTruthMultisignal
(Automated Driving Toolbox) オブジェクトとしてエクスポートします。ピクセル ラベル データをエクスポートする方法については、ラベル付きのグラウンド トゥルース データの共有と保存を参照してください。ピクセル ラベル データをエクスポートした後にアクセスして検証する方法については、ラベラー アプリにおけるエクスポートしたピクセル ラベルの保存方法を参照してください。
学習データストアの作成
次に、以下の手順に従って学習データストアを作成します。
pixelLabelTrainingData
関数を使用して、groundTruth
オブジェクトから学習データを作成します。グラウンド トゥルース ラベラー アプリを使用している場合は、gatherLabelData
(Automated Driving Toolbox) 関数を使用して、groundTruthMultisignal
オブジェクトから学習データを作成します。combine
関数を使用し、イメージ データストアとpixelLabelTrainingData
関数によって返されたピクセル ラベル データストアを 1 つの学習データストアに統合します。
学習用イメージ データの前処理と拡張
この段階では、学習イメージ データとネットワークの入力サイズが確実に一致しなければなりません。そうでない場合は、imresize
関数を使用し、ネットワークの入力サイズに合わせてイメージのサイズを調整します。
データ セットのサイズとメモリ フットプリントを増やすことなく学習イメージの多様性を高めるため、必要に応じてイメージ データにランダム化された拡張を適用できます。イメージに平行移動、トリミング、変換などの拡張を適用すると、学習用データの多様性が高まります。データの前処理と拡張を開始するには、深層学習用イメージ前処理とイメージ拡張の入門を参照してください。
セマンティック セグメンテーション ネットワークの学習
以下の手順に従って、ラベル付きデータ セットでセマンティック セグメンテーション用の深層学習ネットワークに学習させます。
ネットワークの構成
ユース ケースの要件に基づいてセマンティック セグメンテーション モデルを構成します。セマンティック セグメンテーション用の深層学習ネットワークを自分で作成したり、利用できる 3 つの学習可能なネットワーク アーキテクチャ (BiSeNet V2、U-Net、DeepLab v3+) のいずれかを使用したりできます。セマンティック セグメンテーション モデルの選択セクションの表を使用し、データ セットの特性と利用可能なコンピューティング リソースに基づいてこれらのネットワークのいずれかを選択します。
セグメンテーション タスクにこれらの既存のアーキテクチャでは適切に対処できない要件がある場合は、カスタム ネットワークが必要になることがあります。モデルのサイズ、推論速度、メモリ使用量に厳しい制約がある場合は、モデル アーキテクチャをカスタマイズするためにカスタム ネットワークを設計します。カスタム セマンティック セグメンテーション ネットワークの作成方法の例については、セマンティック セグメンテーション ネットワークの作成の例を参照してください。
学習オプションの構成
trainingOptions
(Deep Learning Toolbox) 関数を使用して、学習オプションを構成します。利用可能なコンピューティング リソースに基づいて、エポック数とミニバッチのサイズを指定します。
ネットワークの学習
trainnet
(Deep Learning Toolbox) 関数を使用し、学習オプションを指定して、学習データストアでネットワークに学習させます。trainnet
関数に対して未学習のネットワークまたは事前学習済みのネットワークを dlnetwork
(Deep Learning Toolbox) として指定し、転移学習を実行します。ほとんどのマルチクラス セグメンテーション タスクでは、"cross-entropy"
、または crossentropy
(Deep Learning Toolbox) を含む関数ハンドルを使用し、trainnet
関数の損失関数として categorical クロスエントロピー損失を指定します。損失関数には、予測されたセグメンテーション マップとグラウンド トゥルース ラベルの差を定量化するメトリクスが含まれていなければなりません。たとえば、generalizedDice
関数を使用して、一般化 Dice 損失を計算することもできます。
シンプルなカスタム セグメンテーション ネットワークに学習させる方法の例については、セマンティック セグメンテーション ネットワークの学習の例を参照してください。
セマンティック セグメンテーションの結果の評価
evaluateSemanticSegmentation
関数を使用して、インスタンス セグメンテーションの結果の品質をグラウンド トゥルースと比較して評価します。データストアで read
関数を使用すると categorical 配列、cell 配列、または table が返されるように、予測されたピクセル ラベル データストアとグラウンド トゥルース データストアが設定されていることを確認します。関数 read
が複数列の cell 配列または table を返す場合、2 番目の列には categorical 配列が含まれていなければなりません。
予測メトリクスを計算するには、予測されたピクセル ラベル データストアとグラウンド トゥルース データストアを evaluateSemanticSegmentation
関数への入力として指定します。この関数は、混同行列や平均適合率などのメトリクスを計算し、そのメトリクスを semanticSegmentationMetrics
オブジェクトに保存します。
セマンティック セグメンテーション メトリクスを使用して結果を評価する方法の例については、次の例を参照してください。
参考
アプリ
- イメージ ラベラー | ビデオ ラベラー | グラウンド トゥルース ラベラー (Automated Driving Toolbox) | 医用画像ラベラー (Medical Imaging Toolbox)
関数
semanticseg
|bisenetv2
|unet
|unet3d
|deeplabv3plus
|dlnetwork
(Deep Learning Toolbox) |pixelLabelDatastore
|evaluateSemanticSegmentation
|semanticSegmentationMetrics
|segmentationConfusionMatrix
|generalizedDice
参考
トピック
- Get Started with Image Segmentation
- セマンティック セグメンテーションのためのピクセル ラベルの拡張
- セマンティック セグメンテーションのピクセル ラベル付きデータセットのインポート
- Automatically Label Ground Truth Using Segment Anything Model
- セマンティック セグメンテーションのピクセルのラベル付け
- 深層学習を使用したセマンティック セグメンテーション
- 膨張畳み込みを使用したセマンティック セグメンテーション
- ブロックベースのワークフローにおけるセグメンテーション メトリクスの計算
- Grad-CAM を使用したセマンティック セグメンテーション ネットワークの調査
- MATLAB による深層学習 (Deep Learning Toolbox)