主要内容

U-netを使用するセマンティックセグメンテ,ションネットワ,クのコ,ド生成

codegenコマンドを使用して,イメージセグメンテーション用の深層学習ネットワークU-NetのDAGネットワークオブジェクトについて予測を実行する墨西哥人関数を生成します。

U-Netを使用したe - netを使用したe - netメcodegenコマンドなしで行う同様の例にいては,深層学習を使用したマルチスペクトルメジのセマンティックセグメンテション(图像处理工具箱)を参照してください。

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

必須

この例では,cuda mexを生成します。以下のサ,ドパ,ティ要件が適用されます。

  • Cuda®対応nvidia®gpuおよび互換性のあるドラバ。

オプション

スタティックライブラリ,ダイナミックライブラリ,または実行可能ファイルなどの墨西哥人以外のビルドについて,この例では以下の要件も適用されます。

Gpu環境の検証

関数coder.checkGpuInstallを使用して,この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証します。

envCfg = code . gpuenvconfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

セグメンテ,ションネットワ,ク

U-Net[1]は,セマンティックイメージセグメンテーション用に設計された,畳み込みニューラルネットワーク(CNN)の一種です。U-Netでは,最初の一連の畳み込み層に最大プーリング層が点在し,入力イメージの解像度を逐次下げていきます。これらの層に,一連の畳み込み層が続き,その中にアップサンプリング演算処理が点在し,入力イメージの解像度を逐次上げていきます。これらの2の一連の経路を組み合わせるとu字形の図が形成されます。このネットワークは,元は生物医学のイメージセグメンテーションアプリケーションで予測を実行するために学習および使用されていました。この例は,このネットワ,クで時間の経過に伴う森林被覆の変化を追跡できることを示しています。環境保護機関は,森林伐採を追跡し,地域の環境的生態学的健全性を評価し資格を与えます。

深層学習ベースのセマンティックセグメンテーションにより,高解像度の航空写真から植被を正確に測定できます。課題の1つに,視覚的に類似した特性をもつクラスを切り分けること,たとえば緑のピクセルを草,低木または樹木として区別することがあります。分類の精度を高めるために,一部のデータセットには各ピクセルに関する追加情報を提供するマルチスペクトルイメージが含まれています。たとえば,ハームリンビーチ州立公園のデータセットでは,クラスをより明確に分離する近赤外チャネルでカラーイメージが補完されています。

この例では,各ピクセルを正しく分類するために,事前学習済みのU-Netネットワークと共にハームリンビーチ州立公園のデータ[2]を使用します。

使用するU-Netは,次の18クラスに属するピクセルをセグメント化するように学習されています。

0.其他类/图像边界野餐桌14。草1。道路标志15.黑木面板沙2。树9。16.白色木板水(湖) Building 10. Orange Landing Pad 17. Water (Pond) 4. Vehicle (Car, Truck, or Bus) 11. Water Buoy 18. Asphalt (Parking Lot/Walkway) 5. Person 12. Rocks 6. Lifeguard Chair 13. Other Vegetation

エントリポ@ @ント関数segmentImageUnet

エントリポ@ @ント関数segmentImageUnet.mは,multispectralUnet.matファイル内にあるmultispectralUnetネットワークを使用して,入力イメージに対してパッチ単位のセマンティックセグメンテーションを実行します。この関数は,ネットワ,クオブジェクトをmultispectralUnet.matファ@ @ルから永続変数mynetに読み込み,以降の予測呼び出しではその永続変数を再利用します。

