主要内容

基于U-Net的Intel cpu语义分割代码生成

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

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

第三方的先决条件

  • Xeon处理器,支持Intel Adva万博1manbetxnced Vector Extensions 2 (Intel AVX2)指令

此示例支持Linux®、Wind万博1manbetxows®和macOS平台。

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

此示例在MATLAB Online中不支万博1manbetx持。

U-Net概述

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

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

本例使用哈姆林海滩州立公园数据[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

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

trainedUnet_url =“//www.tianjin-qmedu.com/万博1manbetxsupportfiles/vision/data/multispectralUnet.mat”;downloadTrainedUnet (trainedUnet_url pwd);
trainedUnetFile =“trainedUnet / multispectralUnet.mat”;ld = load(trainedUnetFile);Net = ld.net;

DAG网络包含58层,包括卷积层、最大池化层、深度拼接层和像素分类输出层。要显示深度学习网络体系结构的交互式可视化,请使用analyzeNetwork(深度学习工具箱)函数。

% analyzeNetwork(净);

segmentImageUnet入口点函数

segmentImageUnet.m入口点函数对输入图像中固定大小的每个patch进行语义分割multispectralUnet.mat文件。对象中的网络对象multispectralUnet.mat文件转换为持久变量mynet.该函数在后续的预测调用中重用此持久变量。

类型(“segmentImageUnet.m”
function out = segmentImageUnet(im,patchSize,trainedNet) % out = segmentImageUnet(im,patchSize,trainedNet)返回一个语义上%分割的图像,使用% trainedNet中指定的多光谱Unet进行分割。分割在大小为% patchSize的每个补丁上执行。版权所有The MathWorks, Inc. %#codegen persistent mynet;if isempty(mynet) mynet = code . loaddeeplearningnetwork (trainedNet);end [height, width, nChannel] = size(im);补丁=编码器。nullcopy (0 ([patchSize nChannel-1]));% Pad图像的尺寸为patchSize padSize = 0(1,2)的倍数;padSize(1) = patchSize(1) - mod(高度,patchSize(1));padSize(2) = patchSize(2) - mod(宽度,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 =“https://home.cis.rit.edu/ cnspci /其他/数据/ rit18_data.mat ';downloadHamlinBeachMSIData (url, pwd +“/数据/”);结束

在MATLAB中加载并检查数据。

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

图像有七个通道。RGB颜色通道是第四、第五和第六个图像通道。前三个通道对应于近红外波段,并根据其热特征突出显示图像的不同组成部分。通道7是一个掩码,表示有效的分割区域。

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

test_data = switchChannelsToThirdPlane(test_data);

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

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

此示例使用完整哈姆林海滩州立公园数据集的裁剪版本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”);
名称大小字节类属性input_data 2001x2001x7 56056014 uint16 . txt

生成墨西哥人

为对象生成MEX函数segmentImageUnet.m入口点函数,创建一个代码配置对象cfg用于MEX代码生成。将目标语言设置为c++。使用编码器。DeepLearningConfig(GPU编码器)函数创建一个mml - dnn深度学习配置对象,并将其分配给DeepLearningConfig的属性cfg.运行codegen命令指定输入大小为[12446,7654,7]和补丁大小为[1024,1024]。这些值对应于整体的大小input_data变量。较小的补丁尺寸加快了推断。要了解如何计算补丁,请参阅segmentImageUnet入口点函数。

CFG = code .config(墨西哥人的);cfg。ConstantInputs =“删除”;cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“mkldnn”);codegen配置cfgsegmentImageUnetarg游戏{(大小(input_data),“uint16”),编码器。常数(1024年[1024]),coder.Constant (trainedUnetFile)}报告
要查看报告,打开('codegen/mex/segmentImageUnet/html/report.mldatx')

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

segmentImageUnet函数接受input_data和一个包含补丁尺寸尺寸的向量作为输入。该函数将图像划分为小块,预测特定小块中的像素,最后将所有小块组合在一起。因为尺寸大input_data(12446x7654x7),更容易在补丁中处理图像。

segmentedImage = segmentImageUnet_mex(input_data);

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

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

删除噪声和杂散像素使用medfilt2函数。

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

显示U-Net分段input_data

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

classNames = net.Layers(end).Classes;

在分割后的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);标题(“分段图像输出”);N = number (classNames);ticks = 1/(N*2):1/N:1;colorbar (“TickLabels”cellstr(类名),“滴答”蜱虫,“TickLength”0,“TickLabelInterpreter”“没有”);colormap城市规划机构(cmap)标题(“Mkldnn分割图像”);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。

Kemker, Ronald, Carl Salvaggio和Christopher Kanan。基于深度学习的多光谱遥感图像语义分割算法ISPRS摄影测量与遥感杂志,深度学习RS数据,145(2018年11月1日):60-77。https://doi.org/10.1016/j.isprsjprs.2018.04.014

另请参阅

||(深度学习工具箱)

相关的话题