此示例演示如何为使用深度学习的图像分割应用程序生成代码Codegen.
命令生成一个静态库,该库对U-Net的DAG Network对象执行预测。U-Net是一个用于图像分割的深度学习网络。
对于一个类似的例子,它使用U形网的图像分割,但不使用Codegen.
命令,看到基于深度学习的多光谱图像语义分割(图像处理工具箱).
支持NEON延伸并具有至少3GB的RA金宝appM ARM处理器
ARM计算库(目标ARM硬件)
编译器和库的环境变量
MATLAB®编码器™
MATLAB编码器接口深度学习库支持包金宝app
深度学习工具箱™
本例使用的ARM计算库版本可能不是代码生成支持的最新版本。金宝app有关库支持的版本和环境变量的信息,请参见金宝app使用MATLAB编码器进行深入学习的先决条件.
这个例子不是在MATLAB在线支持。金宝app
U形网[1]是一种设计用于语义图像分割卷积神经网络(CNN)的。在U形网,初始系列卷积层被穿插最大池层,依次降低输入图像的分辨率。这些层后面是一系列与上采样运算符,依次增加输入图像的分辨率穿插卷积层。的这两个系列的路径的组合构成一个U形曲线图。在U-Net网络最初被训练以在生物医学图像分割的应用程序执行预测。这个例子说明了网络的一段时间来跟踪森林覆盖面积变化的能力。环保部门砍伐森林跟踪评估和限定一个区域的环境和生态健康。
基于深度学习的语义分割可以从高分辨率航空照片中获得精确的植被覆盖测量值。这种计算的挑战之一是区分具有相似视觉特征的类,例如将绿色像素分类为草、灌木或树。为了提高分类精度,一些数据集包含多光谱图像,提供关于每个像素的额外信息。例如,哈姆林海滩州立公园的数据集用近红外通道补充了彩色图像,提供了更清晰的分类。
本例使用Hamlin Beach州立公园数据[2]以及预训练的U-Net网络对每个像素进行正确分类。
这个例子使用的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
segmentationUnetARM
入口点函数的分段单位m入口点函数执行通过使用包含在所述网络multispectralUnet patchwise对输入图像语义分割multispectralUnet.mat
文件。函数从multispectralUnet.mat
文件到持久变量中我的网
并在后续的预测调用中重用持久变量。
类型(“segmentationUnetARM.m”)
% OUT = segmentationUnetARM(IM)返回一个语义分割的%图像,它是使用网络多光谱unet分割的。这个分割%是在大小为256,256的小块上对输入图像进行patchwise的分割。% % Copyright 2019-2020 The MathWorks, Inc. function out = segmentationUnetARM(im) %#codegen persistent mynet;if isempty(mynet) mynet = code . loaddeeplearningnetwork ('trainedUnet/multispectralUnet.mat');输入数据必须被填充到与网络输入大小兼容的大小。这个input_data被填充,以便%在每个大小(Network Input size) [height, width, nChannel] = size(im)的patch上执行语义分割;补丁=编码器。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);
下载multispectralUnet.mat
文件,并加载U-Net DAG网络对象。
如果〜存在(“trainedUnet / multispectralUnet.mat”,'文件') trainedUnet_url ='//www.tatmou.com/金宝appsupportfiles/vision/data/multispectralUnet.mat';downloadUNet(trainedUnet_url,PWD);结束
ld=负载(“trainedUnet / multispectralUnet.mat”);网= ld.net;
DAG网络包含58层,包括卷积、最大池、深度连接和像素分类输出层。要显示深度学习网络架构的交互式可视化,请使用分析网络
(深学习工具箱)函数。
analyzeNetwork(净值);
下载哈姆林海滩州立公园的数据。
如果〜存在(完整文件(PWD,'数据'),“dir”) url =“http://www.cis.rit.edu/ ~ rmk6217 / rit18_data.mat”;downloadHamlinBeachMSIData(URL,PWD +“/data/”);结束
加载和检查MATLAB中的数据。
负载(fullfile (pwd,'数据',“rit18_data”,“rit18_data.mat”));
检查数据
谁测试数据
图像有七个通道。RGB颜色通道是第四、第五和第六个图像通道。前三个通道对应于近红外波段,并根据其热特征突出显示图像的不同组成部分。通道7是指示有效分割区域的遮罩。
多光谱图像数据按宽高阵列排列为多通道。在MATLAB中,多通道图像按多通道阵列按宽高排列。要重塑数据,使通道处于三维,请使用辅助函数,切换通道至第三车道
.
TEST_DATA = switchChannelsToThirdPlane(TEST_DATA);
确认数据具有正确的结构(通道最后)。
谁测试数据
本例使用完整的Hamlin Beach State Park数据集的裁剪版本测试数据
变量包含。裁剪对象的高度和宽度测试数据
创建变量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]);
输入数据(:,:,1:3)=测试数据CROPRGB;输入数据(:,:,4:6)=测试数据CROPFRARED;输入数据(:,:,7)=测试数据CROPMAK;
检查input_data
多变的。
谁(“输入数据”);
将输入数据写入文本文件,该文本文件作为输入传递给生成的可执行文件。
WriteInputDatatoTxt (input_data);[height, width, channels] = size(input_data);
若要生成以ARM为基础的设备的代码,请为库创建配置对象。不要为可执行程序创建配置对象。只需生成配置对象即可生成C++源代码。
cfg = coder.config (“自由”);cfg.targetlang ='C ++';cfg.GenCodeOnly = TRUE;
创建一个coder.ARMNEONConfig
对象。指定目标ARM处理器的库版本和架构。例如,假设目标板是一个具有ARMv8架构和ARM计算库版本19.05的HiKey/Rock960板。
dlcfg=coder.DeepLearningConfig(“arm-compute”);dlcfg.ArmComputeVersion =“19.05”;dlcfg。ArmArchitecture =‘armv8’;
分配深度学习配置
属性的代码生成配置对象cfg
到深度学习配置对象dlcfg
.
cfg。DeepLearningConfig = dlcfg;
Codegen.
Codegen.-Config.cfgsegmentationUnetARMarg游戏{(大小(input_data) uint16)}-D.unet_predict-报告
代码生成在unet_predict
位于主机上当前工作目录中的文件夹。
帕克恩戈
的帕克恩戈
函数将所有相关文件打包成压缩的zip文件。
zipFileName = 'unet_predict.zip';bInfo =负载(完整文件( 'unet_predict', 'buildInfo.mat'));packNGo(bInfo.buildInfo,{ '文件名',zipFileName, 'minimalHeaders',假, 'ignoreFileMissing',真});
生成的zip文件的名称为unet_.zip
.
复制zip文件到目标硬件板。将zip文件的内容解压到一个文件夹中,并从硬件中删除该zip文件。
在下面的命令,替换:
密码
您的密码
用户名
使用您的用户名
TARGETNAME
上面写着你的设备名
TARGETDIR
使用文件的目标文件夹
在Linux®平台上,要在目标硬件上传输和解压缩zip文件,请运行以下命令:
如果isunix系统(['sshpass -p密码SCP -r'完整文件(pwd,zipFileName)'用户名@ TARGETNAME:TARGETDIR /']),结束如果isunix系统('sshpass -p密码SSH用户名@ TARGETNAME “如果[-d TARGETDIR / unet_predict];然后室射频TARGETDIR / unet_predict;科幻”'),结束如果isunix系统(['sshpass-p密码sshusername@targetname“解压缩targetDir/”zipFileName“- d targetDir / unet_predict””]),结束如果isunix系统(['sshpass -p password ssh username@targetname "rm -rf targetDir/'zipFileName“']),结束
在Windows®平台上,要在目标硬件上传输和解压缩zip文件,请运行以下命令:
如果ispc、系统(['pscp.exe -pw password -r '完整文件(pwd,zipFileName)'用户名@ 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用户名-pw密码targetname“rm-rf targetDir/”zipFileName“']),结束
将这些文件从主机复制到目标硬件:
输入数据,input_data.txt
用于创建库的Makefile,预测
用于构建可执行程序的Makefile,makefile_unet_arm_generic.mk
在下面的命令,替换:
密码
您的密码
用户名
使用您的用户名
TARGETNAME
上面写着你的设备名
TARGETDIR
使用文件的目标文件夹
在Linux®平台上,要将支持文件传输到目标硬件,请运行以下命令:金宝app
如果isunix系统('sshpass -p password SCP unet_predict_rtw. '可username@targetname: targetDir / unet_predict /),结束如果isunix系统('sshpass-p password scp input_data.txtusername@targetname:targetDir/unet_predict/'),结束如果isunix系统('sshpass -p密码SCP makefile_unet_arm_generic.mk用户名@ TARGETNAME:TARGETDIR / unet_predict /'),结束
在Windows®平台,支持文件传输到目标硬件,运行以下命令:金宝app
如果ISPC,系统('pscp.exe -pw密码unet_predict_rtw.mk用户名@ TARGETNAME:TARGETDIR / unet_predict /'),结束如果ISPC,系统('pscp.exe -pw password input_data.txt username@targetname:targetDir/unet_predict/'),结束如果ISPC,系统('pscp.exe -pw password makefile_unet_arm_generic. '可username@targetname: targetDir / unet_predict /),结束
要在目标硬件上构建库,请在ARM硬件上执行生成的makefile。
确保设置了环境变量ARM_COMPUTELIB
和LD_LIBRARY_PATH
在目标硬件上。看到使用MATLAB编码器进行深入学习的先决条件这个臂弓
变量在Makefile中使用,以传递基于ARM架构的编译器标志。的ARM_VER
变量在生成文件用于编译基于ARM计算库的版本的代码。
在Linux主机平台上,运行以下命令来构建库:
如果isunix系统(['sshpass-p密码sshusername@targetname“make-C targetDir/unet\u predict/-f unet\u predict\u rtw.mk ARM\u 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 "可ARM_ARCH = 'dlcfg。ArmArchitecture'ARM_VER ='dlcfg.ArmComputeVersion' "']),结束
在这些命令中,替换TARGETDIR
与其中产生的库中的目标文件夹。变量高度
,宽度
,渠道
表示输入数据的维度。
main_unet_arm_generic.cpp
是c++主包装器文件,它调用segmentationUnetARM函数并将输入图像传递给它。使用包装器文件构建库以创建可执行文件。
在Linux主机平台,以创建可执行文件,运行以下命令:
如果isunix系统('sshpass -p password scp main_unet_arm_generic.cpp username@targetname:targetDir/unet_predict/'),结束如果isunix系统(['sshpass-p密码sshusername@targetname“make-C targetDir/unet\u predict/IM\u H=”num2str(高度)“我是……”num2str(宽度)'IM_C ='num2str(渠道)“-f makefile_unet_arm_generic.mk”]),结束
在Windows主机平台上,要创建可执行文件,请运行以下命令:
如果ISPC,系统('pscp.exe -pw password 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(高度)“我是……”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
(2001x2001x7),它是更易于加工在补丁输入图像。可执行将输入图像划分为多个补丁,每个对应于网络的输入大小。在每次一个特定补丁的像素,然后可执行执行预测所有补丁结合在一起。
复制生成的输出文件output_data.txt
回到当前的MATLAB会话。在Linux平台上,运行:
如果isunix系统('sshpass -p password scp username@targetname:targetDir/unet_predict/output_data.txt ./'),结束
为了执行在Windows平台上相同的动作,运行:
如果ISPC,系统('pscp.exe -pw密码用户名@ TARGETNAME:TARGETDIR / unet_predict / output_data.txt ./'),结束
将输出数据存储在变量中segmentedImage
:
segmentedImage = uint8 (importdata ('output_data.txt'));segmentedImage =重塑(segmentedImage(高度、宽度));
为了只提取分割图像的有效部分,将其乘以输入数据的掩码通道。
SegmenteImage=uint8(输入数据(:,:,7)~=0)。*SegmenteImage;
通过使用去除噪声和杂散像素医疗过滤器2
函数。
SegmenteImage CodeGen=medfilt2(SegmenteImage[5,5]);
这行代码创建一个类名向量;
覆盖分割RGB测试图像上的标签和一个颜色条添加到分割的图像。
显示输入数据
图(1);imshow (histeq (input_data (:,: 1:3)));标题(“输入图像”);
提出=喷气(元素个数(类名);[0 0 0],[0 0 0],[0 0 0],[0 0 0],[0 0 0],“透明”,0,“彩色地图”,提出);图(2);imshow (segmentedImageOut);
显示分割数据
标题(“上ARM使用代码生成分割图像”);N =元素个数(类名);蜱虫= 1 / (N * 2): 1 / N: 1;colorbar (“滴答声标签”,cellstr(类名),“滴答声”蜱虫,“滴答声长度”,0,“TickLabelInterpreter”,“没有”);颜色表(CMAP)
显示分段叠加图像
segmentedImage = labeloverlay(input_data(:,:,4:6),[0 0.6],[0.1 0.9],0.55),segmentedImage,“透明”,0.7%,“彩色地图”,提出);图(3);imshow(segmentedImageOverlay);标题(“分段叠加图像”);
[1] Ronneberger,奥拉夫,菲利普费,和Thomas是BrOx。“U-网:卷积网络的医学图像分割。”预印本的arXiv的arXiv:1505.04597,2015.
R. Kemker, C. Salvaggio和C. Kanan。用于语义分割的高分辨率多光谱数据集。2017年,abs / 1703.01918。
[3] 所使用的参考输入数据是Hamlin Beach州立公园数据的一部分。可以使用以下步骤下载数据以进行进一步评估。
如果〜存在(完整文件(PWD,'数据'))网址=“http://www.cis.rit.edu/ ~ rmk6217 / rit18_data.mat”;downloadHamlinBeachMSIData(URL,PWD +“/data/”);结束
coder.ARMNEONConfig
|coder.DeepLearningConfig
|coder.hardware
|帕克恩戈