主要内容

このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

深層学習を使用したセマンティックセグメンテ,ション

この例では,深層学習を使用してセマンティックセグメンテーションネットワークの学習を行う方法を説明します。

セマンティックセグメンテーションネットワークはイメージ内のすべてのピクセルを分類して,クラスごとにセグメント化されたイメージを作成します。セマンティックセグメンテ,ションの応用例としては、自動運転のための道路セグメンテーションや医療診断のための癌細胞セグメンテーションなどがあります。詳細は、深層学習を使用したセマンティックセグメンテ,ション入門(计算机视觉工具箱)を参照してください。

学習手順を示すために,この例では,セマンティックイメージセグメンテーション用に設計された1つのタイプの畳み込みニューラルネットワーク(CNN)であるDeeplab v3 +[1]に学習させます。他のタイプのセマンティックセグメンテーションネットワークには,完全畳み込みネットワーク(FCN) SegNet, U-Netなどがあります。ここで示す学習手順は,これらのネットワ,クにも適用することができます。

この例では,学習用に剑桥大学のCamVidデ,タセット[2]を使用します。このデ,タセットは,運転中に得られた路上レベルでのビュ,が含まれる,メ,ジコレクションです。データセットは、車歩行者,道路を含む32個のセマンティッククラスについてピクセルレベルのラベルを提供します。

設定

この例では,事前学習済みのResnet-18ネットワークから初期化された重みを使用してDeeplab v3 +ネットワークを作成します。ResNet-18は,処理するリソ,スが限られている用途に非常に適した効率的なネットワ,クです。用途の要件によって,MobileNet v2やResNet-50など,その他の事前学習済みのネットワークも使用できます。詳細は,事前学習済みの深層ニュ,ラルネットワ,クを参照してください。

事前学習済みのResnet-18を入手するには,resnet18を▪▪ンスト▪▪ルします。。

resnet18 ();

さらに,事前学習済みのバ,ジョンのDeepLab v3+をダウンロ,ドします。事前学習済みのモデルを使用することで,学習の完了を待ことなく例全体を実行することができます。

pretrainedURL =“//www.tatmou.com/金宝appsupportfiles/vision/data/deeplabv3plusResnet18CamVid.mat”;pretrainedFolder = fullfile(tempdir,“pretrainedNetwork”);pretrainedNetwork = fullfile(pretrainedFolder,“deeplabv3plusResnet18CamVid.mat”);如果~存在(pretrainedNetwork“文件”mkdir (pretrainedFolder);disp (“下载预训练的网络(58 MB)…”);websave (pretrainedNetwork pretrainedURL);结束

この例を実行するには,cuda対応nvidia™gpuの使用が強く推奨されます。GPUを使用するには并行计算工具箱™が必要です。サポトされる计算能力の詳細にいては,リリス別のgpuサポト(并行计算工具箱)を参照してください。

CamVidデ,タセットのダウンロ,ド

次のURLからCamVidデ,タセットをダウンロ,ドします。

imageURL =“http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/files/701_StillsRaw_full.zip”;labelURL =“http://web4.cs.ucl.ac.uk/staff/g.brostow/MotionSegRecData/data/LabeledApproved_full.zip”;outputFolder = fullfile(tempdir,“CamVid”);labelsZip = fullfile(输出文件夹,“labels.zip”);imagesZip = fullfile(输出文件夹,“images.zip”);如果~存在(labelsZip“文件”) || ~exist(imagesZip,“文件”mkdir(输出目录)“正在下载16mb CamVid数据集标签……”);websave (labelsZip labelURL);解压缩(labelsZip fullfile (outputFolder“标签”));disp (“正在下载557 MB CamVid数据集图像……”);websave (imagesZip imageURL);解压缩(imagesZip fullfile (outputFolder“图片”));结束

メモ:デタのダウンロドにかかる時間はンタネット接続の速度によって異なります。上記で使用したコマンドは,ダウンロ,ドが完了するまでmatlabをブロックします。別の方法として、Webブラウザーを使用して,データセットをローカルディスクにまずダウンロードしておくことができます。Webからダウンロ,ドしたファ,ルを使用するには,上記の変数outputFolderの値を,ダウンロ,ドしたファ,ルの場所に変更します。

