U-Netを使用する手臂氖ターゲットでのセマンティックセグメンテーションアプリケーションのコード生成
この例では,深層学習を使用するイメージセグメンテーションアプリケーションのコードを生成する方法を示します。codegen
コマンドを使用して,U-NetのDAGネットワークオブジェクトに対して予測を実行するスタティックライブラリを生成します。U-Netは,e - netは,e - netメ,e - netジセグメンテ,e - netション用の深層学習ネットワ,e - netクです。
U-Netを使用したe - netを使用したe - netメcodegen
コマンドを使用せずに示す類似例にいては,深層学習を使用したマルチスペクトルメジのセマンティックセグメンテション(图像处理工具箱)を参照してください。
必要条件
霓虹灯拡張をサポトし,3gb以上のramを備えたarm®プロセッサ
ARM计算库(タ,ゲット,ARMハ,ドウェア上)
コンパ▪▪ラおよびラ▪▪ブラリの環境変数
MATLAB®编码器™
MATLAB编码器接口的深度学习库サポ,トパッケ,ジ
深度学习工具箱™
この例で使用する臂计算库のバージョンは,コード生成でサポートされている最新バージョンではない可能性があります。サポトされているラブラリのバジョンと環境変数の詳細にいては,MATLAB编码器を使用した深層学習の前提条件を参照してください。
この例はMATLAB在线ではサポ,トされていません。
U-Netの概要
U-Net[1]は畳み込みニューラルネットワーク(CNN)の一種で,セマンティックイメージセグメンテーション用に設計されています。U-Netでは,最初の一連の畳み込み層に最大プーリング層が点在し,入力イメージの解像度を逐次下げていきます。これらの層に,一連の畳み込み層が続き,その中にアップサンプリング演算子が点在し,入力イメージの解像度を逐次上げていきます。これらの2の一連の経路を組み合わせるとu字型の図が形成されます。U-Netネットワークは,元は生物医学のイメージセグメンテーションアプリケーションで予測を実行するために学習が行われていました。この例は,このネットワ,クで時間の経過に伴う森林被覆の変化を追跡できることを示しています。環境保護機関は,森林伐採を追跡し,地域の環境的生態学的健全性を評価し特定します。
深層学習ベースのセマンティックセグメンテーションにより,高解像度の航空写真から植被を正確に測定できます。このような計算の課題の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
エントリポ@ @ント関数segmentationUnetARM
エントリポ@ @ント関数segmentationUnetARM.mは,multispectralUnet.mat
ファイルに含まれているmultispectralUnetネットワークを使用して,入力イメージに対してパッチ単位のセマンティックセグメンテーションを実行します。この関数は,ネットワ,クオブジェクトをmultispectralUnet.mat
ファ@ @ルから永続変数mynet
に読み込み,以降の予測呼び出しではその永続変数を再利用します。
类型(“segmentationUnetARM.m”)
% OUT = segmentationUnetARM(IM)返回一个语义分段的%图像,该图像使用网络multispectralUnet进行分段。这个分割%是在大小为256,256的patch上对输入图像逐个补丁执行的。The MathWorks, Inc. function out = segmentationUnetARM(im) %#codegen persistent mynet;if isempty(mynet) mynet = code . loaddeeplearningnetwork ('trainedUnet/multispectralUnet.mat');输入数据必须填充到与网络输入大小兼容的大小。这个input_data被填充,以便在大小(网络输入大小)[height, width, nChannel] = size(im)的每个补丁上%执行语义分割;补丁=编码器。nullcopy(0 ([256,256, nChannel-1]));% padSize = 0 (1,2);padSize(1) = 256 - mod(高度,256); padSize(2) = 256 - mod(width, 256); % % Pad image must have have dimensions as multiples of network input dimensions 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:256:height_pad for j =1:256:width_pad for p = 1:nChannel -1 patch(:,:,p) = squeeze( im( i:i+255,... j:j+255,... 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+255, j:j+255) = patch_seg; end end % Remove the padding out = out(1:height, 1:width);
事前学習済みのU-Net DAGネットワ,クオブジェクトの取得
multispectralUnet.mat
ファルをダウンロドしてU-Net DAGネットワクオブジェクトを読み込みます。
如果~ (“trainedUnet / multispectralUnet.mat”,“文件”) trainedUnet_url =“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/vision/data/multispectralUnet.mat”;downloadUNet (trainedUnet_url pwd);结束
Ld =负载(“trainedUnet / multispectralUnet.mat”);Net = ld.net;
このDAGネットワークには,畳み込み層,最大プーリング層,深さ連結層,ピクセル分類出力層など,58個の層が含まれています。深層学習ネットワ,クア,キテクチャを対話的に可視化して表示するには,関数analyzeNetwork
(深度学习工具箱)を使用します。
analyzeNetwork(净);
入力デ,タの準備
ハ,ムリンビ,チ州立公園のデ,タをダウンロ,ドします。
如果~ (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
►►►►►►►►►►►►►►►►►►►►►►►►►►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
に含まれているハ,ムリンビ,チ州立公園の完全なデ,タセットのトリミングバ,ジョンを使用します。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”);
生成される実行可能ファ@ @ルに入力として渡されるテキストファ@ @ルに入力デ@ @タを書き込みます。
WriteInputDatatoTxt (input_data);[height, width, channels] = size(input_data);
スタティックラ▪▪ブラリ用のコ▪▪ド生成構成オブジェクトの設定
手臂ベースのデバイスをターゲットにしたコードを生成するには,ライブラリ用の構成オブジェクトを作成します。実行可能プログラム用の構成オブジェクトは作成しないでください。c++ソ,スコ,ドの生成用の構成オブジェクトのみを設定します。
CFG = code .config(“自由”);cfg。TargetLang =“c++”;cfg。GenCodeOnly = true;
深層学習コ,ド生成用の構成オブジェクトの設定
编码器。ARMNEONConfig
オブジェクトを作成します。タゲットarmプロセッサのラブラリバジョンとアキテクチャを指定します。たとえば,ターゲットボードがARMv8アーキテクチャと臂计算库19.05版本を備えたHiKey / Rock960ボードであるとします。
DLCFG =编码器。DeepLearningConfig (“arm-compute”);dlcfg。ArmComputeVersion =“19.05”;dlcfg。ArmArchitecture =“armv8”;
コ,ド生成構成オブジェクトcfg
のDeepLearningConfig
プロパティを深層学習構成オブジェクトdlcfg
に割り当てます。
cfg。DeepLearningConfig = dlcfg;
codegen
を使用したc++ソスコドの生成
codegen配置cfgsegmentationUnetARMarg游戏{(大小(input_data) uint16)}- dunet_predict报告
コ,ドは,ホストコンピュ,タ,上の現在の作業ディレクトリにあるunet_predict
フォルダ,に生成されます。
packNGo
を使用したzipファ目录ルの生成
関数packNGo
は,すべての関連ファルをzip圧縮ファ。
zipFileName = 'unet_predict.zip';bInfo = load(fullfile('unet_predict','buildInfo.mat'));packNGo (bInfo。buildInfo, {'fileName', zipFileName,'minimalHeaders', false, 'ignoreFileMissing',true});
生成されたzipファ目录ルの名前はunet_predict.zip
です。
タゲットハドウェアへの生成されたzipファルのコピ
Zipファルをタゲットハドウェアボドにコピします。Zipファルの内容をフォルダに解凍し,Zipファルをハドウェアから削除します。
次のコマンドで,置換を行います。
密码
をパスワ,ドで置き換える用户名
をユ,ザ,名で置き換えるtargetname
をデバ@ @スの名前で置き換えるtargetDir
をファルのコピ先フォルダで置き換える
Linux®プラットフォームで,zipファイルをターゲットハードウェアに転送して解凍するには,次のコマンドを実行します。
如果isunix、系统([密码:SCP -rzipFileName fullfile (pwd)“username@targetname: targetDir /”]),结束如果isunix系统('sshpass -p password ssh username@targetname "if [-d targetDir/unet_predict];然后rm -rf targetDir/unet_predict;fi”),结束如果isunix、系统([ssh username@targetname "unzip targetDir/ "zipFileName“-d targetDir/unet_predict”]),结束如果isunix、系统(['ssh username@targetname "rm -rf targetDir/'zipFileName“””]),结束
Windows®プラットフォームで,zipファイルをターゲットハードウェアに転送して解凍するには,次のコマンドを実行します。
如果ispc、系统(['pscp.exe -pw密码-r 'zipFileName fullfile (pwd)“username@targetname: targetDir /”]),结束如果ispc系统('plink.exe -l username -pw password targetname "if [-d targetDir/unet_predict];然后rm -rf targetDir/unet_predict;fi”),结束如果ispc、系统(['plink.exe -l username -pw password targetname "unzip targetDir/'zipFileName“-d targetDir/unet_predict”]),结束如果ispc、系统(['plink.exe -l username -pw password targetname "rm -rf targetDir/'zipFileName“””]),结束
タゲットハドウェアへのサポトファルのコピ
次のファ。
入力デ,タ
input_data.txt
ラaapl . exeブラリを作成するためのmakefile
unet_predict_rtw.mk
実行可能プログラムをビルドするためのmakefile
makefile_unet_arm_generic.mk
次のコマンドで,置換を行います。
密码
をパスワ,ドで置き換える用户名
をユ,ザ,名で置き換えるtargetname
をデバ@ @スの名前で置き換えるtargetDir
をファルのコピ先フォルダで置き換える
Linux®プラットフォームで,サポートファイルをターゲットハードウェアに転送するには,次のコマンドを実行します。
如果isunix系统('sshpass -p password SCP unet_predict_rtw. '可username@targetname: targetDir / unet_predict /),结束如果isunix系统('sshpass -p password scp input_data.txt username@targetname:targetDir/unet_predict/'),结束如果isunix系统('sshpass -p password SCP makefile_unet_arm_generic. '可username@targetname: targetDir / unet_predict /),结束
Windows®プラットフォームで,サポートファイルをターゲットハードウェアに転送するには,次のコマンドを実行します。
如果ispc系统('pscp.exe -pw密码unet_predict_rtw。可username@targetname: targetDir / unet_predict /),结束如果ispc系统('pscp.exe -pw密码input_data.txt username@targetname:targetDir/unet_predict/'),结束如果ispc系统(“pscp.exe -pw密码makefile_unet_arm_generic. exe”可username@targetname: targetDir / unet_predict /),结束
タゲットハドウェアでのラブラリのビルド
ターゲットハードウェアでライブラリをビルドするには,生成されたmakefileを手臂ハードウェアで実行します。
環境変数ARM_COMPUTELIB
とLD_LIBRARY_PATH
をタ,ゲットハ,ドウェアで設定していることを確認してください。MATLAB编码器を使用した深層学習の前提条件を参照してください。変数ARM_ARCH
は、手臂アーキテクチャに基づいてコンパイラフラグを渡すためにmakefileで使用されます。変数ARM_VER
は,手臂计算库のバージョンに基づいてコードをコンパイルするためにmakefileで使用されます。
Linuxホストプラットフォムでは,次のコマンドを実行してラブラリをビルドします。
如果isunix、系统(['sshpass -p password ssh username@targetname "make -C targetDir/unet_predict/ -f unet_predict_rtw。可ARM_ARCH = 'dlcfg。ArmArchitecture“ARM_VER = 'dlcfg。ArmComputeVersion“””]),结束
Windowsホストプラットフォ,ムでは,次のコマンドを実行してラ,ブラリをビルドします。
如果ispc、系统(['plink.exe -l username -pw password targetname "make -C targetDir/unet_predict/ -f unet_predict_rtw. exe -l username -pw password targetname "可ARM_ARCH = 'dlcfg。ArmArchitecture“ARM_VER = 'dlcfg。ArmComputeVersion“””]),结束
タゲットでの実行可能ファルの作成
次のコマンドで,targetDir
をラ▪▪ブラリの生成先フォルダ▪▪で置き換えます。変数高度
、宽度
および渠道
は,入力デ,タの次元を表します。
main_unet_arm_generic.cpp
は,関数segmentationUnetARMを呼び出してその関数に入力イメージを渡すc++メインラッパーファイルです。このラッパファルを使用してラブラリをビルドし,実行可能ファルを作成します。
Linuxホストプラットフォムで実行可能ファルを作成するには,次のコマンドを実行します。
如果isunix系统('sshpass -p password scp main_unet_arm_generic.cpp username@targetname:targetDir/unet_predict/'),结束如果isunix、系统(['sshpass -p password ssh username@targetname "make -C targetDir/unet_predict/ IM_H='num2str(高度)“IM_W = 'num2str(宽度)“IM_C = 'num2str(渠道)-f makefile_unet_arm_generic.mk"]),结束
Windowsホストプラットフォームで実行可能ファイルを作成するには,次のコマンドを実行します。
如果ispc系统('pscp.exe -pw密码main_unet_arm_generic.cpp username@targetname:targetDir/unet_predict/'),结束如果ispc、系统(['plink.exe -l username -pw password targetname "make -C targetDir/unet_predict/ IM_H='num2str(高度)“IM_W = 'num2str(宽度)“IM_C = 'num2str(渠道)-f makefile_unet_arm_generic.mk"]),结束
タゲットハドウェアでの実行可能ファルの実行
入力▪▪メ▪▪ジファ▪▪ルinput_data.txt
を使用して、タ、ゲットハ、ドウェアで実行可能ファ、ルを実行します。
Linuxホストプラットフォ,ムでは,次のコマンドを実行します。
如果isunix系统('sshpass -p password ssh username@targetname "cd targetDir/unet_predict/;./unet input_data.txt output_data.txt"'),结束
Windowsホストプラットフォ,ムでは,次のコマンドを実行します。
如果ispc系统('plink.exe -l username -pw password targetname "cd targetDir/unet_predict/;./unet input_data.txt output_data.txt"'),结束
unet
実行可能ファ▪▪ルは入力デ▪▪タを受け入れます。input_data
のサイズが大きいため(2001 x 2001 x 7),入力イメージはパッチで処理する方が簡単です。この実行可能ファイルは入力イメージを複数のパッチに分割し,パッチはそれぞれネットワーク入力サイズに対応します。実行可能ファイルは,一度に1つの特定パッチ内のピクセルに対して予測を実行してから,すべてのパッチを結合します。
タ,ゲットハ,ドウェアからmatlabへの出力の転送
生成された出力ファ@ @ルoutput_data.txt
をコピして現在のmatlabセッションに戻します。Linuxプラットフォ,ムでは,次を実行します。
如果isunix系统('sshpass -p password scp username@targetname:targetDir/unet_predict/output_data.txt ./'),结束
Windowsプラットフォ,ムで同じアクションを実行するには,次を実行します。
如果ispc系统('pscp.exe -pw密码username@targetname:targetDir/unet_predict/output_data.txt ./'),结束
変数segmentedImage
に出力デ,タを格納します。
分段数据= uint8(importdata(“output_data.txt”));segmentedImage =重塑(segmentedImage,[高度,宽度]);
セグメント化されたイメージの有効な部分だけを抽出するには,そのイメージに入力データのマスクチャネルを乗算します。
segmentedImage = uint8(input_data(:,:,7)~=0) .* segmentedImage;
関数medfilt2
を使用してノ@ @ズと散在ピクセルを取り除きます。
segmentedImageCodegen = medfilt2(segmentedImage,[5,5]);
U-Netのセグメント化されたデ,タの表示
次のコ,ド行は,クラス名のベクトルを作成します。
classNames = net.Layers(end).Classes;disp(类名);
セグメント化されたRGBテストイメージにラベルを重ね合わせ,このセグメント化されたイメージにカラーバーを追加します。
入力デ,タを表示します。
图(1);imshow (histeq (input_data (:,: 1:3)));标题(输入图像的);
cmap = jet(编号(classNames));segmentedImageOut = labeloverlay(imadjust(input_data(:,:,4:6),[0 0.6],[0.1 0.9],0.55),segmentedImage,“透明”0,“Colormap”,提出);图(2);imshow (segmentedImageOut);
セグメント化されたデ,タを表示します。
标题(“在ARM上使用Codegen分割图像”);N = number (classNames);ticks = 1/(N*2):1/N:1;colorbar (“TickLabels”cellstr(类名),“滴答”蜱虫,“TickLength”0,“TickLabelInterpreter”,“没有”);colormap城市规划机构(cmap)
セグメント化されたオ,バ,レ。
segmentedImageOverlay = labeloverlay(imadjust(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:1505.04597,2015.
[2] Kemker, R., C. Salvaggio, C. Kanan。用于语义分割的高分辨率多光谱数据集CoRR, abs/1703.01918, 2017。
[3]使用する基準入力デタは,ハムリンビチ州立公園のデタの一部です。以下の手順を使用すると,さらに評価するためのデ,タをダウンロ,ドできます。
如果~ (fullfile (pwd,存在“数据”)) url =“http://www.cis.rit.edu/ ~ rmk6217 / rit18_data.mat”;downloadHamlinBeachMSIData (url, pwd +“/数据/”);结束
参考
编码器。ARMNEONConfig
|编码器。DeepLearningConfig
|coder.hardware
|packNGo