主要内容

“”“”“”“”“”“”“

この例では,セマンティックセグメンテーションネットワークを使用してイメージをセグメント化する方法を説明します。

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

この例では,まず,事前学習済みのDeeplab v3 +[1]ネットワークを使用してイメージをセグメント化する方法を説明します。これは,畳み込みニューラルネットワーク(CNN)の一種で,セマンティックイメージセグメンテーション用に設計されています。他のタイプのセマンティックセグメンテーションネットワークには,完全畳み込みネットワーク(FCN) SegNet, U-Netなどがあります。または,データセットをダウンロードし,転移学習を使用してDeeplab v3ネットワークに学習させることもできます。ここで示す学習手順は,他のタイプのセマンティックセグメンテーションネットワークにも適用することができます。

英国剑桥大学(University of CambridgeCamVid我不知道。。データセットは、車歩行者,道路を含む32個のセマンティッククラスについてピクセルレベルのラベルを提供します。

cuda英伟达™gpu。GPU:并行计算工具箱™计算能力:Gpu(并行计算工具箱)

事前学習済みのセマンティックセグメンテーションネットワークのダウンロード

CamVidデータセットで学習させた事前学習済みのバージョンのDeepLab v3 +をダウンロードします。

pretrainedURL =“https://ssd.mathworks.com/万博1manbetxsupportfiles/vision/data/deeplabv3plusResnet18CamVid.zip”;pretrainedFolder = fullfile(tempdir,“pretrainedNetwork”);pretrainedNetworkZip = fullfile(pretrainedFolder,“deeplabv3plusResnet18CamVid.zip”);如果~存在(pretrainedNetworkZip“文件”mkdir (pretrainedFolder);disp (“正在下载预训练网络(58 MB)…”);websave (pretrainedNetworkZip pretrainedURL);结束解压缩(pretrainedNetworkZip pretrainedFolder)

pretrainedNetwork = fullfile(pretrainedFolder,“deeplabv3plusResnet18CamVid.mat”);data = load(pretrainedNetwork);Net = data.net;

class = string(net.Layers(end).Classes)
类=11×1的字符串“天空”“建筑”“电线杆”“道路”“人行道”“树”“标志”“栅栏”“汽车”“行人”“骑自行车的人”

通灵!通灵!通灵!通灵!通灵

I = imread()“highway.png”);

inputSize = net.Layers(1).InputSize;I = imresize(I,inputSize(1:2));

関数semanticseg

C = semanticseg(I,net);

labeloverlay。オーバーレイのカラーマップを,CamVidデータセット[2]で定義されたカラーマップの値に設定します。

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

このネットワークは,市街地の走行イメージで事前学習されていますが,ハイウェイの走行シーンでも妥当な結果を生成します。セグメント化の結果を改善するには,ハイウェイの走行シーンを含む追加のイメージでネットワークに再学習させる必要があります。この例の残りの部分では,転移学習を使用してセマンティックセグメンテーションネットワークの学習を行う方法を説明します。

你的英文怎么说?你的英文怎么说

この例では,事前学習済みのResNet-18ネットワークから,重みが初期化されたDeeplab v3 +ネットワークに学習させます。。用途の要件によって,MobileNet v2やResNet-50など,その他の事前学習済みのネットワークも使用できます。通俗地说,事前学習済みの深層ニューラルネットワーク

【中文翻译】resnet18。。

resnet18 ();

CamVid

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“文件”) || ~存在(imagesZip,“文件”) mkdir(outputFolder)“正在下载16mb CamVid数据集标签…”);websave (labelsZip labelURL);解压缩(labelsZip fullfile (outputFolder“标签”));disp (“正在下载557 MB CamVid数据集图像…”);websave (imagesZip imageURL);解压缩(imagesZip fullfile (outputFolder“图片”));结束

。。別の方法として、Webブラウザーを使用して,データセットをローカルディスクにまずダウンロードしておくことができます。WeboutputFolder

CamVid

imageDatastoreimageDatastore

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

我的意思是,我的意思是,我的意思是。

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

CamVid,

pixelLabelDatastore(计算机视觉工具箱)pixelLabelDatastore

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

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

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

labelIDs = camvidPixelLabelIDs();

【翻译pixelLabelDatastore。? ? ?

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

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

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

【中文译文

CamVidcountEachLabel(计算机视觉工具箱)我不知道。。

tbl = countEachLabel(pxds)
台=11×3表名称PixelCount ImagePixelCount ______________ __________ _______________ {'Sky'} 7.6801e+07 4.8315e+08 {'Building'} 1.1737e+08 4.8315e+08 {'Pole'} 4.7987e+06 4.8315e+08 {'Road'} 1.4054e+08 4.8453e+08 {'Pavement'} 3.3614e+07 4.7209e+08 {'Tree'} 5.4259e+07 4.479e+08 {'SignSymbol'} 5.2242e+06 4.6863e+08 {'Fence'} 6.9211e+06 2.516e+08 {'Car'} 3.4029e+06 4.4444e+08 {'Pedestrian'} 3.4029e+06 4.4444e+08 {'Bicyclist'} 2.5912e+06 2.6196e+08

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

。★★★★★★中文:中文:中文,中文,中文,中文,中文,中文,中文,中文。こうしたシーンには,歩行者や自転車運転者のピクセルよりも多くの空,建物,および道路のピクセルが含まれます。★★★★★★★★★★★★★★★★★★★★★★★★★学習では上位クラスを優先してバイアスがかけられるため,正しく処理されていない場合は,こうした不均衡が学習プロセスに悪影響を及ぼす可能性があります。★★★★★★★★★★★★★★★★★★★★★

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

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

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

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

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