CamVid转换器メ,ジの読み込み

imageDatastoreを使用してCamVid转换器メ,ジを読み込みます。imageDatastoreは,ディスク上の大規模な。

imgDir = fullfile(输出文件夹,“图片”701 _stillsraw_full);imds = imageDatastore(imgDir);

1。

I = readimage(imds,559);I = histeq(I);imshow(我)

CamVidのピクセルラベル付きaapl . com

pixelLabelDatastore(计算机视觉工具箱)を使用して,CamVidのピクセルラベル。pixelLabelDatastoreは,ピクセルラベルデ,タとラベルidをクラス名のマッピングにカプセル化します。

学習を容易にするために,CamVidの元の32個のクラスを11個のクラスにグループ化します。次のクラスを指定します。

类= [“天空”“建筑”“极”“路”“路面”“树”“SignSymbol”“篱笆”“汽车”“行人”“自行车”];

32個のクラスを11個に減らすには,元のデータセットの複数のクラスをグループとしてまとめます。たとえば,“汽车”,“SUVPickupTruck”、“Truck_Bus”,“火车”,および“OtherMovingを組み合わせたものを“车”とします。この例の最後にリストされているサポ,ト関数camvidPixelLabelIDsを使用することで,グル,プ化されたラベルidが返されます。

labelIDs = camvidPixelLabelIDs();

クラスとラベルidを使用してpixelLabelDatastore。を作成します。

labelDir = fullfile(输出文件夹,“标签”);pxds = pixelLabelDatastore(labelDir,classes,labelIDs);

イメージの上に重ね合わせることで,ピクセルラベル付きイメージのうちの1つを読み取って表示します。

C = readimage(pxds,559);cmap = camvidColorMap;B = labeloverlay(I,C,“ColorMap”,提出);imshow (B) pixelLabelColorbar(提出、类);

色の重ね合わせが存在しない領域にはピクセルラベルはなく,学習中は使用されません。

デ,タセット統計の解析

CamVidデ,タセット内のクラスラベルの分布を表示するには,countEachLabel(计算机视觉工具箱)を使用します。この関数は,クラスラベル別にピクセルの数をカウントします。

tbl = countEachLabel(pxds)
台=11×3表名称PixelCount ImagePixelCount ______________ __________ _______________{'天空'}7.6801e+07 4.8315e+08{'建筑物'}1.1737e+08 4.8315e+08{'杆'}4.7987e+ 08 4.8453e+08{'道路'}3.4054e +08 4.8453e+08{'树'}5.4259e+07 4.4209e +08{'标志'}5.2242e+06 4.6863e+08{'围栏'}6.9211e+06 2.516e+08{'行人'}3.4029e+06 4.4444e+08{'骑车人'}2.5912e+06 2.6196e+08

ピクセル数をクラス別に可視化します。

