主要内容

使用U-Net的英特尔CPU上的语义分段应用程序的代码生成

这个例子演示了使用深度学习的图像分割应用程序的代码生成。它使用codegen命令生成MEX函数,通过使用深度学习网络U-Net进行图像分割来执行预测。

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

第三方先决条件

  • 支持Intel Advanced Vec金宝apptor Extensions 2 (Intel AVX2)指令的Xeon处理器

此示例是Linux®,Windo金宝appws®和麦斯科斯平台的支持。

这个示例使用MATLAB附带的Intel MKL-DNN库,并生成一个用于语义分割的MEX函数。

这个例子不支持MATLAB联机。金宝app

概述U-Net

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

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

此示例使用Hamlin Beach State Park Data [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

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

trainedUnet_url ='//www.tatmou.com/金宝appsupportfiles/vision/data/multispectralunet.mat';downloadtroundthet(troundunet_url,pwd);
下载哈姆林海滩数据集预训练的U-net…下载需要几分钟…完成了。
ld = load(“TrouseUnet / MultiSpectralunet.mat”);网= ld.net;

DAG网络包含58层,包括卷积,最大池,深度倾斜和像素分类输出层。要显示深度学习网络架构的交互式可视化,请使用分析(深度学习工具箱)功能。

% analyzeNetwork(净);

segmentimageunet.入学点函数

semmentimageunet.m.入口点函数利用包含的多光谱unet网络对输入图像的每个固定大小的patch进行语义分割multispectralUnet.mat文件。此函数加载网络对象multispectralUnet.mat文件到持久变量中mynet.函数在后续的预测调用中重用这个持久变量。

类型(“segmentImageUnet.m”
% OUT = segmentmageunet (IM, PATCHSIZE)返回一个语义分割的%图像,使用网络多光谱unet分割。分割%是在大小为PATCHSIZE的每个补丁上执行的。% % Copyright 2019-2020 The MathWorks, Inc. function out = segmentmageunet (im, patchSize) %#codegen persistent mynet;if isempty(mynet) mynet = code . loaddeeplearningnetwork ('trainedUnet/multispectralUnet.mat');end [height, width, nChannel] = size(im);补丁=编码器。nullcopy (0 ([patchSize nChannel-1]));% pad图像的尺寸为patchSize的倍数padSize = 0 (1,2);- mod(height, patchSize(1));- mod(width, patchSize(2)); 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:patchSize(1):height_pad for j =1:patchSize(2):width_pad for p = 1:nChannel-1 patch(:,:,p) = squeeze( im_pad( i:i+patchSize(1)-1,... j:j+patchSize(2)-1,... 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+patchSize(1)-1, j:j+patchSize(2)-1) = patch_seg; end end % Remove the padding out = out(1:height, 1:width);

准备数据

下载哈姆林海滩州立公园的数据。

如果~ (fullfile (pwd,存在“数据”),“dir”)URL =.“http://www.cis.rit.edu/ ~ rmk6217 / rit18_data.mat”;downloadHamlinBeachMSIData (url, pwd +“/数据/”);结束
下载Hamlin Beach数据集…下载需要几分钟…完成了。

在MATLAB中加载并检查数据。

负载(fullfile (pwd,“数据”“rit18_data”'rit18_data.mat'));%检查数据test_data
名称大小字节类属性test_data 7x12446x7654 1333663576 uint16

图像有七个通道。RGB颜色通道是第四,第五和第六图像通道。前三个通道对应于近红外条带,并基于其热签名突出显示图像的不同组件。通道7是指示有效分段区域的掩模。

多光谱图像数据被布置为逐个宽度乘以乘积阵列。在MATLAB中,多通道图像被布置为逐宽度 - 逐个NumChannels阵列。要重塑数据,以便通道位于第三维度,使用辅助功能,SwitchChannelstothirdPlane.

test_data = switchChannelsToThirdPlane (test_data);

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

test_data
名称大小字节类属性test_data 12446x7654x7 1333663576 uint16

本例使用完整的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变量。

Whos(“input_data”);
名称大小字节类属性input_data 2001x2001x7 56056014 uint16

生成墨西哥人

的MEX函数semmentimageunet.m.入口点函数,创建代码配置对象cfg用于MEX代码生成。将目标语言设置为c++。使用coder.deeplearningconfig(GPU编码器)函数创建一个MKL-DNN深度学习配置对象,并将其分配给DeeplearningConfig财产cfg.运行codegen命令,指定输入大小为[12446,7654,7]和补丁大小为[1024,1024]。这些值对应于整个的大小input_data变量。较小的贴片尺寸加速推断。要查看如何计算修补程序,请参阅segmentimageunet.入口点函数。

cfg = coder.config (墨西哥人的);cfg。TargetLang =“c++”;cfg.deeplearningconfig = coder.deeplearningconfig('mkldnn');codegen配置cfgsegmentimageunet.arg游戏{(大小(input_data),“uint16”),编码器。常数(1024 [1024])}-report.
代码生成成功:要查看报告,打开('codegen\mex\segmentImageUnet\html\report.mldatx')。

运行生成的MEX来预测结果input_data

segmentimageunet.功能接受input_data和一个包含作为输入的补丁大小的尺寸的向量。该功能将图像划分为修补程序,预测特定修补程序中的像素,最终组合所有补丁。因为大尺寸input_data(12446x7654x7),更容易处理修补程序中的图像。

segmentimagage = segmentmageunet_mex (input_data,[1024 1024]);

为了只提取分割的有效部分,将分割后的图像乘以测试数据的掩模通道。

@ # @ # = uint8(input_data(:,:,7)~=0) .*

删除噪声和散乱像素使用Medfilt2.功能。

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

显示u网分段input_data

这行代码创建了一个包含类名的向量:

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

覆盖分段的RGB测试图像上的标签,并将彩色栏添加到分段图像。

%显示输入数据图(1);imshow (histeq (input_data (:,: 1:3)));标题(输入图像的);CMAP = JET(NUMER(CLASSNMES));segmentedImageout = labeloverlay(IMADJUST(INPUD_DATA(:,:,4:6),[0 0.6],[0.1 0.9],0.55),segmentedImage,'透明度',0,'colormap',提出);%显示分段数据图(2);imshow (segmentedImageOut);标题('分段图像输出');n = numel(classnames);蜱= 1 /(n * 2):1 / n:1;彩色杆('ticklabels'cellstr(类名),'蜱',蜱虫,'ticklength',0,“TickLabelInterpreter”'没有');colormap城市规划机构(cmap)标题(“使用Mkldnn分割图像”);segmentedImage = labeloverlay(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预印本arXiv: 1505.04597,2015年。

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

另请参阅

||(深度学习工具箱)

相关的话题