主要内容

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

セマンティックセグメンテーション用の完全畳み込みネットワークの学習と展開

GPU编码器™,GPU编码器™ををたNVIDIA®GPUでの畳み込みセマンティックセグメンテーションネットワークの习およびおよび开着について明します。

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

学习手顺を示すため,この例では,セマンティックセマンティックセグメンテーションセグメンテーションにさたたたたののの畳み込みニューラル(cnn)であるfcn-8s [1]に习させます。他のタイプのセグメンテーションセグメンテーションには,segnet,u-netなどの完全畳み込みがあります。この学习手顺は,これらのネットワークにも适するます。

この例では,学習用にの剑桥大学Camvidデータセット[2]ををセットはますこのセットは,运転中に得られたレベルでのが含まセットコレクションですがイメージはです。データセットは,车辆,传输者,道路を含む32个セマンティッククラスについてレベルのラベルを提供ますます。

サードパーティの必要条件

必须

  • CUDA®対応NVIDIA GPUおよび互換性のあるドライバー。

オプション

  • nvidia cudaツールキット。

  • 英伟达cuDNNライブラリ。

  • コンパイラおよびライブラリの環境変数。サポートされているコンパイラおよびライブラリのバージョンの詳細は、サードパーティハードウェア(GPU编码器)を参照してください。環境変数の設定は,前提条件となる製品の設定(GPU编码器)を参照してください。

GPU環境の検証

关节coder.checkGpuInstall(GPU编码器)をを使し,この例を実行するにに必要コンパイラライブラリライブラリ设定设定れているを検证しして検证しし

envCfg = coder.gpuEnvConfig (“主机”);envcfg.deeplibtarget =.“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

設定

この例で,vgg-16ネットワークから初初された重みを使した畳み込みセマンティックネットワークををて完全セマンティックセグメンテーションネットワークをし。关联vgg16は,vgg-16网络深层学习工具箱模型サポートパッケージの有象をチェック,事前学习済みのvgg-16モデルを返します。

vgg16();

事前学习済みのバージョンのfcnをダウンロードします。このこの学习済みのを使するで,学校の完了を待つなく全例を実できますこと例は,ますフラグフラグ,このこのにおいて,この例,学校済みネットワークの〖fcn〗済みーの

doTraining = false;如果~ doTraining pretrainedURL =“//www.tatmou.com/金宝appsupportfiles/gpucoder/cnn_models/fcn/FCN8sCamVid.mat”;disp (“下载预先训练的FCN (448mb)……”);websave (“FCN8sCamVid.mat”,pretrowsurl);结尾
下载预训练FCN (448mb)…

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/labeledappoved_full.zip';outputfolder = fullfile(pwd,“CamVid”);如果~存在(outputFolder“dir”)mkdir(outputfolder)labelszip = fullfile(outputfolder,“labels.zip”);imageszip = fullfile(outputfolder,'图像.zip');disp (“下载16mb CamVid数据集标签……”);Websave(Labelszip,LabelURL);解压缩(Labelszip,fullfile(outputfolder,“标签”));disp ('下载557 MB Camvid数据集图像...');websave (imagesZip imageURL);解压缩(imagesZip fullfile (outputFolder“图片”));结尾

データのダウンロード時間はお使いのインターネット接続によって異なります。この例の実行は,ダウンロード操作が完了するまで進行しません。または、Webブラウザーを使用して,このデータセットをローカルディスクにまずダウンロードします。次に,変数outputFolderを使用してダウンロード済みのファイルの場所を指します。

Camvidイメージイメージの

imageDatastoreをを用してcamvidイメージを読み込みます.imagedatastoreによって,大规模なイメージコレクション效率的にディスクに読み込むことができ。

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

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

i = ReadImage(IMDS,25);我=组合(i);imshow(i)

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

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

SegNetペーパー[3]で説明されている学習方法に従って,CamVidの元の32個のクラスを11個のクラスにグループ化します。次のクラスを指定します。

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

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

labelids = camvidpixellabelids();

クラスおよびラベルidををて,pixellabeldataStoreを作物成し。

labeldir = fullfile(outputfolder,“标签”);PXDS = PixellabeldAtastore(Labeldir,类,标签ID);

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

C = ReadImage(PXDS,25);cmap = camvidcolormap;b = labeloverlay(i,c,“ColorMap”,提出);imshow (B) pixelLabelColorbar(提出、类);

色の综合わせが存ない领域はピクセルはなく,学院中は使使れれれ。

データセット统计の解析