frequency = tbl.PixelCount/sum(tbl.PixelCount);bar(1:numel(classes),frequency) xticks(1:numel(classes)) xticklabels(tb . name) xtickangle(45) ylabel(“频率”

観測値の数がすべてのクラスで等しいことが理想的です。しかし,CamVid内のクラスは不均衡です。これは,路上シ,ンの自動車デ,タセットに共通する問題です。こうしたシーンには,歩行者や自転車運転者のピクセルよりも多くの空,建物,および道路のピクセルが含まれます。これは,空,建物,および道路が。学習では上位クラスを優先してバイアスがかけられるため,正しく処理されていない場合は,こうした不均衡が学習プロセスに悪影響を及ぼす可能性があります。この例の後半では,クラスの重み付けを使用してこの問題に対処します。

CamVidデタセット内のメジのサズは720 × 960です。イメージサイズは12 GBのメモリ搭載のNVIDIA™泰坦Xでの学習時に,イメージの十分な大きさのバッチがメモリに収まるように選択されます。GPUに十分なメモリがない場合には,イメージをより小さいサイズに変更するか,学習バッチのサイズを小さくする必要があります。

学習セット,検証セット,およびテストセットの準備

Deeplab v3+の学習には,デタセットのメジの60%が使用されます。残りの▪▪メ▪▪ジは均等に20%ず▪▪に分割され,検証とテストにそれぞれ20%が使用されます。次のコードでは,イメージとピクセルラベルデータを学習セット,検証セット,およびテストセットに無作為に分割します。

[imdsTrain, imdsVal, imdsTest, pxdsTrain, pxdsVal, pxdsTest] = partitionCamVidData(imds,pxds);

60対20対20に分割すると,学習イメージ,検証イメージ,およびテストイメージの数が次のようになります。

numTrainingImages = nummel (imdsTrain.Files)
numTrainingImages = 421
numValImages = nummel (imdsVal.Files)
numValImages = 140
numTestingImages = nummel (imdste . files)
numTestingImages = 140

ネットワ,クの作成

関数deeplabv3plusLayersを使用して,ResNet-18に基づいてDeepLab v3+ネットワ,クを作成します。用途に最適なネットワークを選択することは,経験的解析が必要であり,別のレベルのハイパーパラメーター調整です。たとえば,ResNet-50やMobileNet v2などの異なる基本ネットワークで試すか,またはSegNet,完全畳み込みネットワーク(FCN) U-Netなどの他のセマンティックセグメンテーションネットワークアーキテクチャを試すことができます。

指定网络映像大小。这通常与训练图像大小相同。imageSize = [720 960 3];指定类的数量。numClasses = nummel(类);创建DeepLab v3+。lgraph = deeplabv3plusLayers(imageSize, numClasses,“resnet18”);

クラスの重み付けを使用したクラスのバランス調整

前に示したように,CamVid内のクラスはバランスがとれていません。学習を改善するために,クラスの重み付けを使用してクラスのバランスを調整することができます。前にcountEachLabel(计算机视觉工具箱)を使用して計算したピクセルラベルのカウントを使用して,中央頻度クラスの重みを計算します。

imageFreq = tbl。PixelCount ./ tb . imagepixelcount;classWeights = median(imageFreq) ./ imageFreq ./
classWeights =11×10.3182 0.2082 5.0924 0.1744 0.7103 0.4175 4.5371 1.8386 1.0000 6.6059 \

pixelClassificationLayer(计算机视觉工具箱)を使用してクラスの重みを指定します。

pxLayer = pixelClassificationLayer(“名字”“标签”“类”资源描述。名字“ClassWeights”, classWeights);lgraph =替换层(lgraph,“分类”, pxLayer);

学習オプションの選択

学習に使用される最適化アルゴリズムはモ,メンタム項付き確率的勾配降下法(sgdm)です。trainingOptionsを使用して,sgdmに使用されるハパパラメタを指定します。

定义验证数据。dsVal = combine(imdsVal,pxdsVal);定义培训选项。选项= trainingOptions(“个”...“LearnRateSchedule”“分段”...“LearnRateDropPeriod”10...“LearnRateDropFactor”, 0.3,...“动量”, 0.9,...“InitialLearnRate”1 e - 3,...“L2Regularization”, 0.005,...“ValidationData”dsVal,...“MaxEpochs”30岁的...“MiniBatchSize”8...“洗牌”“every-epoch”...“CheckpointPath”tempdir,...“VerboseFrequency”2,...“阴谋”“训练进步”...“ValidationPatience”4);

学習率には区分的なスケジュ,ルが使用されます。学習率は10エポックごとに0.3ず減少します。これにより,ネットワークはより高い初期学習率で高速に学習することができる一方で,学習率が低下すると,局所的最適値に近い解を求めることができます。

“ValidationData”パラメーターを設定することによって,すべてのエポックで検証データに対してネットワークのテストが行われます。“ValidationPatience”は4に設定されており,検証精度が収束すると学習が早期に停止します。これにより,学習デ,タセットに対するネットワ,クの過適合を防ぎます。

ミニバッチのサesc escズ8を使用して,学習中のメモリ使用量を削減します。この値は,システムに搭載されているgpuメモリの量に応じて増減させることができます。

また,“CheckpointPath”は一時的な場所に設定されています。この名前と値のペアを設定すると,各学習エポックの終わりにネットワークチェックポイントを保存できます。システム障害や停電で学習が中断された場合に,保存したチェックポ。“CheckpointPath”で指定された場所に,ネットワークチェックポイントを保存するのに十分なスペースがあることを確認します。100年たとえば個のDeeplab v3 +チェックポイントを保存する場合,各チェックポイントが61 MBであるため,約6 GBのディスク領域が必要です。

デ,タ拡張

デ,タ拡張は,学習中に元のデ,タをランダムに変換してネットワ,クの精度を高めるために使用されます。デ,タ拡張を使用すると、ラベル付き学習サンプルの数を増やさずに、学習データをさらに多様化させることができます。イメージとピクセル ラベル データの両方に同じランダム変換を適用するには、データストアに结合变换を使用します。まず,imdsTrainpxdsTrainを統合します。

dsTrain = combine(imdsTrain, pxdsTrain);

次に,デ,タストアに变换を使用して,サポ,ト関数augmentImageAndLabelで定義されている目的のデ,タ拡張を適用します。ここでは,データ拡張に対して+ / - 10ピクセルのランダムな左/右反射とランダムなX / Y平行移動が使用されます。

xTrans = [-10 10];yTrans = [-10 10];dsTrain = transform(dsTrain, @(data)augmentImageAndLabel(data,xTrans,yTrans));

デ,タ拡張は,テストデ,タと検証デ,タには適用されないことに注意してください。理想的には,テストデータと検証データは元のデータを代表するもので,バイアスのない評価を行うために変更なしで使用されなければなりません。

学習の開始

doTrainingフラグが真实の場合,trainNetworkを使用して学習を開始します。そうでない場合は,事前学習済みのネットワ,クを読み込みます。

メモ:この学習は12 GBのGPUメモリ搭載のNVIDIA™泰坦Xで検証済みです。Gpuのメモリがこれより少ない場合,学習時にメモリ不足が発生する可能性があります。これが発生する場合は,trainingOptions“MiniBatchSize”を1に設定するか,ネットワク入力を減らして学習デタのサズを変更してみてください。このネットワ,クに学習させるには,約5時間かかります。Gpuハ,ドウェアによっては,さらに時間がかかる場合があります。

doTraining = false;如果doTraining [net, info] = trainNetwork(dsTrain,lgraph,options);其他的data = load(pretrainedNetwork);Net = data.net;结束

1 .

迅速な正常性チェックとして,1のテスト。

I = readimage(imdsTest,35);C = semanticseg(I, net);

結果を表示します。

B = labeloverlay(I,C,“Colormap”提出,“透明”, 0.4);imshow(B) pixelLabelColorbar(cmap, classes);

Cでの結果と,pxdsTestに格納されている予想されるグラウンドトゥル,スを比較します。緑とマゼンタの領域は,セグメンテーション結果が予想されるグラウンドトゥルースと異なる領域を強調表示しています。

expectedResult = readimage(pxdsTest,35);实际= uint8(C);expect = uint8(expectedResult);预计imshowpair(实际)

視覚的には,道路,空,建物などのクラスのセマンティックセグメンテーションの結果は適切にオーバーラップしてます。しかし,歩行者や車のような小さいオブジェクトはそれほど正確ではありません。クラスごとのオーバーラップ量は,ジャカードインデックスとしても知られている交集在联盟(借据)メトリクスを使用して測定できます。関数jaccard(图像处理工具箱)を使用して欠条を測定します。

iou = jaccard(C,expectedResult);表(类、借据)
ans =11×2表类iou ____________ _______“天空”0.91837“建筑”0.84479“极点”0.31203“道路”0.93698“路面”0.82838“树”0.89636“标志符号”0.57644“围栏”0.71046“汽车”0.66688“行人”0.48417“骑自行车的人”0.68431

借条メトリクスでは視覚的な結果を確認できます。道路、空、建物クラスの借据スコアは高く,一方で歩行者や自動車などのクラスのスコアは低くなります。その他の一般的なセグメンテ,ションメトリクスには,骰子(图像处理工具箱)bfscore(图像处理工具箱)の輪郭マッチングスコアなどがあります。

学習済みネットワ,クの評価

複数のテストsemanticseg(计算机视觉工具箱)を実行します。ミニバッチのサaapl . exe .ズ4を使用して,aapl . exe .メ。この値は,システムに搭載されているgpuメモリの量に応じて増減させることができます。

pxdsResults = semanticseg(imdsTest,net,...“MiniBatchSize”4...“WriteLocation”tempdir,...“详细”、假);

semanticsegはテストセットに対する結果をpixelLabelDatastoreオブジェクトとして返します。imdsTest内の各テストメジの実際のピクセルラベルデタは,“WriteLocation”パラメ,タ,で指定された場所にあるディスクに書き込まれます。evaluateSemanticSegmentation(计算机视觉工具箱)を使用して,テストセット結果のセマンティックセグメンテ,ションメトリクスを測定します。

metrics = evaluateSemanticSegmentation(pxdsResults,pxdsTest, pxdsTest)“详细”、假);

