主要内容

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

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

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

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

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

このこのでは,学校用に剑桥大学のCamVidデータセット[2]ををセットは,运転中には,运転中に得らたたはのですがれるはです。レベルのラベルを提供します。

設定

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

事前学習済みのResnet-18を入手するには,深度学习工具箱™renet -18网络模型をインストールします。インストールが完了したら,次のコードを実行して正しくインストールされていることを確認します。

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);结束

この例を実行するには,以3.0计算能力上のCUDA対応NVIDIA 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 (outputFolder,'labels.zip');imageszip = fullfile(outputfolder,“images.zip”);如果〜存在(Labelszip,“文件”) | | ~存在(imagesZip“文件”)Mkdir(outputfolder)disp('下载16 MB Camvid Dataset标签......');Websave(Labelszip,LabelURL);解压缩(LabelSzip,fullfile(outputfolder,'标签'));disp (“下载557 MB CamVid数据集图像……”);WebSave(Imagezip,imageurl);解压缩(Imagezip,fullfile(outputfolder,“图片”));结束

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

Camvidイメージイメージの

imageDatastoreを使用してCamVidイメージを読み込みます。imageDatastoreは,ディスク上の大规模なイメージコレクションを效率的に読み込むことができます。

imgDir = fullfile (outputFolder,“图片”'701_stillsraw_full');imd = imageDatastore (imgDir);

イメージのうちの1つを表示します。

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

CamVidのピクセルラベル付きイメージの読み込み

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

学习をを容易するに,Camvidの元の32个のクラスを11个のクラスにグループし。

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

32个个のクラスをを个に减らすに,たとえば,“汽车”,“suvpickuptruck”,“truck_bus”,“火车”,および“其他扫描”をを合并たものを“汽车”とします。このこの例の最后にリストされている关词Camvidpixellabelids.を使用することで,グループ化されたラベルIDが返されます。

labelIDs = camvidPixelLabelIDs ();

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

labeldir = fullfile(outputfolder,'标签');pxds = pixellabeldataStore(Labeldir,Classes,LabelIds);

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

C = readimage (pxds, 559);提出= camvidColorMap;我= labeloverlay (C“ColorMap”,cmap);imshow(b)pixellabelolorbar(cmap,claseses);

色の综合わせが在しない领域にはピクセルラベルは,学校中间は使使さません。

データセット統計の解析

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

台= countEachLabel (pxds)
台=11×3表名称pixelcount imagepixelcount _____________________________________1.4054E + 08 4.8453E + 08 {'payment'} 3.3614E + 07 4.7209E + 08 {'tree'} 5.4259E + 07 4.479E + 08 {'signsymbol'} 5.2242e + 06 4.6863e + 08 {'围栏'} 6.9211e + 06 2.516E + 08 {'Car'} 2.4437E + 07 4.8315E + 07 4.8315E + 08 {'PEDSTRIAN'} 3.4029E + 06 4.4444E + 08 {'BICSCLIST'} 2.5912E + 06 2.6196E + 08

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

