主要内容

ARM®Neon目标上使用U-Net的语义分割应用代码生成

这个例子展示了如何为一个使用深度学习的图像分割应用程序生成代码。它使用codegen命令生成一个静态库,在U-Net的DAG网络对象上执行预测。U-Net是一个用于图像分割的深度学习网络。

对于类似的示例,使用U-Net进行图像分割,但不使用codegen命令,看到基于深度学习的多光谱图像语义分割(图像处理工具箱)

先决条件

  • ARM处理器,支持NEON扩展,内存至金宝app少3GB

  • ARM计算库(在目标ARM硬件上)

  • 编译器和库的环境变量

  • MATLAB®编码器™

  • MATLAB编码器接口的深度学习库支持包金宝app

  • 深度学习工具箱™

本例使用的ARM Compute库版本可能不是代码生成支持的最新版本。金宝app有关受支持的库版本和环境变量的信息,请参见金宝app用MATLAB编码器进行深度学习的先决条件

此示例在MATLAB Online中不支金宝app持。

U-Net概述

U-Net[1]是一种用于语义图像分割的卷积神经网络(CNN)。在U-Net中,在初始的卷积层序列中穿插最大池化层,依次降低输入图像的分辨率。这些层之后是一系列卷积层,其中点缀着上采样算子,依次增加输入图像的分辨率。这两条串联路径的组合形成了一个u型图。U-Net网络最初被训练用于生物医学图像分割应用的预测。这个例子展示了该网络跟踪森林覆盖随时间变化的能力。环境机构跟踪森林砍伐情况,以评估和评估一个地区的环境和生态健康状况。

基于深度学习的语义分割可以从高分辨率航空照片中获得精确的植被覆盖测量。这种计算的挑战之一是区分具有相似视觉特征的类,例如将绿色像素分类为草、灌木或树。为了提高分类精度,一些数据集包含多光谱图像,提供关于每个像素的额外信息。例如,哈姆林海滩州立公园的数据集用近红外通道补充了彩色图像,提供了更清晰的类别分离。

这个例子使用哈姆林海滩州立公园数据[2]以及预先训练好的U-Net网络来正确地分类每个像素。

本例中使用的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网络对输入图像进行贴片语义分割multispectralUnet.mat文件。方法加载网络对象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.tatmou.com/金宝appsupportfiles/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颜色通道是第四、第五和第六个图像通道。前三个通道对应于近红外波段,并根据其热特征突出显示图像的不同组成部分。通道7是一个掩码,表示有效的分割区域。

多光谱图像数据被排列为numChannels-by-width-by-height数组。在MATLAB中,多通道图像被排列为宽度-高度- numchannels数组。要重塑数据,使通道处于第三维度,请使用helper函数,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);

为静态库设置代码生成配置对象

要生成针对基于arm的设备的代码,请为库创建一个配置对象。不要为可执行程序创建配置对象。设置仅用于生成c++源代码的配置对象。

CFG = code .config(“自由”);cfg。TargetLang =“c++”;cfg。GenCodeOnly = true;

设置深度学习代码生成配置对象

创建一个编码器。ARMNEONConfig对象。指定目标ARM处理器的库版本和体系结构。例如,假设目标板是ARMv8架构的HiKey/Rock960板,ARM计算库版本为19.05。

DLCFG =编码器。DeepLearningConfig (“arm-compute”);dlcfg。ArmComputeVersion =“19.05”;dlcfg。ArmArchitecture =“armv8”

分配DeepLearningConfig代码生成配置对象的属性cfg到深度学习配置对象dlcfg

cfg。DeepLearningConfig = dlcfg;

通过使用生成c++源代码codegen

codegen配置cfgsegmentationUnetARMarg游戏{(大小(input_data) uint16)}- dunet_predict报告

中生成代码unet_predict位于主机计算机上当前工作目录中的文件夹。

通过使用生成Zip文件packNGo

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“””]),结束

复制支持文金宝app件到目标硬件

将这些文件从主机复制到目标硬件:

  • 输入数据,input_data.txt

  • 用于创建库的Makefile,unet_predict_rtw.mk

  • 构建可执行程序的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.txt username@targetname:targetDir/unet_predict/'),结束如果isunix系统('sshpass -p password SCP makefile_unet_arm_generic. '可username@targetname: targetDir / unet_predict /),结束

在Windows®平台上,要将支持文件传输到目标硬件,请运行以下命令:金宝app

如果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 /),结束

在目标硬件上构建库

要在目标硬件上构建库,请在ARM硬件上执行生成的makefile。

确保设置了环境变量ARM_COMPUTELIB而且LD_LIBRARY_PATH在目标硬件上。看到用MATLAB编码器进行深度学习的先决条件.的ARM_ARCH变量在Makefile中用于传递基于ARM架构的编译器标志。的ARM_VER变量在Makefile中使用,基于ARM计算库的版本编译代码。

在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是c++的主包装器文件,它调用segmentationUnetARM函数并将输入图像传递给它。使用包装器文件构建库以创建可执行文件。

在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(2001x2001x7)时,更容易对输入图像进行补丁处理。可执行文件将输入图像分割为多个补丁,每个补丁对应于网络输入大小。可执行文件每次对一个特定补丁中的像素执行预测,然后将所有补丁组合在一起。

将输出从目标硬件传输到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 +“/数据/”);结束

另请参阅

|||

相关的话题