evaluateSemanticSegmentationは,デタセット全体,個々のクラス,各テストメジに関するさまざまなメトリクスを返します。デ,タセットレベルのメトリクスを確認するには,指标。DataSetMetricsを検査します。

指标。DataSetMetrics
ans =表1×5GlobalAccuracy MeanAccuracy MeanIoU WeightedIoU MeanBFScore  ______________ ____________ _______ ___________ ___________ 0.87695 0.85392 0.6302 0.80851 0.65051

デ,タセットメトリクスは,ネットワ,クパフォ,マンスに関する大まかな概要を示します。各クラスがパフォ,マンス全体に与える影響を確認するには,指标。ClassMetricsを使用してクラスごとのメトリクスを検査します。

指标。ClassMetrics
ans =11×3表精度IoU平均bfscore ________ _______ ___________天空0.93112 0.90209 0.8952建筑物0.78453 0.76098 0.58511极点0.71586 0.21477 0.51439道路0.93024 0.91465 0.76696路面0.88466 0.70571 0.70919树木0.87377 0.76323 0.70875标志符号0.79358 0.39309 0.48302围栏0.81507 0.46484 0.48566汽车0.90956 0.76799 0.69233行人0.87629 0.4366 0.60792自行车0.87844 0.60829 0.55089

デ,タセット全体のパフォ,マンスは非常に高いですが,クラスメトリクスは,行人骑自行车といった少数しか存在しないクラスは天空建筑などのクラスと同じようにうまくセグメント化されていないことを示しています。少数しか存在しないクラスのサンプルが多く含まれているデータが追加されることで,結果が改善する可能性があります。

