代码生成语义分割应用程序使用U-Net手臂氖目标
这个例子展示了如何为一个图像分割应用程序生成代码,使用深度学习。它使用codegen
命令来生成一个静态库,执行预测为U-Net DAG网络对象。U-Net是图像分割的深入学习网络。
一个类似的例子,使用U-Net图像分割,但不会使用codegen
命令,看到多光谱图像的语义分割使用深度学习(图像处理工具箱)。
先决条件
手臂®处理器支持霓虹灯扩展和至少3 gb万博1manbetx的RAM
目标臂臂计算库(硬件)
环境变量的编译器和库
MATLAB®编码器™
为深度学习MATLAB编码器接口支持包万博1manbetx
深度学习工具箱™
臂计算库版本,这个示例使用可能不是最新版本,代码生成支持。万博1manbetx信息支持版本的库和环境变量,明白了万博1manbetx先决条件与MATLAB编码器深度学习。
这个例子不支持在网上MATLAB。万博1manbetx
概述U-Net
U-Net[1]是一种卷积神经网络(CNN)设计语义图像分割。U-Net,最初的一系列卷积层点缀着麦克斯池层,先后降低输入图像的分辨率。这些层是紧随其后的是一系列的卷积层点缀着upsampling运营商,先后增加输入图像的分辨率。这两个系列的组合路径形成一个u型曲线。U-Net网络最初训练执行预测生物医学图像分割的应用程序。这个例子演示了网络的能力来跟踪变化随着时间的推移森林覆盖。环保机构跟踪砍伐森林的环境和生态健康评估和资格。
基于深度学习的语义分割可以产生一个精确测量植被从高分辨率航空照片。这样计算的挑战之一是区分类,也有类似的视觉特征,如绿色像素分类草,灌木或树。提高分类精度,一些数据集包含多光谱图像每个像素提供额外的信息。例如,哈姆林海滩州立公园补充数据集与近红外通道的彩色图像提供了一个清晰的分离的类。
下面的例子使用了哈姆林海滩州立公园数据[2]和pretrained U-Net网络正确的每个像素进行分类。
这个示例使用的U-Net训练部分像素属于一组18类包括:
0。其他类/图像边界7。野餐桌上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
入口点函数对输入图像执行patchwise语义分割使用multispectralUnet网络中包含multispectralUnet.mat
文件。加载的网络对象的函数multispectralUnet.mat
文件到一个持续的变量mynet
和重用持久变量对后续预测调用。
类型(“segmentationUnetARM.m”)
% = segmentationUnetARM (IM)返回一个语义分割%的形象,这是使用网络multispectralUnet分段。这对输入图像分割%执行patchwise补丁的大小256256。% %版权2019 - 2020 MathWorks公司= segmentationUnetARM函数(im) % # codegen持久mynet;如果isempty (mynet) mynet = coder.loadDeepLearningNetwork (' trainedUnet / multispectralUnet.mat ');结束%输入数据必须垫大小兼容%网络输入的大小。这个input_data垫为了%执行语义细分每个补丁的大小(网络输入大小)(高度、宽度、nChannel) = (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);
得到Pretrained 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”);网= ld.net;
DAG网络包含58层,包括卷积、马克斯•池深度连接和像素分类输出层。显示一个交互式可视化的深度学习网络体系结构,使用analyzeNetwork
(深度学习工具箱)函数。
analyzeNetwork(净);
准备输入数据
下载哈姆林海滩州立公园的数据。
如果~ (fullfile (pwd,存在“数据”),“dir”)url =“http://home.cis.rit.edu/ cnspci /其他/数据/ rit18_data.mat ';downloadHamlinBeachMSIData (url, pwd +“/数据/”);结束
在MATLAB负载和检查数据。
负载(fullfile (pwd,“数据”,“rit18_data”,“rit18_data.mat”));
检查数据
谁test_data
图像有七个频道。RGB颜色通道是第四、第五和第六频道形象。前三个通道对应于图像的近红外波段和突出不同组件基于他们的热量信号。频道7是一个面具,表明有效的分割区域。
多光谱图像数据被安排为numChannels-by-width-by-height数组。在MATLAB,多通道图像排列width-by-height-by-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);大小(高度、宽度、渠道)= (input_data);
建立一个代码生成静态库的配置对象
生成目标代码,一个基于arm的装置,为一个库创建一个配置对象。不为一个可执行程序创建一个配置对象。设置配置对象生成c++的源代码。
cfg = coder.config (“自由”);cfg。TargetLang =“c++”;cfg。GenCodeOnly = true;
设置一个配置对象的深度学习代码生成
创建一个coder.ARMNEONConfig
对象。指定库版本和目标ARM处理器的体系结构。例如,假设目标板是一个HiKey / Rock960板与ARMv8架构和手臂20.02.1计算库版本。
dlcfg = coder.DeepLearningConfig (“arm-compute”);dlcfg.ArmComputeVersion=“20.02.1”;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。zipFileName buildInfo,{“文件名”,“minimalHeaders”,假的,“ignoreFileMissing”,真正});
生成的zip文件的名称unet_predict.zip
。
将生成的压缩文件复制到目标硬件
将zip文件复制到目标硬件。zip文件的内容解压缩到一个文件夹,删除硬件的zip文件。
在以下命令替换:
密码
用你的密码用户名
和你的用户名targetname
与你的设备的名称targetDir
文件的目标文件夹
在Linux®平台,将zip文件并提取目标硬件,运行这些命令:
如果isunix、系统([“sshpass scp - r - p密码”zipFileName fullfile (pwd)“username@targetname: targetDir /”]),结束如果isunix系统(“sshpass ssh - p密码username@targetname“如果[- d targetDir / unet_predict];然后rm射频targetDir / unet_predict;fi”),结束如果isunix、系统([“sshpass ssh - p密码username@targetname“解压targetDir /zipFileName“- d targetDir / unet_predict””]),结束如果isunix、系统([“sshpass ssh - p密码username@targetname“rm射频targetDir / 'zipFileName“””]),结束
在Windows®平台上,将zip文件并提取目标硬件,运行这些命令:
如果ispc、系统([“pscp。exe pw - r的密码zipFileName fullfile (pwd)“username@targetname: targetDir /”]),结束如果ispc系统(“叮铃声。exe - l用户名pw密码targetname“如果[- d targetDir / unet_predict];然后rm射频targetDir / unet_predict;fi”),结束如果ispc、系统([“叮铃声。exe - l用户名pw密码targetname“解压targetDir /zipFileName“- d targetDir / unet_predict””]),结束如果ispc、系统([“叮铃声。exe - l”用户名pw密码targetname rm射频targetDir / 'zipFileName“””]),结束
支持文件拷万博1manbetx贝到目标硬件
复制这些文件从主机到目标硬件:
输入数据,
input_data.txt
Makefile创建图书馆,
unet_predict_rtw.mk
Makefile构建可执行程序,
makefile_unet_arm_generic.mk
在以下命令替换:
密码
用你的密码用户名
和你的用户名targetname
与你的设备的名称targetDir
文件的目标文件夹
在Linux®平台上,支持文件传输到目标硬件,运行这些命令:万博1manbetx
如果isunix系统(“scp unet_predict_rtw sshpass - p密码。可username@targetname: targetDir / unet_predict /),结束如果isunix系统(“scp input_data sshpass - p密码。txt username@targetname: targetDir / unet_predict /),结束如果isunix系统(“scp makefile_unet_arm_generic sshpass - p密码。可username@targetname: targetDir / unet_predict /),结束
在Windows®平台上,支持文件传输到目标硬件,运行这些命令:万博1manbetx
如果ispc系统(“pscp。exe unet_predict_rtw pw密码。可username@targetname: targetDir / unet_predict /),结束如果ispc系统(“pscp。exe input_data pw密码。txt username@targetname: targetDir / unet_predict /),结束如果ispc系统(“pscp。exe makefile_unet_arm_generic pw密码。可username@targetname: targetDir / unet_predict /),结束
构建图书馆在目标硬件
构建图书馆在目标硬件、ARM硬件上执行生成的makefile。
确保你设置环境变量ARM_COMPUTELIB
和LD_LIBRARY_PATH
在目标硬件。看到先决条件与MATLAB编码器深度学习。的ARM_ARCH
变量是用于Makefile通过编译器标志基于ARM架构。的ARM_VER
变量Makefile来编译代码中使用基于ARM的版本计算库。
在Linux主机平台,运行这个命令构建图书馆:
如果isunix、系统([“sshpass ssh - p密码username@targetname“让- c targetDir / unet_predict / - f unet_predict_rtw。可ARM_ARCH = 'dlcfg.ArmArchitecture“ARM_VER = 'dlcfg.ArmComputeVersion“””]),结束
在Windows主机平台上,构建图书馆运行这个命令:
如果ispc、系统([“叮铃声。exe - l用户名pw密码targetname“让- 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系统(“scp main_unet_arm_generic sshpass - p密码。cpp username@targetname: targetDir / unet_predict /),结束如果isunix、系统([“sshpass ssh - p密码username@targetname“让- c targetDir / unet_predict IM_H = 'num2str(高度)“IM_W = 'num2str(宽度)“IM_C = 'num2str(渠道)“- f”makefile_unet_arm_generic.mk”]),结束
在Windows主机上平台,创建可执行文件,运行这些命令:
如果ispc系统(“pscp。exe main_unet_arm_generic pw密码。cpp username@targetname: targetDir / unet_predict /),结束如果ispc、系统([“叮铃声。exe - l用户名pw密码targetname“让- 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 ssh - p密码username@targetname“cd targetDir unet_predict /;。/ unet input_data。txt output_data.txt”),结束
在Windows主机平台上运行这个命令:
如果ispc系统(“叮铃声。exe - l用户名pw密码targetname“cd targetDir unet_predict /;。/ unet input_data。txt output_data.txt”),结束
的unet
可接受输入数据。因为大尺寸的input_data
(2001 x2001x7),更容易处理的输入图像补丁。可执行文件将输入图像分割为多个补丁,每个对应于网络输入的大小。可执行对像素执行预测一个特定的补丁,然后结合一起的所有补丁。
的输出目标硬件转移到MATLAB
复制生成的输出文件output_data.txt
回当前MATLAB会话。在Linux平台上运行:
如果isunix系统(“sshpass - p密码scp username@targetname: targetDir / unet_predict / output_data。txt。/”),结束
在Windows平台上执行相同的操作,运行:
如果ispc系统(“pscp。exe pw密码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.6 [0], [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.6 [0], [0.1 - 0.9], 0.55), segmentedImage,“透明”,0.7,“Colormap”,提出);图(3);imshow (segmentedImageOverlay);标题(“分段显示图片”);
引用
[1]Ronneberger,奥拉夫,菲利普·费舍尔,托马斯Brox。“U-Net:卷积网络生物医学图像分割。”arXiv预印本arXiv: 1505.04597,2015年。
[2]Kemker, R。,C. Salvaggio, and C. Kanan. "High-Resolution Multispectral Dataset for Semantic Segmentation." CoRR, abs/1703.01918, 2017.
[3]参考输入数据使用的是哈姆林海滩国家公园的一部分数据。以下步骤可以用来下载的数据作进一步的评估。
如果~ (fullfile (pwd,存在“数据”))的url =“http://home.cis.rit.edu/ cnspci /其他/数据/ rit18_data.mat ';downloadHamlinBeachMSIData (url, pwd +“/数据/”);结束
[4]Kemker、罗纳德·卡尔Salvaggio,克里斯托弗Kanan。“语义分割算法的多光谱遥感图像使用深度学习。”ISPRS Journal of Photogrammetry and Remote Sensing, Deep Learning RS Data, 145 (November 1, 2018): 60-77. https://doi.org/10.1016/j.isprsjprs.2018.04.014.
另请参阅
coder.ARMNEONConfig
|coder.DeepLearningConfig
|coder.hardware
|packNGo