Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ボリュームの領域分割を使用したセマンティック セグメンテーションの作成

この例では、ボリュームの領域分割アプリを使用してボリュームのセマンティック セグメンテーションを作成する方法を説明します。ボリュームの領域分割アプリは、ボリュームを調査しボリューム内のオブジェクトをセグメント化するためのさまざまな方法を提供します。たとえば、ボリュームをスライス単位で表示したり、3 次元表現として表示したりできます。オブジェクトをセグメント化するには、ROI 描画ツールまたはペイント ブラシ ツールを使用して関心領域 (ROI) を描画します。この例では、MRI イメージのスタックをセグメント化し、脳および腫瘍の領域にラベルを付けます。また、背景にもラベルを付けます。

ボリューム データのワークスペースへの読み込み

ボリュームをワークスペースに読み込みます。この例では、MAT ファイル vol_001.mat に格納されている、脳の MRI イメージのスタックを使用します。MRI データは、BraTS データセット [1] のサブセットに変更を加えたものです。

load(fullfile(toolboxdir("images"),"imdata", ...
    "BrainMRILabeled","images","vol_001.mat"));
whos vol
  Name        Size                    Bytes  Class     Attributes

  vol       240x240x155            17856000  uint16              

ボリュームの領域分割アプリを開く

ボリュームの領域分割アプリを開きます。MATLAB® ツールストリップの [アプリ] タブをクリックします。[イメージ処理とコンピューター ビジョン] セクションで [ボリュームの領域分割] をクリックします。

CreateSemanticSegmentationUsingVolumeSegmenterExample_01.png

ボリュームの領域分割へのボリュームの読み込み

ボリュームの領域分割アプリにボリュームを読み込むには、アプリのツールストリップで [ボリュームを開く] をクリックします。この例の場合、[ワークスペースから開く] を選択します。[ボリュームをインポート] ダイアログ ボックスで、ワークスペースに読み込んだボリューム vol を選択し、[OK] をクリックします 代わりに、以下の volumeSegmenter コマンドを使用して、アプリを開くときにボリュームを指定することもできます。

volumeSegmenter(vol)

"ボリュームの領域分割" アプリは、[3-D 表示] ペインにボリュームの 3 次元表現を表示し、[スライス] ペインにデータ セットの個々のスライスを表示します。

CreateSemanticSegmentationUsingVolumeSegmenterExample_02.png

既定の設定では、[スライス] ペインにはデータの最初のスライスが表示されます。イメージの上部には表示されたスライスの番号 (1/155 など) が表示されます。このデータ セットの場合、最初の数スライスには脳のイメージが含まれていません。

また、既定の名前 Label1 を使用して、[ラベル] ペインにセグメンテーションのラベルが自動的に作成されます。[ラベル] ペインでは複数のラベルを定義できます。ただし、バイナリ マスクを作成する場合、作成するラベルは 1 つのみとしなければなりません。

ラベルの名前を変更するには、ラベル名をダブルクリックします。ラベルに関連付けられた色を変更するには、[ラベル] ペインに表示されたカラーの正方形をダブルクリックします。[ラベルを開く] ボタンを使用すると、オプションで既存のラベル セットをアプリに読み込むことができます。

ボリュームの調査

セグメント化する内容を指定するには、[3-D 表示] ペインおよび [スライス] ペインを使用してボリュームを調査します。

[3-D 表示] ペインでは、マウスを使用してボリュームを回転すると、あらゆる角度からデータを調べることができます。また、アプリのツールストリップの [3-D 表示] タブでは、ボリュームの表示をカスタマイズできます。たとえば、ボクセルの相対サイズを記述するメタデータがある場合、アプリのツールストリップにある [3-D 表示] タブの [空間参照] 部分でそのメタデータを指定できます。データの表示を改善するには、次の図に示すように、3 次元表示で使用する背景色の変更、表示のしきい値と不透明度の変更、表示への座標軸の方向の追加などを行います。脳の MRI データを使用すると、セグメント化する側頭葉の腫瘍を確認できます。

CreateSemanticSegmentationUsingVolumeSegmenterExample_03.png

また、[スライス] ペインでボリュームの各スライスを表示することもできます。スライス間を移動するには、ペインの下部にあるスライダーを使用します。腫瘍はスライス 35 からスライス 88 で確認できます。既定の設定では、[スライス] ペインに X-Y 軸に沿ってボリュームが表示されますが、これは [領域分割] タブのツールストリップの [向き] セクションにあるボタンを使用して変更することができます。また、[スライス] ペインでは、描画ツールを使用してマスクを定義します。

CreateSemanticSegmentationUsingVolumeSegmenterExample_04.png