numTrainingImages = numel(imdsTrain.Files)
numTrainingImages = 421
numValImages = nummel (imdsVal.Files)
numValImages = 140
numTestingImages = numel(imdsTest.Files)
numTestingImages = 140

【翻译

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

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

【中文译文

。英文:。前にcountEachLabel(计算机视觉工具箱)

imageFreq = tbl。PixelCount ./ tbl.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 = replaceLayer(lgraph;“分类”, pxLayer);

学習オプションの選択

trainingOptions

定义验证数据。dsVal = combine(imdsVal,pxdsVal);%定义培训选项。options = 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。これにより,ネットワークはより高い初期学習率で高速に学習することができる一方で,学習率が低下すると,局所的最適値に近い解を求めることができます。

“ValidationData”パラメーターを設定することによって,すべてのエポックで検証データに対してネットワークのテストが行われます。“ValidationPatience”4 .。。

。。

啊哈,“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”。。Gpu。

doTraining = false;如果doTraining [net, info] = trainNetwork(dsTrain,lgraph,options);结束

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);expected = uint8(expectedResult);预计imshowpair(实际)

視覚的には,道路,空,建物などのクラスのセマンティックセグメンテーションの結果は適切にオーバーラップしてます。。クラスごとのオーバーラップ量は,ジャカードインデックスとしても知られている交集在联盟(借据)メトリクスを使用して測定できます。関数jaccard(图像处理工具箱)i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i。

iou = jaccard(C, expecteresult);表(类、借据)
ans =11×2表类别____________ _______“天空”0.93418“建筑”0.86604“电线杆”0.37524“道路”0.94517“人行道”0.85422“树”0.91563“标志”0.62075“栅栏”0.81075“汽车”0.71446“行人”0.37249“骑自行车的人”0.69775

我的意思是,我的意思是,我的意思是,我的意思是。道路、空、建物クラスの借据スコアは高く,一方で歩行者や自動車などのクラスのスコアは低くなります。我的意思是,我的意思是,我的意思是,我的意思是,骰子(图像处理工具箱)bfscore(图像处理工具箱)

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

複数のテストイメージの精度を測定するには,テストセット全体に対してsemanticseg(计算机视觉工具箱)? ? ? ? ?。。

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

semanticseg【中文翻译pixelLabelDatastoreimdsTest“WriteLocation”evaluateSemanticSegmentation(计算机视觉工具箱)

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

evaluateSemanticSegmentation。データセットレベルのメトリクスを確認するには,指标。DataSetMetrics? ? ?

指标。DataSetMetrics
ans =表1×5GlobalAccuracy MeanAccuracy MeanIoU WeightedIoU MeanBFScore  ______________ ____________ _______ ___________ ___________ 0.89244 0.8657 0.66347 0.82837 0.69324

。,指标。ClassMetrics

指标。ClassMetrics
ans =11×3表精确度IoU MeanBFScore ________ _______ ___________天空0.94272 0.90979 0.90853建筑0.81488 0.79161 0.63963杆子0.75997 0.24632 0.58505道路0.93955 0.92638 0.80615人行道0.90048 0.73874 0.74538树0.88173 0.7746 0.72892标志0.76491 0.42338 0.53707围栏0.83661 0.57442 0.5567汽车0.92588 0.79441 0.74331行人0.86718 0.47077 0.64356骑自行车者0.88881 0.6478 0.59473

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

【中文翻译

函数labelIDs = camvidPixelLabelIDs()%返回每个类对应的标签id。CamVid数据集有32个类。将它们分为以下11类%原始SegNet训练方法b[1]。这11类是:%的“天空”“建筑”,“极”,“路”,“路面”、“树”、“SignSymbol”,“篱笆”、“汽车”、“行人”和“骑自行车的人”。% CamVid像素标签id以RGB颜色值提供。将它们分为% 11类,并将它们作为m × 3矩阵的单元格数组返回。的原始CamVid类名与每个RGB值一起列出。请注意% Other/Void类被排除在下面。labelIDs = {%的“天空”[128 128 128;%的“天空”]%“建设”[000 128 064;%“桥”128 000 000;%“建设”064 192 000;%的“墙”064 000 064;%的“隧道”192 000 128;%的“拱门”]%“极”[192 192 128;%”Column_Pole”000 000 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 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 = numel(imds.Files);shuffledIndices = randperm(numFiles);%使用60%的图像进行训练。numTrain = round(0.60 * numFiles);trainingIdx = shuffledindiices (1:numTrain);%使用20%的图像进行验证numVal = round(0.20 * numFiles);valIdx = shuffledindiices (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信息。class = 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)使用随机反射和增强图像和像素标签图像%的翻译。1:size(data,1) tform = randomAffine2d(“XReflection”,真的,“XTranslation”xTrans,“YTranslation”, yTrans);在输出空间中将视图居中于图像的中心%允许翻译将输出图像移出视图。route = affineOutputView(size(data{i,1}), format,“BoundsStyle”“centerOutput”);使用相同的变换来扭曲图像和像素标签。数据{i,1} = imwarp(数据{i,1}, tform,“OutputView”,溃败);数据{i,2} = imwarp(数据{i,2}, tform,“OutputView”,溃败);结束结束

参考文献

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

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

参考

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

関連するトピック