サポ,ト関数

函数labelIDs = camvidPixelLabelIDs()返回每个类对应的标签id。CamVid数据集有32个类。把他们分成11个类%原始SegNet训练方法[1]。这11个类是:%的“天空”“建筑”,“极”,“路”,“路面”、“树”、“SignSymbol”,“栅栏”、“汽车”、“行人”和“骑自行车的人”。CamVid像素标签id作为RGB颜色值提供。把它们分成% 11类,并将它们作为m × 3矩阵的单元格数组返回。的%原始CamVid类名与每个RGB值一起列出。请注意%,其他/Void类被排除在下面。labelIDs = {...%的“天空”[128 128 128;...%的“天空”%“建设”[000 128 064;...%“桥”12.80万;...%“建设”064 192 000;...%的“墙”064 000 064;...%的“隧道”192 000 128;...%的“拱门”%“极”[192 192 128;...%”Column_Pole”064;...%”TrafficCone”%的道路[128 064 128;...%的“路”128 000 192;...%”LaneMkgsDriv”192 000 064;...%”LaneMkgsNonDriv”%“路面”[000 000 192;...%“人行道”064 192 128;...%”ParkingBlock”128 128 192;...%”RoadShoulder”%的“树”[128 128 000;...%的“树”192 192 000;...%”VegetationMisc”%”SignSymbol”[192 128 128;...%”SignSymbol”128 128 064;...%”Misc_Text”000 064 064;...%”TrafficLight”%“栅栏”[064 064 128;...%“栅栏”%的“汽车”[064 000 128;...%的“汽车”064 128 192;...%”SUVPickupTruck”192 128 192;...%”Truck_Bus”192 064 128;...%“训练”128 064 064;...%”OtherMoving”%“行人”[064 064 000;...%“行人”192 128 064;...%的“孩子”064 000 192;...%”CartLuggagePram”064 128 064;...%的“动物”%“自行车”[000 128 192;...%“自行车”192 000 192;...%”MotorcycleScooter”]};结束
函数一会pixelLabelColorbar(提出)在当前轴上添加一个颜色条。颜色条被格式化%显示带有颜色的类名。甘氨胆酸colormap(提出)将色条添加到当前图形。C = colorbar(“对等”甘氨胆酸,);使用类名作为标记。c.TickLabels = classNames;numClasses = size(cmap,1);%中心打勾标签。c.Ticks = 1/(numClasses*2):1/numClasses:1;删除标记。c.TickLength = 0;结束
函数cmap = camvidColorMap()定义CamVid数据集使用的颜色图。Cmap = [128 128 128 128%的天空128 0 0%的建筑192 192 192%极128 64 128%的道路60 40 222%的人行道上128 128 0%的树192 128 128% SignSymbol64 64 128%的栅栏64 0 128%的车64 64 0%行人0 128 192%骑自行车];%在[0 1]之间归一化。Cmap = Cmap ./ 255;结束
函数[imdsTrain, imdsVal, imdsTest, pxdsTrain, pxdsVal, pxdsTest] = partitionCamVidData(imds,pxds)对CamVid数据进行分区,随机选取60%的数据进行训练。的% rest用于测试。设置初始随机状态,例如再现性。rng (0);numFiles = nummel (imds.Files);shuffledIndices = randperm(numFiles);使用60%的图像进行训练。numTrain = round(0.60 * numFiles);trainingIdx = shuffledIndices(1:numTrain);使用20%的图像进行验证numVal = round(0.20 * numFiles);valIdx = shuffledIndices(numTrain+1:numTrain+numVal);使用其余的测试。testdx = shuffledIndices(numTrain+numVal+1:end);为训练和测试创建图像数据存储。trainingImages = imds.Files(trainingIdx);valImages = imds.Files(valIdx);testImages = imds.Files(testdx);imdsTrain = imageDatastore(trainingImages);imdsVal = imageDatastore(valImages);imdsTest = imageDatastore(testImages);提取类和标签id信息。classes = pxds.ClassNames;labelIDs = camvidPixelLabelIDs();为训练和测试创建像素标签数据存储。trainingLabels = pxds.Files(trainingIdx);valLabels = pxds.Files(valIdx);testLabels = pxds.Files(testdx);pxdsTrain = pixelLabelDatastore(trainingLabels, classes, labelIDs);pxdsVal = pixelLabelDatastore(valLabels, classes, labelIDs);pxdsTest = pixelLabelDatastore(testLabels, classes, labelIDs);结束
函数data = augmentImageAndLabel(data, xTrans, yTrans)使用随机反射和增加图像和像素标签图像%的翻译。i = 1:size(data,1) tform = randomAffine2d(...“XReflection”,真的,...“XTranslation”xTrans,...“YTranslation”, yTrans);将视图置于输出空间中图像的中心%允许翻译将输出图像移出视图。rout = affineOutputView(size(data{i,1}), tform,“BoundsStyle”“centerOutput”);使用相同的变换扭曲图像和像素标签。数据{i,1} = imwarp(数据{i,1}, tform,“OutputView”,溃败);数据{i,2} = imwarp(数据{i,2}, tform,“OutputView”,溃败);结束结束

参考文献

[1]陈良杰等。用于语义图像分割的Atrous可分离卷积编码器-解码器。大会(2018)。

[2]布罗斯托,G. J.福克尔,R.西波拉。“视频中的语义对象类:高清地面真相数据库。”模式识别信.第30卷,第2期,2009年,pp 88-97。

参考

(计算机视觉工具箱)|(计算机视觉工具箱)|(计算机视觉工具箱)|(图像处理工具箱)|(计算机视觉工具箱)|(计算机视觉工具箱)|(计算机视觉工具箱)||||(计算机视觉工具箱)

関連するトピック