描画ツールを使用したボリューム内の領域のラベル付け

セグメント化するオブジェクトを識別したら、アプリのツールストリップにある [描画] タブのツールを使用して、領域を定義できます。次の ROI ツールから、使用する描画ツールを選択します: [フリーハンド][補助付きフリーハンド][多角形][ペイント ブラシ]

最初に脳にラベルを付けます。複数スライス上で脳の上に腫瘍が現れるため、あるオブジェクトが別のオブジェクトに入れ子になっている場合は、まず大きな領域にラベルを付けます。最初のステップは、[ラベル] ペインでのラベルの作成です。既定の設定では、Label1 という名前のラベルが 1 つ提供されています。用途に適した名前にラベルを変更するには、ラベルをダブルクリックして新しい名前を入力します。ラベルに関連付けられた既定の色を変更するには、ラベル識別子のカラーの正方形をダブルクリックして [色] ダイアログ ボックスから色を選択します。

CreateSemanticSegmentationUsingVolumeSegmenterExample_05.png

[スライス] ペインで、オブジェクトが最初に現れるスライスにナビゲートし、描画ツールを使用してオブジェクトにラベルを付けます。次の図ではペイント ブラシ ツールを使用して脳にラベルを付けていますが、任意の描画ツールを使用できます。

CreateSemanticSegmentationUsingVolumeSegmenterExample_06.png

内挿を使用したオブジェクト ROI 作成の高速化

ボリュームでスライス間を移動して、オブジェクトが現れる各スライスで ROI を描画することかできます。ただし、ボリュームの領域分割アプリでは、スライスをまたがってオブジェクトをセグメント化するのに役立ついくつかの自動内挿ツールを提供しています。

内挿を使用するには、まず 2 つのスライスに手動で領域を定義しなければなりません。オブジェクトが現れる最初のスライスには既に領域を定義してあります (スライス 35)。同じ手順を使用して、オブジェクトが現れる最後のスライスに領域を定義します (スライス 88)。スライダーに、ROI のあるスライスを示す、ラベルと関連付けられた色のバーが 2 つ配置されます。

CreateSemanticSegmentationUsingVolumeSegmenterExample_07.png

2 つのスライスに ROI を定義した状態で、[自動内挿] をクリックします。間にあるすべてのスライスに ROI が自動的に定義されます。ROI をもつすべてのスライスが青色のバーで示され、スライス 35 からスライス 88 までが連続したバーのように見えています。

CreateSemanticSegmentationUsingVolumeSegmenterExample_08.png

あるいは、2 つのスライスに ROI を定義した後、[手動内挿] をクリックすることもできます。このオプションを使用すると、[手動内挿] ダイアログ ボックスが開きます。内挿の元となる 2 つの領域 (領域 1 と領域 2) を選択します。最初の領域を選択するには、ダイアログ ボックスの下部にあるスライダーを使用して、ROI のある最初のスライス (スライス 35) にナビゲートしてから、表示された ROI の内部をクリックします。2 番目の領域を選択するには、領域 2 をクリックしてスライス 88 にナビゲートし、表示された ROI の内部をクリックします。2 つの領域を選択後、[実行] をクリックし、間にあるすべてのスライスで ROI を内挿します。

CreateSemanticSegmentationUsingVolumeSegmenterExample_09.png

内挿されたラベルの調整

内挿の使用後、個々のスライスをチェックして、満足できる ROI が作成されているかを確認します。スライス 71 では、セグメント化するオブジェクト全体が ROI で塗りつぶされていないことに注目してください。[ペイント ブラシ] ツールを使用することで、ROI を手動で調整できます。あるいは、[自動化] タブのツールのいずれかを使用することもできます。たとえば、[動的輪郭] を使用して、腫瘍の全体が塗りつぶされていないスライスで ROI を大きくすることができます。

CreateSemanticSegmentationUsingVolumeSegmenterExample_10.png

カスタム処理の実行

ROI 上で動作する独自のアルゴリズムを追加することもできます。[自動化] タブで [アルゴリズムの追加] をクリックします。独自の処理関数を 2 次元スライスごとに動作させるか (スライスベース)、3 次元ボリューム全体で動作させるか (ボリュームベース) を選択します。

CreateSemanticSegmentationUsingVolumeSegmenterExample_11.png

この例では、[スライスベース] の下で [新規] オプションを選択して [関数テンプレート] をクリックし、2 次元スライスごとに動作する新しい関数を作成します。MATLAB エディターでテンプレートが開きます。テンプレートのサンプル コードを、使用するコードに置き換えます。使用する関数では、個別のイメージとしての各スライスおよびマスクという 2 つの引数を受け入れなければなりません。また、マスク イメージを返さなければなりません。

