主要内容

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

U-Netを使用する英特尔CPUでのセマンティックセグメンテーションアプリケーションのコード生成

この例では,深層学習を使用するイメージセグメンテーションアプリケーションのコード生成について説明します。codegenコマンドを使用し,イメージセグメンテーションに深層学習ネットワークU-Netを使用して予測を実行する墨西哥人関数を生成します。

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

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

  • 英特尔高级向量扩展2(英特尔AVX2)命令をサポートするXeonプロセッサ

この例は、Linux®、Windows®,およびmacOSのプラットフォームでサポートされています。

この例では,MATLABに付属する英特尔MKL-DNNライブラリを使用して,セマンティックセグメンテーション用の墨西哥人関数を生成します。

この例は,MATLABOnlineではサポートされていません。

U-Netの概要

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

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

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

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

0.其他类/图像边界野餐桌上14。草1。路标8。黑木面板沙2。树9。16.白木面板水(湖泊)3。 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

事前学習済みのU-Net DAGネットワークオブジェクトの取得

trainedUnet_url =“//www.tatmou.com/金宝appsupportfiles/vision/data/multispectralUnet.mat”;downloadTrainedUnet (trainedUnet_url pwd);
下载哈姆林海滩数据集预训练的U-net…下载需要几分钟…完成了。
ld =负载(“trainedUnet / multispectralUnet.mat”);网= ld.net;

このDAGネットワークには,畳み込み層,最大プーリング層,深さ連結層,ピクセル分類出力層など,58個の層が含まれています。深層学習ネットワークアーキテクチャを対話的に可視化して表示するには,関数analyzeNetworkを使用します。

% analyzeNetwork(净);

エントリポイント関数segmentImageUnet

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

类型(“segmentImageUnet.m”
% OUT = segmentmageunet (IM, PATCHSIZE)返回一个语义分割的%图像,使用网络多光谱unet分割。分割%是在大小为PATCHSIZE的每个补丁上执行的。% % Copyright 2019-2020 The MathWorks, Inc. function out = segmentmageunet (im, patchSize) %#codegen persistent mynet;if isempty(mynet) mynet = code . loaddeeplearningnetwork ('trainedUnet/multispectralUnet.mat');end [height, width, nChannel] = size(im);补丁=编码器。nullcopy (0 ([patchSize nChannel-1]));% pad图像的尺寸为patchSize的倍数padSize = 0 (1,2);- mod(height, patchSize(1));- mod(width, 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);

データの準備

ハームリンビーチ州立公園のデータをダウンロードします。

如果~ (fullfile (pwd,存在“数据”),“dir”) url =“http://www.cis.rit.edu/ ~ rmk6217 / rit18_data.mat”;downloadHamlinBeachMSIData (url, pwd +“/数据/”);结束
下载Hamlin Beach数据集…下载需要几分钟…完成了。

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

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

イメージには7個のチャネルがあります。RGBカラーチャネルは4番目,5番目および6番目のイメージチャネルです。最初の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に含まれるハームリンビーチ州立公園の全データセットをトリミングしたバージョンを使用します。test_dataの高さと幅をトリミングして,この例で使用する変数input_dataを作成します。

test_datacropRGB = imcrop(test_data(:,:,1:3),[2600, 3000, 2000, 2000]);test_datacropInfrared = imcrop(test_data(:,:,4:6),[2600, 3000, 2000, 2000]);test_datacropMask = imcrop(test_data(:,: 7),[2600, 3000, 2000, 2000]);input_data (:,: 1:3) = test_datacropRGB;input_data (:,: 4:6) = test_datacropInfrared;input_data (:: 7) = test_datacropMask;

変数input_dataを検証します。

谁(“input_data”);
名称大小字节类属性input_data 2001x2001x7 56056014 uint16

墨西哥人生成

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

cfg = coder.config (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“mkldnn”);codegen配置cfgsegmentImageUnetarg游戏{(大小(input_data),“uint16”),编码器。常数(1024 [1024])}报告
代码生成成功:要查看报告,打开('codegen\mex\segmentImageUnet\html\report.mldatx')。

input_dataの結果を予測するために生成された墨西哥人の実行

関数segmentImageUnetは,input_dataと,パッチサイズの次元を含むベクトルを入力として受け入れます。関数は,イメージをパッチに分割し、特定のパッチのピクセルを予測し、最後にすべてのパッチを結合します。input_dataのサイズ(12446 x7654x7)が大きいため,パッチでイメージを処理する方が簡単です。

segmentimagage = segmentmageunet_mex (input_data,[1024 1024]);

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

@ # @ # = uint8(input_data(:,:,7)~=0) .*

関数medfilt2を使用して,ノイズと散在ピクセルを除去します。

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

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

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

一会= net.Layers . class(结束);

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

显示输入数据图(1);imshow (histeq (input_data (:,: 1:3)));标题(输入图像的);提出=喷气(元素个数(类名);[0 0 0],[0 0 0],[0 0 0],[0 0 0],[0 0 0],“透明”,0,“Colormap”,提出);%显示分段数据图(2);imshow (segmentedImageOut);标题(分割图像输出的);N =元素个数(类名);蜱虫= 1 / (N * 2): 1 / N: 1;colorbar (“TickLabels”cellstr(类名),“滴答”蜱虫,“TickLength”,0,“TickLabelInterpreter”“没有”);colormap城市规划机构(cmap)标题(“使用Mkldnn分割图像”);segmentedImage = labeloverlay(input_data(:,:,4:6),[0 0.6],[0.1 0.9],0.55),segmentedImage,“透明”, 0.7,“Colormap”,提出);图(3);imshow (segmentedImageOverlay);标题(“分段叠加图像”);

参考文献

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

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

参考

(MATLAB编码器)|(MATLAB编码器)|

関連するトピック