频率= tbl.PixelCount /笔(tbl.PixelCount);bar(1:numel(classes),frequency) xticks(1:numel(classes)) xticklabels(tbl.Name) xtickangle(45) ylabel('频率'

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

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

学校セット,検证検证,およびおよびセットの设备

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

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

60対20対20に分享すると,学校イメージ,検证イメージ,およびテストイメージのが。

numTrainingImages =元素个数(imdsTrain.Files)
numTrainingImages = 421
numvalimages = numel(imdsval.files)
numValImages = 140
numtestingimages = numel(imdstest.files)
numTestingImages = 140

ネットワークの作成

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

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

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

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

imagefreq = tbl.pixelcount ./ tbl.imagepixelcount;Classweights =中位数(imagefreq)./ imagefreq
classWeights =11×10.3182 0.2082 5.0924 0.1744 0.7103 0.4103 0.4175 4.5371 1.8386 1.0000 6.6059⋮

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

pxLayer = pixelClassificationLayer (“名字”'标签''课程',tbl.name,“ClassWeights”, classWeights);lgraph = replaceLayer (lgraph,“分类”, pxLayer);

学習オプションの選択

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

%定义验证数据。pximdsVal = pixelLabelImageDatastore (imdsVal pxdsVal);定义培训选项。选项=培训选项(“个”...“LearnRateSchedule”“分段”...'学习ropperiod'10...'学习ropfactor',0.3,...'势头',0.9,...“InitialLearnRate”1 e - 3,...“L2Regularization”, 0.005,...'vightationdata',pximdsval,...'maxepochs',30,...“MiniBatchSize”8...“洗牌”'每个时代'...'checkpoinspath'tempdir,...“VerboseFrequency”2,...“阴谋”“训练进步”...“ValidationPatience”4);

学习率にはははながががれれれれごとごとごとごとごとごとごとこれこれこれこれこれこれこれこれによりによりによりしいごとごとこれによりによりは高度い习率で高度に习するで高度に习することができるでで,学校率で低下すると,局所的最适値に近い解を求めることができます。

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

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

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

データ拡張

データ拡張はネットワークの精度を高めるのに役立つため,学習中にネットワークに対してより多くの例を提供するために使用されます。ここでは,データ拡張に対して+ / - 10ピクセルのランダムな左/右反射とランダムなX / Y平行移動が使用されます。これらのデータ拡張パラメーターを指定するには,imageDataAugmenterを使用します。

增量= imageDataAugmenter (“RandXReflection”,真的,...“RandXTranslation”-10年[10],'randytranslation', -10年[10]);

imageDataAugmenterは,この他にいくつかのタイプのデータ拡張をサポートします。それらの中から選択することは,経験的解析が必要であり,別のレベルのハイパーパラメーター調整です。

学習の開始

pixelLabelImageDatastore(计算机视觉工具箱)を使用して学習データとデータ拡張の選択を組み合わせます。pixelLabelImageDatastoreは学习データのバッチを読み取り,データ拡张を适用し,拡张されたデータを学习アルゴリズムに送信します。

pximds = pixelLabelImageDatastore (imdsTrain pxdsTrain,...“DataAugmentation”、增压器);

doTrainingフラグフラグtrueのの合,Trainnetwork.をを使は,そうでないそうでない合,事前学习済みのネットワーク読み込み読み込み読み込み読み込み読み込み読み込み読み込み読み込み読み込み読み込み読み込み読み込み読み込み読み込み

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

dotraining = false;如果doTraining [net, info] = trainNetwork(pximds,lgraph,options);别的data =负载(pretrainedNetwork);网= data.net;结束

1つのイメージを使用したネットワークテスト

迅速な正常性チェック,1つのテストイメージ上でで済みのネットワークを実行。

i = ReadImage(IMDStest,35);C = SemanticSeg(I,Net);

结果を表示します。

我= labeloverlay (C“Colormap”提出,“透明”, 0.4);imshow (B) pixelLabelColorbar(提出、类);

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

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

视覚的には,道路,空,建物などのクラスのセマンティックセグメンテーションの结果は适切にオーバーラップしてます。しかし,歩行者や车のような小さいオブジェクトはそれほど正确ではありません。クラスごとのオーバーラップ量は,ジャカードインデックスとしても知らてててててて与工会交叉口(iou)メトリクスメトリクス使用ししできできます。关联jaccard.(图像处理工具箱)をを用してiouを测定します。

借据= jaccard (C, expectedResult);表(类、借据)
ans =11×2表class iou ____________ _______“Sky”0.91837“Building”0.84479“Pole”0.31203“Road”0.93698“Pavement”0.82838“Tree”0.89636“SignSymbol”0.57644“Fence”0.71046“Car”0.66688“Pedestrian”0.48417“Bicyclist”0.68431

iouメトリクスでは视覚な结果を确认ます。道路,空,建物クラスiouスコアは高度,一方で歩行者自动车などののスコアはなりますます。そのそのの。その他の一切。骰子(图像处理工具箱)bfscore(图像处理工具箱)の轮郭マッチングスコアなどがますます。

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

複数のテストイメージの精度を測定するには,テストセット全体に対してsemanticseg(计算机视觉工具箱)をを行します。ミニバッチのサイズ4をを使し,イメージイメージセグメントセグメントのメモリを削减します。ます。

pxdsResults = semanticseg (imdsTest净,...“MiniBatchSize”4...“WriteLocation”tempdir,...“详细”,错误的);

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

metrics = evaluateManticStogation(PXDSResults,PXDStest,“详细”,错误的);

evaluateSemanticSegmentationは,データセット全体,个々のクラス,各テストイメージにますデータメトリクスの返します。metrics.datasetmetrics.を検査します。

metrics.datasetmetrics.
ans =表1×5GlobalAccuracy MeanAccuracy MeanIoU WeightedIoU MeanBFScore  ______________ ____________ _______ ___________ ___________ 0.87695 0.85392 0.6302 0.80851 0.65051

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

指标.Classmetrics.
ans =11×3表精度IoU MeanBFScore ________ _______ ___________ Sky建筑0.778453 0.76098 0.58511杆0.71586 0.21477 0.56639道路0.73024 0.91465 0.76696路面树0.778466 0.70571 0.70919标志符号0.79358 0.39309 0.48302护栏0.81507 0.46484 0.48564 Car 0.90956 0.76799 0.69233行人0.876290.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值旁边列出。请注意%表示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;...% “交通拥挤”%的道路[128 064 128;...% “路”128 000 192;...%“lanemkgsdriv”192 000 064;...%”LaneMkgsNonDriv”%“路面”[000 000 192;...%“人行道”064 192 128;...%“停车盆”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;...%“其他制造”%“行人”[064 064 000;...%“行人”192 128 064;...%的“孩子”064 000 192;...%“cartluggagepram”064 128 064;...%的“动物”%“自行车”[000 128 192;...%“自行车”192 000 192;...%“motorcyclescooter”]};结束
功能一会pixelLabelColorbar(提出)%添加一个颜色条到当前轴。颜色栏被格式化%以显示带有颜色的类名。Colormap(GCA,CMAP)%将彩色键添加到当前数字。c = colorbar (“对等”,GCA);%使用类名作为标记。c.TickLabels =一会;numClasses =大小(提出,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%骑自行车];% Normalize between[0 1]。CMAP = CMAP。/ 255;结束
功能[IMDStrain,IMDSVAL,IMDSTEST,PXDSTRAIN,PXDSVAL,PXDSTEST] = PartitionCamvidData(IMDS,PXD)%分区Camvid数据通过随机选择60%的培训数据。这% rest用于测试。%设置初始随机状态,例如重现性。rng (0);numFiles =元素个数(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);%其余的用于测试。testIdx = Shuffleddindices(Numtrain + Numval + 1:END);%创建用于培训和测试的图像数据存储。trainingImages = imds.Files (trainingIdx);valImages = imds.Files (valIdx);testImages = imds.Files (testIdx);imdsTrain = imageDatastore (trainingImages);imdsVal = imageDatastore (valImages);imdsTest = imageDatastore (testImages);%提取类和标签id信息。类= pxds.ClassNames;labelIDs = camvidPixelLabelIDs ();%创建用于训练和测试的像素标签数据存储。trainingLabels = pxds.Files (trainingIdx);valLabels = pxds.Files (valIdx);testLabels = pxds.Files (testIdx);pxdsTrain = pixelLabelDatastore(trainingLabels, classes, labelid);pxdsVal = pixelLabelDatastore(valLabels, classes, labelid);pxdsTest = pixelLabelDatastore(testLabels, classes, labelid);结束

参考文献

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

Brostow, G. J., J. Fauqueur, R. Cipolla。"视频中的语义对象类:高清晰度地面真实数据库"模式识别的字母.2009年第30卷第2期88-97页。

参考

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

关键词する