主要内容

代码生成的语义分割应用程序使用U-Net英特尔cpu

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

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

第三方的先决条件

  • Xeon处理器支持英特尔高级向量扩展2(金宝app英特尔AVX2)指令

这个例子支持Linux®、Win金宝appdows®和macOS平台。

下面的例子使用了英特尔MKL-DNN库附带了MATLAB和生成一个墨西哥人功能语义分割。

这个例子不支持在网上MATLAB。金宝app

概述U-Net

U-Net[1]是一种卷积神经网络(CNN)是专为语义图像分割。U-Net,最初的一系列卷积层点缀着麦克斯池层,先后降低输入图像的分辨率。这些层是紧随其后的是一系列的卷积层点缀着upsampling运营商,先后增加输入图像的分辨率。这两个系列的组合路径形成一个u型曲线。网络最初是为生物医学图像分割训练来执行预测应用。这个例子演示了网络的能力来跟踪变化随着时间的推移森林覆盖。环保机构跟踪砍伐森林的环境和生态健康评估和资格。

Deep-learning-based语义分割可以产生一个精确测量高分辨率航空照片的植被。的一个挑战是区分类,也有类似的视觉特征,如试图把绿色像素分类为草,灌木或树。提高分类精度,一些数据集包含多光谱图像每个像素提供额外的信息。例如,哈姆林海滩州立公园补充数据集与近红外通道的彩色图像提供了一个清晰的分离的类。

下面的例子使用了哈姆林海滩州立公园数据[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

得到Pretrained U-Net DAG网络对象

trainedUnet_url =“//www.tatmou.com/金宝appsupportfiles/vision/data/multispectralUnet.mat”;downloadTrainedUnet (trainedUnet_url pwd);
trainedUnetFile =“trainedUnet / multispectralUnet.mat”;ld =负载(trainedUnetFile);网= ld.net;

DAG网络包含58层包括卷积,马克斯•池深度连接和像素分类输出层。显示一个交互式可视化的深度学习网络体系结构,使用analyzeNetwork(深度学习工具箱)函数。

% analyzeNetwork(净);

segmentImageUnet入口点函数

segmentImageUnet.m入口点函数对输入图像执行语义细分为每一个固定大小的块中包含使用multispectralUnet网络multispectralUnet.mat文件。这个函数加载的网络对象multispectralUnet.mat文件到一个持续的变量mynet。功能重用这个持久变量预测在随后的电话。

类型(“segmentImageUnet.m”)
函数= segmentImageUnet (im, patchSize trainedNet) %出= segmentImageUnet (im, patchSize trainedNet)返回一个语义%分割图像,使用多光谱中指定Unet % trainedNet分段。执行分割% patchSize每个补丁的大小。% % 2019 - 2022版权MathWorks, Inc . % # codegen持久mynet;如果isempty (mynet) mynet = coder.loadDeepLearningNetwork (trainedNet);结束(高度、宽度、nChannel) = (im)大小;补丁=编码器。nullcopy (0 ([patchSize nChannel-1]));%垫形象维度作为的倍数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 7 x12446x7654 1333663576 uint16

图像有七个频道。RGB颜色通道是第四、第五和第六频道形象。前三个通道对应于图像的近红外波段和突出不同组件基于他们的热量信号。频道7是一个面具,表明有效的分割区域。

多光谱图像数据被安排为numChannels-by-width-by-height数组。在MATLAB,多通道图像排列width-by-height-by-numChannels数组。重塑数据通道是在第三维度,使用helper函数,switchChannelsToThirdPlane

test_data = switchChannelsToThirdPlane (test_data);

确认数据正确的结构(渠道)。

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

这个示例使用的裁剪版完整哈姆林海滩州立公园的数据集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 2001 x2001x7 56056014 uint16

生成墨西哥人

生成一个墨西哥人的功能segmentImageUnet.m入口点函数,创建一个配置对象的代码cfg对墨西哥人代码生成。设置目标语言c++。使用coder.DeepLearningConfig(GPU编码器)函数创建一个MKL-DNN深度学习配置对象,并将其分配给DeepLearningConfig的属性cfg。运行codegen命令指定一个输入的大小(12446、7654、7)和一个补丁(1024、1024)的大小。这些值对应于整个的大小input_data变量。小块大小加快推理。如何计算补丁,请参阅segmentImageUnet入口点函数。

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

运行生成的墨西哥人预测的结果input_data

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

segmentedImage = segmentImageUnet_mex (input_data);

只提取的有效部分分割,分割图像乘以面具通道的测试数据。

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

通过去除噪声和杂散像素medfilt2函数。

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

显示U-Net分段input_data

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

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

包裹上的标签分割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);标题(分割图像输出的);N =元素个数(类名);蜱虫= 1 / (N * 2): 1 / N: 1;colorbar (“TickLabels”cellstr(类名),“滴答”蜱虫,“TickLength”0,“TickLabelInterpreter”,“没有”);colormap城市规划机构(cmap)标题(“使用Mkldnn分割图像”);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]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

另请参阅

||(深度学习工具箱)

相关的话题