テンプレートの編集が完了したらファイルを保存します。"ボリュームの領域分割" アプリにより、[自動化] タブ ツールストリップに関数用のボタンが自動的に作成されます。1 つのスライス上で関数をテストするには、[実行] をクリックします。既定の設定では、関数は現在のスライスにのみ適用されます。

1 つのスライスで関数をテストした後は、すべてのスライスまたはスライスのサブセットで関数を実行できます。関数は、現在のスライスから最後 (最も番号の大きいスライス) までか、現在のスライスから最初 (スライス 1) までに対して実行できます。また、開始スライスと終了スライスを指定してスライスの範囲を指定することもできます。

CreateSemanticSegmentationUsingVolumeSegmenterExample_13.png

方向オプションのいずれかを選択した場合は、表示中のスライス番号が更新されます。この表示を使用すると、処理の進捗を表示することができます。

CreateSemanticSegmentationUsingVolumeSegmenterExample_14.png

追加ラベルの作成

各スライスの脳にラベルを付けた後、スライス上に腫瘍が現れている場合はすべてラベルを付け、前述したとおりに手順を繰り返します。

最初に、[ラベル] ペインで新しいラベルを定義します。[ラベル] ペインのプラス記号をクリックして新しいラベルを作成します。

CreateSemanticSegmentationUsingVolumeSegmenterExample_15.png

[スライス] ペインで、オブジェクトが最初に現れるスライスにナビゲートし、描画ツールを使用して各スライスのオブジェクトにラベルを付け始めます。次の図では、ペイント ブラシ ツールを使用して腫瘍にラベルを付けています。前述のとおり、オブジェクトが現れる各スライスでオブジェクトを描画するか、または内挿ツールを使用して複数のスライスで自動的に描画することができます。内挿後は、[消しゴム] などの描画ツールを使用して、各スライスの自動化セグメンテーションを変更できます。

背景を個別にラベル付けした領域化

複数のラベルを定義している場合、アプリはラベル データのデータ型を categorical として設定します。ラベルなし categorical ボクセルの既定値は <undefined> です。背景のボクセルが認識可能な分類をもつように背景のボクセルにラベル付けをするには、前述の処理と同様の処理を行います。

  1. [ラベル] ペインで新しいラベルを定義し、そのラベルに記述名を指定して、背景に指定する色を選択します。

  2. 各スライスで背景にラベルを付けます。スライスにナビゲートし、[描画] タブの [領域の塗りつぶし] を選択して背景の任意の場所をクリックします。この処理をスライスごとに繰り返します。

背景を追加すると、[3-D 表示] ペインでボリュームを可視化したときに他のラベルが不明瞭になる場合があります。[3-D 表示] ペインでラベル付けされた他の領域を表示するには、背景ラベルの表示を無効にします。[3-D 表示] タブの [ラベルの表示] をクリックし、[カスタマイズ] をクリックして背景ラベルの表示を選択解除します。

セグメンテーションの保存

ボリューム内の脳と腫瘍にラベルを付け終えたら、セグメンテーションを保存します。[領域分割] タブで [ラベルを保存] をクリックし、いくつかのオプションから選択します。ラベルの付いた MRI データは、MAT ファイルまたはワークスペース内の変数として保存できます。この例では、ワークスペース変数を選択し、変数の名前を brain_labels とします。

セグメンテーションを保存した後、オプションで [自動保存] をオンにすると、セグメンテーションが定期的に自動保存されます。

CreateSemanticSegmentationUsingVolumeSegmenterExample_17.png

ラベル付きボリュームの表示

マスクを表示するには、関数 volshow を使用します。以下のコマンドは、ボリューム オーバーレイ プロパティを調整することによって、ボリューム内のラベルを表示する方法を示しています。

viewer = viewer3d(BackgroundColor="white",BackgroundGradient="off",CameraZoom=1.5);
volDisp = volshow(vol,OverlayData=brain_labels,Parent=viewer, ...
    RenderingStyle="GradientOpacity",GradientOpacityValue=0.8, ...
    Alphamap=linspace(0,0.2,256),OverlayAlphamap=0.8);

参考文献

[1] Medical Segmentation Decathlon. "Brain Tumours." Tasks. Accessed May 10, 2018. http://medicaldecathlon.com/.

BraTS データセットは、CC-BY-SA 4.0 のライセンスに基づき Medical Segmentation Decathlon によって提供されます。一切の保証および表明を行いません。詳細については、ライセンスを参照してください。MathWorks® は、この例で使用されているデータのサブセットに変更を加えています。この例では、元のデータセットから 1 スキャンの MRI データを MAT ファイルに保存して使用しています。

参考

関連するトピック