CamVidデータセット内のクラスラベルの分布を表示するには,countEachLabel(电脑视觉工具箱)を关使し。この关节,クラスラベル别にのをカウントします。

台= countEachLabel (pxds)
TBL =11×3表名字PixelCount ImagePixelCount  ______________ __________ _______________ {' 天空}7.6801 4.8315 e + e + 07年08年{“建筑”}1.1737 e + 08年4.8315 e + 08年{“极点”}4.7987 4.8315 e + e + 06年08年{‘路’}1.4054 e + 08年4.8453 e + 08年{“路面”}3.3614 4.7209 e + e + 07年08年{‘树’}5.4259 4.479 e + e + 07年08年{‘SignSymbol} 5.2242 4.6863 e + e + 06年08年{“栅栏”}6.9211 2.516 e + e + 06年08年{'汽车'}{'行人'}3.4029e+06 4.4444e+08{'自行车'}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データのリサイズ

CAMVIDデータセット内のは720×960です。学习时间ををし,メモリ实用量を削减には,サポート关键词ResizeCamvidimages.およびresizeCamVidPixelLabelsをを用して,イメージおよびピクセルラベルイメージを360×480にリサイズし。

imagefolder = fullfile(outputfolder,'iconiageResized', filesep);imd = resizeCamVidImages (imd, imageFolder);labelFolder = fullfile (outputFolder,“labelsResized”, filesep);pxds = resizeCamVidPixelLabels (pxds labelFolder);

学習セットとテストセットの準備

SegNetは,データセットのイメージの60%を使用して学習されます。残りのイメージはテスト用に使用されます。次のコードでは,イメージとピクセルラベルデータを学習セットとテストセットに無作為に分割します。

[imdsTrain, imdsTest pxdsTrain pxdsTest] = partitionCamVidData (imd, pxds);

60÷40に分类する,トレーニングイメージとテストイメージのが次のようにます。

numTrainingImages =元素个数(imdsTrain.Files)
numTrainingImages = 421
numTestingImages =元素个数(imdsTest.Files)
numtestingimages = 280.

ネットワークの作成

fcnLayers(电脑视觉工具箱)を使用して,VGG-16の重みを使用して初期化される完全な畳み込みネットワーク層を作成します。关节fcnLayersはネットワーク変換を実行してVGG-16からの重みを転送し,セマンティックセグメンテーションに必要な層を新たに追加します。关节fcnLayersのの力はfcnを表すlayergraphオブジェクトオブジェクト.Layergraphオブジェクトは,ネットワーク层および空间の接続ををします。

图像= [360 480];numclasses = numel(类);Lgraph = fcnlayers(图像化,numcrasses);

クラスのはてはますサイズセットはは内。

クラスの重み付けを使使たたクラスバランス调整

CAMVID内のクラスはがとれていません。学习习をするために,あらかじめ关联countEachLabel(电脑视觉工具箱)によって計算したピクセルラベルのカウントを使用して,中央頻度クラスの重みを計算できます[3]。

imageFreq =(资源。PixelCount。/ tbl.ImagePixelCount;classWeights =中值(imageFreq) ./ imageFreq;

PixelclassificationLayer.(电脑视觉工具箱)を使用してクラスの重みを指定します。

pxLayer = pixelClassificationLayer ('名称'“标签”“类”资源描述。的名字,'classweight'classWeights)
pxLayer = PixelClassificationLayer with properties: Name: 'labels' Classes: [11×1 categorical] ClassWeights: [11×1 double] OutputSize: 'auto' Hyperparameters LossFunction: 'crossentropyex'

現在のpixelClassificationLayerを削除して新しい層を追加することで,新しいpixelClassificationLayerをもつSegNetネットワークを更新します。現在のpixelClassificationLayerには‘pixelLabelsという名前が付けられています。关节removeLayersをを用してこれこれをし削除削除削除削除addLayersをを用しし新闻层层加加し,关联connectLayersを使用して新しい層を残りのネットワークに接続します。

lgraph = removeLayers (lgraph,'pixellabels');lgraph = addLayers(lgraph, pxLayer);lgraph = connectLayers (lgraph,“softmax”“标签”);

学习オプションの选択

学习のの最适最适アルゴリズムadamです。これこれ“适応モーメント推定”(自适应时刻估计)に进来します。关节trainingOptionsを使用して,亚当に使用されるハイパーパラメーターを指定します。

选择= trainingOptions (“亚当”...'italllearnrate'1 e - 3,...“MaxEpochs”,100,...“MiniBatchSize”4...“洗牌”“every-epoch”...“CheckpointPath”tempdir,...“VerboseFrequency”,2);

“MiniBatchSize”4により学習中のメモリ使用量を削減します。この値は,使用しているシステムのGPUメモリの量に応じて増減させることができます。

'checkpoinspath'は一时的な场所に设定さされいますます。この名前とのペアを设定とととととポイントを保存できますにチェックポイントポイント保存できますがシステムやや保存保存。,保存したチェックポイントから习を开头できます.'checkpointpath'で指定されたに,ネットワークチェックポイントをするのにになスペースあることをををしししししししししししますしししますしししししししししししししししししししししししししししししししし

データ拡張

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

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

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

学習の開始

关节PixellabelimagedAtastore.(电脑视觉工具箱)を使用して学习データとデータ张の选択を合并ます。关键词PixellabelimagedAtastore.は学習データのバッチを読み取り,データ拡張を適用し,拡張されたデータを学習アルゴリズムに送信します。

pximds = pixelLabelImageDatastore (imdsTrain pxdsTrain,...'dataaugmentation'、增压器);

用圆形フラグが真实の结合,关节Trainnetwork.をを用しし学习习开启します。

12 GBのGPUメモリのnvidia™泰坦XPで済みですです。GPUのメモリがこれ少ない少ない场あり発する性性ありますますシステム性がます。trainingOptions小匹匹匹匹配プロパティを1に下げてみます。このネットワークの学習は,お使いのGPUハードウェアによっては約5時間またはそれ以上かかります。

如果doTraining [net, info] = trainNetwork(pximds,lgraph,options);保存(“FCN8sCamVid.mat”'网');结尾

DAGネットワークオブジェクトをfcn8scamvid.mat.という名前の垫ファイルとして保存します。この垫ファイルはコード生成時に使用されます。

墨西哥人コード生成の実行

关节fcn_predict.mは,イメージイメージ力を,fcn8scamvid.mat.ファイルに保存されている深層学習ネットワークを使用して,イメージについて予測を実行します。この関数は,ネットワークオブジェクトをfcn8scamvid.mat.から永続変数mynetに読み込み,以降の予測呼び出しではその永続オブジェクトを再利用します。

类型(“fcn_predict.m”
function out = fcn_predict(in) %#codegen %版权所有if isempty(mynet) mynet = code . loaddeeplearningnetwork ('FCN8sCamVid.mat');End % pass in input out = predict(mynet,in);

ターゲット言語をc++に設定して墨西哥人ターゲットのGPU構成オブジェクトを生成します。关节编码器。DeepLearningConfig(GPU编码器)をを用してcudnn.深层学习构成オブジェクト作物,それをgpuコード成オブジェクトのDeepLearningConfigプロパティに割り当てます。サイズが[360、480、3]の入力を指定してcodegen(MATLAB编码器)コマンドを実行します。このサイズはFCNの入力層に対応します。

cfg = coder.gpuconfig('mex');cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);codegen配置CFG.fcn_predict-  args.{ONE(360,480,3,'UINT8')}报告
代码生成成功:查看报告

生成された墨西哥人の実行

入力イメージを読み込んで表示します。

Im = imread('testimage.png');imshow (im);

入力イメージに対してfcn_predict_mexをを呼び出して予测予测を実ししし

predict_scores = fcn_predict_mex (im);

変数predict_scoresは,各クラスのピクセル単位のスコアに対応する11个のチャネルを持つ3次元行列ですです最予测スコア使使しチャネルをし,ピクセル単位の计算し,ピクセルピクセル単位のラベルを取得しし

[~, argmax] = max (predict_scores [], 3);

セグメント析されラベルををイメージにし表示表示ししししし。

类= [“天空”“建造”“极”“路”“路面”“树”“signsymbol”“篱笆”“汽车”“行人”“自行车”];cmap = camvidcolormap();segmentedImage = Labeloverlay(IM,Argmax,“ColorMap”,提出);图imshow(sementedimage);PixellabelColorbar(CMAP,课程);

クリーンアップ

メモリに読み込まれた静的ネットワークオブジェクトをクリアします。

清晰的墨西哥人

参考文献

Long, J., E. Shelhamer和T. Darrell。语义分割的全卷积网络计算机视觉与图形识别,2015,pp. 3431-3440。

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

Badrinarayanan V., A. Kendall, R. Cipolla。“SegNet:一种用于图像分割的深度卷积编码器-解码器体系结构”,arXiv预印本,arXiv:1511.00561, 2015。