类型(“segmentImageUnet.m”
function out = segmentImageUnet(im,patchSize,trainedNet) % out = segmentImageUnet(im,patchSize,trainedNet)返回一个语义上%分割的图像,使用% trainedNet中指定的多光谱Unet进行分割。分割在大小为% patchSize的每个补丁上执行。版权所有The MathWorks, Inc. %#codegen persistent mynet;if isempty(mynet) mynet = code . loaddeeplearningnetwork (trainedNet);end [height, width, nChannel] = size(im);补丁=编码器。nullcopy (0 ([patchSize nChannel-1]));% Pad图像的尺寸为patchSize padSize = 0(1,2)的倍数;padSize(1) = patchSize(1) - mod(高度,patchSize(1));padSize(2) = patchSize(2) - mod(宽度,patchSize(2)); im_pad = padarray (im, padSize, 0, 'post'); [height_pad, width_pad, ~] = size(im_pad); out = zeros([size(im_pad,1), size(im_pad,2)], 'uint8'); for i = 1:patchSize(1):height_pad for j =1:patchSize(2):width_pad for p = 1:nChannel-1 patch(:,:,p) = squeeze( im_pad( i:i+patchSize(1)-1,... j:j+patchSize(2)-1,... p)); end % Pass in input segmentedLabels = activations(mynet, patch, 'Segmentation-Layer'); % Takes the max of each channel (6 total at this point) [~,L] = max(segmentedLabels,[],3); patch_seg = uint8(L); % Populate section of output out(i:i+patchSize(1)-1, j:j+patchSize(2)-1) = patch_seg; end end % Remove the padding out = out(1:height, 1:width);

事前学習済みのU-Netネットワ,クの取得

この例では,事前学習済みのU-Netネットワ,クを含むmultispectralUnet垫子ファeconrルを使用します。このファaapl . exeこのファaapl . exeズは約117 MBです。MathWorksの Web サイトからファイルをダウンロードします。

trainedUnetFile = matlab.internal.examples.download万博1manbetxSupportFile(“视觉/数据”“multispectralUnet.mat”);

U-Netは,畳み込み層,最大プーリング層,深さ連結層,ピクセル分類出力層など,58個の層を含むDAGネットワークです。

负载(trainedUnetFile);disp(净)
DAGNetwork with properties: Layers: [58×1 nnet.cnn.layer.Layer] Connections: [61×2 table] InputNames: {'ImageInputLayer'} OutputNames: {' segment - layer '}

ネットワ,クア,キテクチャを表示するには,関数analyzeNetwork(深度学习工具箱)を使用します。

analyzeNetwork(净);

デ,タの準備

この例では,[2]の高解像度マルチスペクトルデ,タを使用します。このイメージセットはニューヨーク州のハームリンビーチ州立公園の上空でドローンを使用して撮影されました。このデータには18個のオブジェクトクラスラベルの付いた,ラベル付き学習セット,検証セットおよびテストセットが含まれます。デタファルのサズは~ 3.0 gbです。

補助関数downloadHamlinBeachMSIDataを使用して,データセットの垫ファイルバージョンをダウンロードします。この関数は,この例にサポ,トファ,ルとして添付されています。

如果~ (fullfile (pwd,存在“数据”),“dir”) url =“http://www.cis.rit.edu/ ~ rmk6217 / rit18_data.mat”;downloadHamlinBeachMSIData (url, pwd +“/数据/”);结束

デタをmatlabに読み込んで確認します。

负载(fullfile (pwd,“数据”“rit18_data”“rit18_data.mat”));检查数据test_data
名称大小字节类属性test_data 7x12446x7654 1333663576 uint16

►►►►►►►►►►►►►►►►►►►►►►►►►►RGBカラチャネルは3番目,2番目,および1番目のメジチャネルです。次の3のチャネルは,近赤外帯域に対応します。熱の痕跡に基づいて,。チャネル7は有効なセグメンテ,ション領域を示すマスクです。

マルチスペクトルイメージデータはnumChannels宽度x高度配列に配置されます。MATLABでは、マルチチャネル イメージは width x height x numChannels 配列に配置されます。チャネルが 3 番目の次元になるようにデータを形状変更するには、補助関数switchChannelsToThirdPlaneを使用します。

test_data = switchChannelsToThirdPlane(test_data);确认数据具有正确的结构(通道最后)。test_data
名称大小字节类属性test_data 12446x7654x7 1333663576 uint16 . test_data 12446x7654x7

Mexコ,ド生成の実行

エントリポ@ @ント関数segmentImageUnet.m用のCUDAコードを生成するには,ターゲット言語をc++に設定して墨西哥人ターゲットのGPU構成オブジェクトを作成します。関数编码器。DeepLearningConfigを使用してCuDNN深層学習構成オブジェクトを作成し,それをgpuコ,ド構成オブジェクトのDeepLearningConfigプロパティに割り当てます。入力サ▪▪ズに12446×7654×7、パッチサ▪▪ズに1024▪▪行1024▪▪列を指定してcodegenコマンドを実行します。これらの値は全体のtest_dataのサ@ @ズに対応します。パッチサ@ @ズが小さいと推論が速くなります。パッチの計算方法を確認するには,segmentImageUnetエントリポ@ @ント関数を確認します。

cfg = code . gpuconfig (墨西哥人的);cfg。ConstantInputs =“删除”;cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);inputArgs = {ones(size(test_data),“uint16”),...编码器。常数(1024年[1024]),coder.Constant (trainedUnetFile)};codegen配置cfgsegmentImageUnetarg游戏inputArgs报告
代码生成成功:查看报告

test_dataの結果を予測するために生成されたMEXの実行

この関数segmentImageUnetは,テストするデ,タ(test_data)と,使用するパッチサ。イメージのパッチを受け取り,特定のパッチ内のピクセルを予測してから,すべてのパッチを組み合わせます。テストデータのサイズ(12446×7654×7)を考慮すると,このような大きなイメージはパッチで処理する方が簡単です。

segmentedImage = segmentImageUnet_mex(test_data);

セグメンテーションの有効な部分だけを抽出するには,セグメント化されたイメージにテストデータのマスクチャネルを乗算します。

segmentedImage = uint8(test_data(:,:,7)~=0) .* segmentedImage;

セマンティックセグメンテションの出力はノズを含むため,関数medfilt2を使用してノ@ @ズと散在ピクセルを取り除きます。

segmentedImage = medfilt2(segmentedImage,[5,5]);

U-Netでセグメント化されたtest_dataの表示

次のコ,ド行は,クラス名のベクトルを作成します。

classNames = [“路标”“树”“建筑”“汽车”“人”...“LifeguardChair”“PicnicTable”“BlackWoodPanel”...“WhiteWoodPanel”“OrangeLandingPad”“浮”“石头”...“LowLevelVegetation”“Grass_Lawn”“Sand_Beach”...“Water_Lake”“Water_Pond”“沥青”];

セグメント化されたRGBテストイメージにラベルを重ね合わせ,このセグメンテーションイメージにカラーバーを追加します。

cmap = jet(编号(classNames));B = labeloverlay (imadjust (test_data (:,:, (3,2,1)), 0.6 [0], [0.1 - 0.9], 0.55),...segmentedImage,“透明”, 0.8,“Colormap”,提出);figure imshow(B) N = number (classNames);ticks = 1/(N*2):1/N:1;colorbar (“TickLabels”cellstr(类名),“滴答”蜱虫,“TickLength”0,...“TickLabelInterpreter”“没有”);colormap城市规划机构(cmap)标题(“分割图像”);

参考文献

Ronneberger, Olaf, Philipp Fischer和Thomas Brox。U-Net:用于生物医学图像分割的卷积网络arXiv:1505.04597,2015.

[2] Kemker, R., C. Salvaggio, C. Kanan。用于语义分割的高分辨率多光谱数据集CoRR, abs/1703.01918, 2017。

参考

関数

オブジェクト

関連する例

詳細