代码生成的语义分割使用U-net网络
这个例子显示了一个代码生成图像分割的应用程序,使用深度学习。它使用codegen
命令来生成一个墨西哥人函数执行预测U-Net DAG网络对象,深入学习网络进行图像分割。
类似的例子,其中包括利用U-Net没有分割的图像codegen
命令,看到多光谱图像的语义分割使用深度学习(图像处理工具箱)。
第三方的先决条件
要求
这个示例中生成CUDA墨西哥人,有以下第三方的要求。
CUDA®启用NVIDIA GPU®和兼容的驱动程序。
可选
等non-MEX构建静态、动态库或可执行文件,这个例子有以下额外的需求。
英伟达工具包。
英伟达cuDNN图书馆。
环境变量的编译器和库。有关更多信息,请参见第三方硬件和设置必备产品下载188bet金宝搏。
验证GPU环境
使用coder.checkGpuInstall
函数来确认所需的编译器和库运行这个例子是正确设置。
envCfg = coder.gpuEnvConfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);
分割网络
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
的segmentImageUnet
入口点函数
的segmentImageUnet.m
入口点函数对输入图像执行patchwise语义分割使用multispectralUnet网络中发现的multispectralUnet.mat
文件。加载的网络对象的函数multispectralUnet.mat
文件到一个持续的变量mynet和重用持久变量对后续预测调用。
类型(“segmentImageUnet.m”)
得到Pretrained U-Net网络
下面的例子使用了multispectralUnet
包含pretrained MAT-file U-Net网络。这个文件大小大约是117 MB。从MathWorks网站下载文件。
trainedUnetFile = matlab.internal.examples.download金宝appSupportFile (“视觉/数据”,“multispectralUnet.mat”);
U-Net DAG网络包含58层包括卷积,马克斯•池深度连接和像素分类输出层。
负载(trainedUnetFile);disp(净)
DAGNetwork属性:层:[58×1 nnet.cnn.layer.Layer]连接:[61×2表]InputNames: {“ImageInputLayer”} OutputNames: {“Segmentation-Layer”}
查看网络体系结构,使用analyzeNetwork
(深度学习工具箱)函数。
analyzeNetwork(净);
准备数据
下面的例子使用了高分辨率多光谱数据从[2]。捕获的图像设置使用无人机在哈姆林海滩州立公园,纽约。数据包含标签的训练、验证和测试集,18个对象类标签。数据文件的大小是~ 3.0 GB。
下载MAT-file版本的数据集使用downloadHamlinBeachMSIData helper函数。这个函数是附加到例子作为支持文件。金宝app
如果~ (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
墨西哥人运行代码生成
生成CUDA代码segmentImageUnet.m
入口点函数,创建一个GPU配置对象的一个墨西哥人的目标设定目标语言c++。使用coder.DeepLearningConfig
函数创建一个CuDNN
深度学习配置对象,并将其分配给DeepLearningConfig
GPU代码配置对象的属性。运行codegen
命令指定一个输入的大小12446 - 7654 - 7和块大小为1024 - 1024。这些值对应于整个test_data
大小。小块大小加快推理。如何计算补丁,请参阅segmentImageUnet
入口点函数。
cfg = coder.gpuConfig (墨西哥人的);cfg。ConstantInputs =“删除”;cfg。TargetLang =“c++”;cfg。DeepLearningConfig = coder.DeepLearningConfig (“cudnn”);inputArgs ={(大小(test_data),“uint16”),…编码器。常数(1024年[1024]),coder.Constant (trainedUnetFile)};codegen配置cfgsegmentImageUnetarg游戏inputArgs报告
代码生成成功:查看报告
运行生成的墨西哥人test_data预测结果
这segmentImageUnet
函数的数据来测试(test_data
)和一个向量包含补丁的尺寸大小使用。带补丁的形象,预测像素在一个特定的补丁,然后一起把所有补丁。由于测试数据的大小(12446 -通过- 7654 - 7),更容易处理如此大的图像补丁。
segmentedImage = segmentImageUnet_mex (test_data);
只提取的有效部分分割,分割图像乘以面具通道的测试数据。
segmentedImage = uint8 (test_data (:,: 7) ~ = 0)。* segmentedImage;
因为语义分割的输出噪声,去除噪声和杂散像素使用medfilt2
函数。
segmentedImage = medfilt2 (segmentedImage [5,5]);
显示U-Net分段test_data
下面的代码创建了一个向量类的名字。
一会= [“路标”,“树”,“建筑”,“汽车”,“人”,…“LifeguardChair”,“PicnicTable”,“BlackWoodPanel”,…“WhiteWoodPanel”,“OrangeLandingPad”,“浮”,“石头”,…“LowLevelVegetation”,“Grass_Lawn”,“Sand_Beach”,…“Water_Lake”,“Water_Pond”,“沥青”];
包裹上的标签分割RGB测试图像和添加一个颜色条分割图像。
提出=喷气(元素个数(类名);B = labeloverlay (imadjust (test_data (:,:, (3,2,1)), 0.6 [0], [0.1 - 0.9], 0.55),…segmentedImage,“透明”,0.8,“Colormap”,提出);图imshow (B) N =元素个数(类名);蜱虫= 1 / (N * 2): 1 / N: 1;colorbar (“TickLabels”cellstr(类名),“滴答”蜱虫,“TickLength”0,…“TickLabelInterpreter”,“没有”);colormap城市规划机构(cmap)标题(“分割图像”);
引用
[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.
另请参阅
功能
对象
相关的例子
- 多光谱图像的语义分割使用深度学习(图像处理工具箱)
- 语义分割使用深度学习(计算机视觉工具箱)
- 语义分割NVIDIA驱动(MATLAB编码器支持包为金宝appNVIDIA杰森和NVIDIA驱动平台)
- 训练和部署完全卷积网络语义分割
更多关于
- 开始使用语义分割使用深度学习(计算机视觉工具箱)