主要内容

基于U-Net的ARM Neon目标语义分割应用代码生成

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

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

先决条件

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

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

  • 编译器和库的环境变量

  • MATLAB®编码器™

  • MATLAB编码接口的深度学习库支持包

  • 深度学习工具箱™

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

这个例子在MATLAB Online中不支持。

概述U-Net

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

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

本例使用Hamlin Beach State Park Data[2]和预训练的U-Net网络对每个像素进行正确分类。

本例使用的U-Net经过训练,将像素分割为18个类,其中包括:

0.其他类/图像边界野餐桌上14。草1。路标8。黑色木板15。沙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入口点函数

segmentationUnetARM.m入口点函数对输入图像进行patch - wise语义分割multispectralUnet.mat文件。对象加载网络对象multispectralUnet.mat文件到一个持久变量mynet并在后续的预测调用中重用持久变量。

类型(“segmentationUnetARM.m”
% OUT = segmentationUnetARM(IM)返回一个语义分割的%图像,该图像使用网络multispectralUnet进行分割。这个分割%是在大小为256,256的patch上对输入图像进行的。The MathWorks, Inc.函数出= segmentationUnetARM(im) %#codegen persistent mynet;if isempty(mynet) mynet = code . loaddeeplearningnetwork ('trainedUnet/multispectralUnet.mat');输入数据必须填充到与网络输入大小兼容的大小。这个input_data被填充,以便在每个大小(网络输入大小)[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);

获得预先训练的U-Net DAG网络对象

下载multispectralUnet.mat文件并加载U-Net DAG网络对象。

如果~ (“trainedUnet / multispectralUnet.mat”“文件”) trainedUnet_url =“//www.ru-cchi.com/supportfiles/vision/data/multispectralUnet.mat”;downloadUNet (trainedUnet_url pwd);结束
ld =负载(“trainedUnet / multispectralUnet.mat”);网= 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- height数组。在MATLAB中,多通道图像被排列为宽度-高度- numchannels数组。要重塑数据,使通道处于第三维度,可以使用helper函数,switchChannelsToThirdPlane

test_data = switchChannelsToThirdPlane (test_data);

确认数据具有正确的结构(通道最后)。

test_data

此示例使用完整Hamlin Beach State Park数据集的裁剪版本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 = coder.config (“自由”);cfg。TargetLang =“c++”;cfg。GenCodeOnly = true;

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

创建一个编码器。ARMNEONConfig对象。指定目标ARM处理器的库版本和体系结构。例如,假设目标板是HiKey/Rock960板,具有ARMv8架构,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 =负载(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、系统(['sshpass -p密码SCP -r 'zipFileName fullfile (pwd)“username@targetname: targetDir /”]),结束如果isunix系统('sshpass -p password ssh username@targetname "if [-d targetDir/unet_predict];然后rm -rf targetDir/unet_predict;fi”),结束如果isunix、系统(['sshpass -p password ssh username@targetname "unzip targetDir/'zipFileName“- d targetDir / unet_predict””]),结束如果isunix、系统(['sshpass -p password 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 '解压缩targetDir/'zipFileName“- d targetDir / unet_predict””]),结束如果ispc、系统(['plink.exe -l username -pw password targetname ' rm -rf targetDir/'zipFileName“””]),结束

将支持文件复制到目标硬件

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

  • 输入数据,input_data.txt

  • 用于创建库的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密码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 password unet_predict_rtw. '可username@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编码器进行深度学习的先决条件.的ARM_ARCH变量在Makefile中用于传递基于ARM架构的编译器标志。的ARM_VER变量在Makefile中被用来编译基于ARM Compute库版本的代码。

在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. '可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 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(高度)“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 password username@targetname:targetDir/unet_predict/output_data.txt ./'),结束

将输出数据存储在变量中segmentedImage

segmentedImage = uint8 (importdata (“output_data.txt”));segmentedImage =重塑(segmentedImage(高度、宽度));

若要只提取分割图像的有效部分,请将其乘以输入数据的掩码通道。

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

方法去除噪声和杂散像素medfilt2函数。

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

显示U-Net分段数据

这行代码创建了类名的向量。

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

将标签覆盖在分割后的RGB测试图像上,并在分割后的图像上添加一个颜色条。

显示输入数据

图(1);imshow (histeq (input_data (:,: 1:3)));标题(输入图像的);

提出=喷气(元素个数(类名);segmentedImageOut = labeloverlay(imadjust(input_data(:,:,4:6),[0 0.6],[0.1 0.9],0.55),segmentedImage,“透明”0,“Colormap”,提出);图(2);imshow (segmentedImageOut);

显示分割数据

标题(“手臂使用Codegen分割图像”);N =元素个数(类名);蜱虫= 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);标题(“分段显示图片”);

参考文献

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

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

所使用的数据是哈姆林海滩州立公园数据的一部分。可以使用以下步骤下载数据以进行进一步评估。

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

另请参阅

|||

相关的话题

Baidu
map