主要内容

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

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

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

第三方的先决条件

  • Xeon处理器,支持Intel高级向量扩展2 (Intel AVX2)指令

该示例支持Linux®、Windows®和macOS平台。

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

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

概述U-Net

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

基于深度学习的语义分割可以从高分辨率航拍照片中获得精确的植被覆盖测量结果。其中一个挑战是区分具有相似视觉特征的类,例如试图将一个绿色像素分类为草、灌木或树。为了提高分类的准确性,一些数据集包含多光谱图像,提供关于每个像素的附加信息。例如,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

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

trainedUnet_url =“//www.ru-cchi.com/supportfiles/vision/data/multispectralUnet.mat”;downloadTrainedUnet (trainedUnet_url pwd);
下载预先训练的U-net Hamlin Beach数据集…这需要几分钟来下载…完成了。
ld =负载(“trainedUnet / multispectralUnet.mat”);网= ld.net;

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

% analyzeNetwork(净);

segmentImageUnet入口点函数

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

类型(“segmentImageUnet.m”
% OUT = segmentmageunet (IM, PATCHSIZE)返回一个语义分割的%图像,使用网络多光谱unet进行分割。分割%在大小为PATCHSIZE的每个补丁上执行。The MathWorks, Inc.函数out = segmentImageUnet(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);padSize(1) = patchSize(1) - mod(height, patchSize(1));padSize(2) = patchSize(2) - 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是表示有效分割区域的掩码。

多光谱图像数据被排列成numchannels -by-width- height数组。在MATLAB中,多通道图像被排列为宽度-高度- numchannels数组。要重塑数据,使通道处于第三维度,可以使用helper函数,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变量。

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

生成墨西哥人

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

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

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

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

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

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

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 0.6],[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 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。

另请参阅

||(深度学习工具箱)

相关的话题

Baidu
map