深層学習を使用したマルチスペクトルメジのセマンティックセグメンテション
この例では,U-Netを使用して7チャネルのマルチスペクトルイメージのセマンティックセグメンテーションを実行する方法を示します。
セマンティックセグメンテ,ションでは;セマンティックセグメンテーションの適用例の1つに,森林被覆の時間的変化である森林伐採の追跡があります。環境保護機関は,森林伐採を追跡し,地域の環境的生態学的健全性を評価し測定します。
深層学習ベースのセマンティックセグメンテーションにより,高解像度の航空写真から植被を正確に測定できます。課題の1つに,視覚的に類似した特性のクラスを切り分けること,たとえば緑のピクセルを草,低木または樹木として区別することがあります。分類の精度を高めるために,一部のデータセットには各ピクセルに関する追加情報を提供するマルチスペクトルイメージが含まれています。たとえば,ハームリンビーチ州立公園のデータセットでは,クラスをより明確に分離する3つの近赤外チャネルでカラーイメージが補完されています。
この例では,まず,事前学習済みのU-Netを使用してセマンティックセグメンテーションを実行する方法を示し,次に,セグメンテーションの結果を使用して植被率を計算する方法を示します。さらに,オプションとして,パッチベースの学習手法を使用して,哈姆林海滩州立公园データセットでU-Netネットワークに学習させることもできます。
デ,タセットのダウンロ,ド
この例では,ネットワークに学習させるために,高解像度のマルチスペクトルデータセットを使用します[1]。このイメージセットはニューヨーク州のハームリンビーチ州立公園の上空でドローンを使用して撮影されました。このデータには18個のオブジェクトクラスラベルの付いた,ラベル付き学習セット,検証セットおよびテストセットが含まれます。デタファルのサズは3.0 gbです。
補助関数downloadHamlinBeachMSIData
を使用して,デタセットのmatファルバジョンをダウンロドします。この関数は,この例にサポ,トファ,ルとして添付されています。dataDir
をデ,タの目的の場所として指定します。
dataDir = fullfile(tempdir,“rit18_data”);downloadHamlinBeachMSIData (dataDir);
デ,タセットを読み込みます。
负载(fullfile (dataDir“rit18_data.mat”));谁train_dataval_datatest_data
名称大小字节类属性test_data 7x12446x7654 1333663576 uint16 train_data 7x9393x5642 741934284 uint16 val_data 7x8833x6918 855493716 uint16
マルチスペクトルメジデタはnumChannelsx宽度x高度配列に配置されます。ただし,matlab®では,マルチチャネル宽度x高度xnumChannels配列に配置されます。チャネルが3番目の次元になるようにデタを形状変更するには,補助関数switchChannelsToThirdPlane
を使用します。この関数は,この例にサポ,トファ,ルとして添付されています。
train_data = switchChannelsToThirdPlane(train_data);val_data = switchChannelsToThirdPlane(val_data);test_data = switchChannelsToThirdPlane(test_data);
デ,タが正しい構造体であることを確認します。
谁train_dataval_datatest_data
名称大小字节类属性test_data 12446x7654x7 1333663576 uint16 train_data 9393x5642x7 741934284 uint16 val_data 8833x6918x7 855493716 uint16
学習デタをmatファルとして,学習ラベルをPNGファルとして保存します。これにより,imageDatastore
とpixelLabelDatastore
を使用して学習中に学習デ,タを簡単に読み込むことができます。
保存(“train_data.mat”,“train_data”);imwrite (train_labels“train_labels.png”);
マルチスペクトルデ,タの可視化
このデータセットでは,RGBカラーチャネルは3番目,2番目,および1番目のイメージチャネルです。学習,検証およびテストメジの色成分をモンタジュとして表示します。イメージを画面上で明るく表示するには,関数histeq
を使用してヒストグラム均等化を行います。
图蒙太奇(...{histeq(train_data(:,:,[3 2 1])),...Histeq (val_data(:,:,[3 2 1])),...Histeq (test_data(:,:,[3 2 1]))},...BorderSize = 10,写成BackgroundColor =“白色”)标题(训练、验证和测试图像的RGB组件(从左到右))
ヒストグラム均等化を行った学習デタの最後の3のチャネルを,ジュとして表示します。これらのチャネルは,近赤外帯域に対応します。熱の痕跡に基づいて,。たとえば2番目のチャネルイメージの中央にある木は,他の2つのチャネルの木より詳しく表示されます。
图蒙太奇(...{histeq (train_data (:: 4)), histeq (train_data (:,:, 5)), histeq (train_data (:,: 6)},...BorderSize = 10,写成BackgroundColor =“白色”)标题(训练图像IR通道1、2、3(从左到右))
チャネル7は有効なセグメンテ,ション領域を示すマスクです。学習メジ,検証ジのマスクを表示します。
图蒙太奇(...{train_data (:: 7), val_data (:,: 7), test_data (:,: 7)},...BorderSize = 10,写成BackgroundColor =“白色”)标题(训练、验证和测试图像掩码(从左到右))
グラウンドトゥル,スラベルの可視化
ラベル付きイメージには,セグメンテーション用のグラウンドトゥルースデータが含まれ,それぞれのピクセルには18個のクラスのいずれかが割り当てられています。クラスとそれに対応するidのリストを取得します。
disp(类)
0.其他类/图像边界道路标志2。树3。建设4。交通工具(小汽车、卡车或公共汽车)6人。7号椅子。野餐桌8。9.黑木面板 White Wood Panel 10. Orange Landing Pad 11. Water Buoy 12. Rocks 13. Other Vegetation 14. Grass 15. Sand 16. Water (Lake) 17. Water (Pond) 18. Asphalt (Parking Lot/Walkway)
クラス名のベクトルを作成します。
classNames = [“路标”,“树”,“建筑”,“汽车”,“人”,...“LifeguardChair”,“PicnicTable”,“BlackWoodPanel”,...“WhiteWoodPanel”,“OrangeLandingPad”,“浮”,“石头”,...“LowLevelVegetation”,“Grass_Lawn”,“Sand_Beach”,...“Water_Lake”,“Water_Pond”,“沥青”];
ヒストグラム均等化を行ったRGB学習メジにラベルを重ね合わせます。カラバをメジに追加します。
cmap = jet(编号(classNames));B = labeloverlay(histeq(train_data(:,:,4:6)),train_labels,透明度=0.8,Colormap=cmap);图imshow(B)标题(“培训”标签) N = number (classNames);ticks = 1/(N*2):1/N:1;colorbar (TickLabels = cellstr(类名),蜱虫=蜱虫,TickLength = 0, TickLabelInterpreter =“没有”);colormap城市规划机构(cmap)
セマンティックセグメンテ,ションの実行
事前学習済みのU-Netネットワ,クをダウンロ,ドします。
trainedUnet_url =“//www.tatmou.com/金宝appsupportfiles/vision/data/multispectralUnet.mat”;downloadTrainedNetwork (trainedUnet_url dataDir);负载(fullfile (dataDir“multispectralUnet.mat”));
学習済みネットワ,クでセマンティックセグメンテ,ションを実行するには,補助関数segmentMultispectralImage
と検証デ,タを使用します。この関数は,この例にサポ,トファ,ルとして添付されています。関数segmentMultispectralImage
は,関数semanticseg
(计算机视觉工具箱)を使用してメジパッチのセグメンテションを実行します。この。
predictPatchSize = [1024 1024];segmentedImage = segmentMultispectralImage(val_data,net,predictPatchSize);
セグメンテーションの有効な部分だけを抽出するには,セグメント化されたイメージに検証データのマスクチャネルを乗算します。
segmentedImage = uint8(val_data(:,:,7)~=0) .* segmentedImage;figure imshow(segmentedImage,[]) title(“分割图像”)
セマンティックセグメンテションの出力にはノズが多く含まれます。@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @関数medfilt2
を使用して,セグメンテ,ションからごま塩ノ,ズを取り除きます。ノ@ @ズが除去され,セグメント化された@ @メ@ @ジを可視化します。
segmentedImage = medfilt2(segmentedImage,[7,7]);imshow (segmentedImage []);标题(“去除噪声的分割图像”)
ヒストグラム均等化を行ったRGB検証メジにセグメント化されたメジを重ね合わせます。
B = labeloverlay(histeq(val_data(:,:,[3 2 1])),segmentedImage,透明度=0.8,Colormap=cmap);图imshow(B)标题(“标记分段图像”) colorbar (TickLabels = cellstr(类名),蜱虫=蜱虫,TickLength = 0, TickLabelInterpreter =“没有”);colormap城市规划机构(cmap)
植被率の計算
セマンティックセグメンテーションの結果を使用して,関連する生態系に関する質問に答えることができます。たとえば,植生に覆われている土地の割合を知りたいとします。この質問に答えるには,植生としてラベル付けされたピクセルの数を求めます。ラベルID 2(“树木”)、13日(“LowLevelVegetation”)および14 (Grass_Lawn)は植生のクラスです。またマスクイメージのROIのピクセル数を合計することにより,有効なピクセル数の合計を求めます。
vegetationClassIds = uint8([2,13,14]);vegetationPixels = ismember(segmentedImage(:),vegetationClassIds);validPixels = (segmentedImage~=0);numVegetationPixels = sum(vegetationPixels(:));numValidPixels = sum(validPixels(:));
植被率は,植生のピクセルの数を有効なピクセルの数で除算して計算されます。
percentVegetationCover = (numVegetationPixels/numValidPixels)*100;流(“植被覆盖率为%3.2f%%。”, percentVegetationCover);
植被覆盖率为51.72%。
この例の残りの部分では,哈姆林海滩データセットでU-Netに学習させる方法を示します。
学習用ランダムパッチ抽出デ,タストアの作成
ランダムパッチ抽出デ,タストアを使用して,ネットワ,クに学習デ,タを供給します。このデータストアは,グラウンドトゥルースイメージとピクセルラベルデータを含むイメージデータストアとピクセルラベルデータストアから,対応する複数のランダムパッチを抽出します。パッチは,大きなイメージに対するメモリ不足を防ぎ,利用可能な学習データの量を効果的に増やすための一般的な手法です。
まず,imageDatastore
で”train_data.mat”
から学習▪▪メ▪▪ジを読み込みます。垫ファイル形式は非標準イメージ形式であるため,イメージデータを読み取るために垫ファイルリーダーを使用しなければなりません。学習データから最初の6つのチャネルを抽出し,マスクを含む最後のチャネルを除外する補助垫ファイルリーダーmatRead6Channels
を使用できます。この関数は,この例にサポ,トファ,ルとして添付されています。
imds = imageDatastore(“train_data.mat”FileExtensions =“.mat”ReadFcn = @matRead6Channels);
pixelLabelDatastore
(计算机视觉工具箱)を作成して,18個のラベル付き領域を含むラベルパッチを格納します。
pixelLabelIds = 1:18;pxds = pixelLabelDatastore(“train_labels.png”一会,pixelLabelIds);
イメージデータストアとピクセルラベルデータストアからrandomPatchExtractionDatastore
を作成します。それぞれのミニバッチには,サesc escズが256 × 256ピクセルの16個のパッチが含まれます。エポックのそれぞれの反復で,1000個のミニバッチが抽出されます。
dsTrain = randompatchextracactiondatastore (imds,pxds,[256,256],PatchesPerImage=16000);
ランダムパッチ抽出デ,タストアdsTrain
は,エポックの各反復でデ,タのミニバッチをネットワ,クに渡します。デ,タストアをプレビュ,してデ,タを調査します。
inputBatch =预览(dsTrain);disp (inputBatch)
InputImage ResponsePixelLabelImage __________________ _______________________ { 256×256×6 uint16}{256×256分类}{256×256×6 uint16}{256×256分类}{256×256×6 uint16}{256×256分类}{256×256×6 uint16}{256×256分类}{256×256×6 uint16}{256×256分类}{256×256×6 uint16}{256×256分类}{256×256×6 uint16}{256×256分类}{256×256×6 uint16}{256×256分类}
U-Netネットワ,ク層の作成
この例ではU-Netネットワ,クのバリエ,ションを使用します。U-Netでは,最初の一連の畳み込み層に最大プーリング層が点在し,入力イメージの解像度を逐次下げていきます。これらの層に,一連の畳み込み層が続き,その中にアップサンプリング演算処理が点在し,入力イメージの解像度を逐次上げていきます[2]。U- netの名前は,このネットワ,クが文字“U”のように対称の形状で描けることに由来しています。
この例では,畳み込みに対する入力と出力が同じサイズになるように,U-Netを変更して,畳み込みでゼロパディングを使用します。補助関数createUnet
を使用して,数個のハパパラメタが事前に選択されたU-Netを作成します。この関数は,この例にサポ,トファ,ルとして添付されています。
inputTileSize = [256,256,6];lgraph = createUnet(inputTileSize);disp (lgraph.Layers)
58×1带有图层的图层数组:1“ImageInputLayer”图像输入256×256×6图片2的zerocenter正常化Encoder-Section-1-Conv-1二维卷积64 3×3×6旋转步[1]和填充[1 1 1 1]3‘Encoder-Section-1-ReLU-1 ReLU ReLU 4 Encoder-Section-1-Conv-2二维卷积64 3×3×64旋转步[1]和填充[1 1 1 1]5‘Encoder-Section-1-ReLU-2 ReLU ReLU 6“Encoder-Section-1-MaxPool”二维最大池2×2马克斯池步[2 2]和填充[0 0 0 0]7Encoder-Section-2-Conv-1二维卷积128 3×3×64旋转步[1]和填充(1 1 1)8“Encoder-Section-2-ReLU-1”ReLU ReLU 9 Encoder-Section-2-Conv-2二维卷积128 3×3×128旋转步[1]和填充[1 1 1 1]10 ' Encoder-Section-2-ReLU-2 ReLU ReLU 11“Encoder-Section-2-MaxPool”二维最大池2×2马克斯池步(2 - 2)和填充[0 0 0 0]12“Encoder-Section-3-Conv-1”二维卷积256 3×3×128旋转步[1]和填充[1 1 1 1] 13的Encoder-Section-3-ReLU-1 ReLU ReLU 14 Encoder-Section-3-Conv-2二维卷积256 3×3×256旋转步[1]和填充[1 1 1 1]15 ' Encoder-Section-3-ReLU-2 ReLU ReLU 16“Encoder-Section-3-MaxPool”二维最大池2×2马克斯池步(2 - 2)和填充[0 0 0 0]17 Encoder-Section-4-Conv-1二维卷积512 3×3×256旋转步[1]和填充[1 1 1 1]18 ' Encoder-Section-4-ReLU-1 ReLU ReLU 19 Encoder-Section-4-Conv-2二维卷积512 3×3×512 convolutions with stride [1 1] and padding [1 1 1 1] 20 'Encoder-Section-4-ReLU-2' ReLU ReLU 21 'Encoder-Section-4-DropOut' Dropout 50% dropout 22 'Encoder-Section-4-MaxPool' 2-D Max Pooling 2×2 max pooling with stride [2 2] and padding [0 0 0 0] 23 'Mid-Conv-1' 2-D Convolution 1024 3×3×512 convolutions with stride [1 1] and padding [1 1 1 1] 24 'Mid-ReLU-1' ReLU ReLU 25 'Mid-Conv-2' 2-D Convolution 1024 3×3×1024 convolutions with stride [1 1] and padding [1 1 1 1] 26 'Mid-ReLU-2' ReLU ReLU 27 'Mid-DropOut' Dropout 50% dropout 28 'Decoder-Section-1-UpConv' 2-D Transposed Convolution 512 2×2×1024 transposed convolutions with stride [2 2] and cropping [0 0 0 0] 29 'Decoder-Section-1-UpReLU' ReLU ReLU 30 'Decoder-Section-1-DepthConcatenation' Depth concatenation Depth concatenation of 2 inputs 31 'Decoder-Section-1-Conv-1' 2-D Convolution 512 3×3×1024 convolutions with stride [1 1] and padding [1 1 1 1] 32 'Decoder-Section-1-ReLU-1' ReLU ReLU 33 'Decoder-Section-1-Conv-2' 2-D Convolution 512 3×3×512 convolutions with stride [1 1] and padding [1 1 1 1] 34 'Decoder-Section-1-ReLU-2' ReLU ReLU 35 'Decoder-Section-2-UpConv' 2-D Transposed Convolution 256 2×2×512 transposed convolutions with stride [2 2] and cropping [0 0 0 0] 36 'Decoder-Section-2-UpReLU' ReLU ReLU 37 'Decoder-Section-2-DepthConcatenation' Depth concatenation Depth concatenation of 2 inputs 38 'Decoder-Section-2-Conv-1' 2-D Convolution 256 3×3×512 convolutions with stride [1 1] and padding [1 1 1 1] 39 'Decoder-Section-2-ReLU-1' ReLU ReLU 40 'Decoder-Section-2-Conv-2' 2-D Convolution 256 3×3×256 convolutions with stride [1 1] and padding [1 1 1 1] 41 'Decoder-Section-2-ReLU-2' ReLU ReLU 42 'Decoder-Section-3-UpConv' 2-D Transposed Convolution 128 2×2×256 transposed convolutions with stride [2 2] and cropping [0 0 0 0] 43 'Decoder-Section-3-UpReLU' ReLU ReLU 44 'Decoder-Section-3-DepthConcatenation' Depth concatenation Depth concatenation of 2 inputs 45 'Decoder-Section-3-Conv-1' 2-D Convolution 128 3×3×256 convolutions with stride [1 1] and padding [1 1 1 1] 46 'Decoder-Section-3-ReLU-1' ReLU ReLU 47 'Decoder-Section-3-Conv-2' 2-D Convolution 128 3×3×128 convolutions with stride [1 1] and padding [1 1 1 1] 48 'Decoder-Section-3-ReLU-2' ReLU ReLU 49 'Decoder-Section-4-UpConv' 2-D Transposed Convolution 64 2×2×128 transposed convolutions with stride [2 2] and cropping [0 0 0 0] 50 'Decoder-Section-4-UpReLU' ReLU ReLU 51 'Decoder-Section-4-DepthConcatenation' Depth concatenation Depth concatenation of 2 inputs 52 'Decoder-Section-4-Conv-1' 2-D Convolution 64 3×3×128 convolutions with stride [1 1] and padding [1 1 1 1] 53 'Decoder-Section-4-ReLU-1' ReLU ReLU 54 'Decoder-Section-4-Conv-2' 2-D Convolution 64 3×3×64 convolutions with stride [1 1] and padding [1 1 1 1] 55 'Decoder-Section-4-ReLU-2' ReLU ReLU 56 'Final-ConvolutionLayer' 2-D Convolution 18 1×1×64 convolutions with stride [1 1] and padding [0 0 0 0] 57 'Softmax-Layer' Softmax softmax 58 'Segmentation-Layer' Pixel Classification Layer Cross-entropy loss
学習オプションの選択
モメンタム項付き確率的勾配降下(sgdm)最適化を使用してネットワクに学習させます。関数trainingOptions
(深度学习工具箱)を使用してSGDM用ハパパラメタ設定を指定します。
深いネットワ,クの学習には時間がかかります。高い学習率を指定して学習を加速します。ただし,これによりネットワークの勾配が発散つまり制御できないほど増大し,ネットワークを正常に学習させることができない場合があります。勾配を意味のある範囲に維持するには,”GradientThreshold”
を0.05
として指定することで勾配のクリップを有効にし,”GradientThresholdMethod”
を指定して勾配のl2ノルムを使用します。
initialLearningRate = 0.05;maxEpochs = 150;minibatchSize = 16;L2reg = 0.0001;选项= trainingOptions(“个”,...InitialLearnRate = initialLearningRate,...动量= 0.9,...L2Regularization = l2reg,...MaxEpochs = MaxEpochs,...MiniBatchSize = MiniBatchSize,...LearnRateSchedule =“分段”,...洗牌=“every-epoch”,...GradientThresholdMethod =“l2norm”,...GradientThreshold = 0.05,...情节=“训练进步”,...VerboseFrequency = 20);
ネットワ,クの学習または事前学習済みネットワ,クのダウンロ,ド
ネットワ,クに学習させるには,次のコ,ドで変数doTraining
を真正的
に設定します。関数trainNetwork
(深度学习工具箱)を使用して,モデルに学習させます。
Gpuが利用できる場合,Gpuで学習を行います。GPUを使用するには,并行计算工具箱™,およびCUDA®対応のNVIDIA GPU®が必要です。詳細にいては,Gpu計算の要件(并行计算工具箱)を参照してください。学習にはNVIDIA Titan Xで約20時間を要します。
doTraining = false;如果doTraining net = trainNetwork(dsTrain,lgraph,options);modelDateTime = string(datetime(“现在”格式=“yyyy-MM-dd-HH-mm-ss”));保存(fullfile (dataDir“multispectralUnet——”+ modelDateTime +“.mat”),“净”);结束
セグメンテ,ションの精度の評価
検証デ,タをセグメント化します。
segmentedImage = segmentMultispectralImage(val_data,net,predictPatchSize);
セグメント化された▪▪メ▪▪ジとグラウンドトゥル▪スラベルをPNGファ▪▪ルとして保存します。この例では,これらのファ。
imwrite (segmentedImage“results.png”);imwrite (val_labels“gtruth.png”);
pixelLabelDatastore
(计算机视觉工具箱)を使用して,セグメンテ,ションの結果とグラウンドトゥル,スを読み込みます。
pxdsResults = pixelLabelDatastore(“results.png”一会,pixelLabelIds);pxdsTruth = pixelLabelDatastore(“gtruth.png”一会,pixelLabelIds);
関数evaluateSemanticSegmentation
(计算机视觉工具箱)を使用して,セマンティックセグメンテ,ションのグロ,バル精度を測定します。
ssm = evaluateSemanticSegmentation(pxdsResults,pxdsTruth,Metrics=“global-accuracy”);
评估语义分割结果 ---------------------------------------- * 所选指标:全球精度。*处理1张图像。*完成……完成了。*数据集指标:GlobalAccuracy ______________ 0.90411
グローバル精度のスコアは,正しく分類されたピクセルの割合が90%をわずかに超えていることを示しています。
参考文献
[1] Kemker, R., C. Salvaggio, C. Kanan。用于语义分割的高分辨率多光谱数据集CoRR, abs/1703.01918, 2017。
[2]罗内伯格,O. P.费舍尔和T.布罗克斯。U-Net:用于生物医学图像分割的卷积网络, abs / 1505.04597。2015.
Kemker, Ronald, Carl Salvaggio和Christopher Kanan。基于深度学习的多光谱遥感图像语义分割算法ISPRS摄影测量与遥感杂志,深度学习RS数据,145(2018年11月1日):60-77。https://doi.org/10.1016/j.isprsjprs.2018.04.014。
参考
trainingOptions
(深度学习工具箱)|trainNetwork
(深度学习工具箱)|randomPatchExtractionDatastore
|pixelLabelDatastore
(计算机视觉工具箱)|semanticseg
(计算机视觉工具箱)|evaluateSemanticSegmentation
(计算机视觉工具箱)|imageDatastore
|histeq
|unetLayers
(计算机视觉工具箱)
関連するトピック
- 深層学習を使用したセマンティックセグメンテ,ション入門(计算机视觉工具箱)
- 深層学習を使用したセマンティックセグメンテ,ション(计算机视觉工具箱)
- 深層学習用のデ,タストア(深度学习工具箱)