摘要:本文主要讲述在MATLAB2020a环境下利用深度神经网络DeepLabV3+进行语义分割,分割感图像中的云层。讲述了:1.训练数据的获取、训练集制作;2.DeepLabV3+模型的构建;3.DeepLabV3+模型训练和验证

1.数据获取与训练集制备

为了方便大家,这里我把我构建完的的数据集放到云盘上(提取码:wtx4):

如果感兴趣数据集是如何建立的,请参考如下部分,否则可以直接跳转至 3)制作神经网络的输入数据

气象卫星遥感图像数据来源与日本的葵花8产品,相应的数据介绍链接:

数据获取可直接跳转本链接:

调整至合适的分辨率(图1)然后右键另存为图像(图2)

图1 网页截图

图2 下载云图

我裁剪的尺寸大概是纬度5个格子(太懒了没换算一个格子是几度)。这样就得到了用于训练的原始数据。

有了原始数据后,还需要相应的标签才能构建完整训练数据集。一般处理图像类的卷积神经网络输入都是图像,而标签(或言之输出结果)是根据任务而定的。以分类任务为例,标签就是一个单一类别,以目标检测为例,输出是4维向量(4个元素分别代表矩形框左上角x坐标,左上角y坐标,矩形框x方向长度,y方向长度)。而语义分割的输出是什么呢?语义分割的本质是对图像中每一个像素进行分类,对图像中每个像素都打上一个标签就是语义分割的标注过程。一般情况下,这个工作需要我们手工完成且工作量极大(在下一篇文章中会讲述用MATLAB的标注工具箱进行完整标注的过程),但本文选取的云图分割由标注好的标签。

如下图(图3)左下角产品类型选中CloudType云类,右上角选项选择Blank Map白板,再右键保存得到(图4)

图3 网页截图(标签)

图4 下载云类别(标签)

至此,图4即为图2的标签数据。在地图上截取不同区域或者换不同时间点下的图像,采集了69组原始图像和原始标签。

结合图3和图4可以看到,标注的云类有9种

云类别

数据结果赋值

图像结果颜色信息

雨层云Ns

6

(204   204   0)

层云St

9

(255    0    0)

积云Cu

7

(255   153   153)

卷云Ci

1

(204   204  255)

深对流云Dc

3

(0    0    255)

其他(两种方式二选一)

卷层云Cs:2

高积云Ac:4

高层云As:5

层积云Sc:8

背景:0

(102   102  255)

(255   255  204)

(255   255    0)

(255   102    51)

(0   0  0)

本文不需要对云类分割的这么详细,只需要将九类云都分割为云这一类就行

云类别

数据结果赋值

图像结果颜色信息

1

(204   204   0)

(255    0    0)

(255   153   153)

(204 204 255)

(0     0     255)

(102   102  255)

(255   255  204)

(255   255    0)

(255   102    51)

背景

0

(0   0  0)

1)首先裁剪原始数据:

将相应的图像和标签对应上,这里我将第一张原图命名为canvas1.png,第一个标签命名为canvas1-seg.png。由于图像和标签的分辨率都是1464*908,基本上可以划分为6个小块:(在原图和标签图的文件夹下运行如下代码)

%% 裁剪69副图像
for n=1:69
I=imread(['canvas',num2str(n),'.png']);I1=imcrop(I,[0,0,488,454]);
I2=imcrop(I,[489,0,487,454]);
I3=imcrop(I,[977,0,488,454]);
I4=imcrop(I,[0,455,488,454]);
I5=imcrop(I,[489,455,487,454]);
I6=imcrop(I,[977,455,488,454]);Img={I1 I2 I3 I4 I5 I6};
for i=1:6
Img2=Img(i);
Img3=Img2{1,1};
% Img3=imresize(Img3,[454 488]);
% imwrite(Img2{1,1},[num2str(n),'seg-',num2str(i),'.jpg']);
imwrite(Img3,[num2str(n),'-',num2str(i),'.jpg']);
end
end

将生成的图像放入Canvas-Img文件夹

2)之后对原始标签数据进行操作:

%% ImgSegCrop
for n=1:69
I=imread(['canvas',num2str(n),'-seg.png']);
I1=imcrop(I,[0,0,488,454]);
I2=imcrop(I,[488,0,487,454]);
I3=imcrop(I,[977,0,488,454]);
I4=imcrop(I,[0,455,488,454]);
I5=imcrop(I,[489,455,487,454]);
I6=imcrop(I,[977,455,488,454]);
Img={I1 I2 I3 I4 I5 I6};
%% 划分云层和背景
for k=1:6Ik=Img(k);Ik=Ik{1,1};
%     Ik=imresize(Ik,[454 488]);
Itmp=Ik(:,:,1);
WIDTH=size(Ik);
for i=1:WIDTH(1)for j=1:WIDTH(2)if Ik(i,j,1)==0&&Ik(i,j,2)==0&&Ik(i,j,3)==0 %三通道均为0的是背景Itmp(i,j)=0;elseItmp(i,j)=1;             %否则是云层endend
end
imwrite(Itmp,[num2str(n),'-',num2str(k),'.png'])
end
end

将生成的png标签拷贝到Canvas-Label-2中:

这里的图片全是黑的,是因为图像中只有两个值0和1,在uint8下基本上就都是黑色的了。但是颜色灰度不重要,这里的0,1只是类别标签,分别代表背景和云层。

3)制作神经网络的输入数据

制备完训练图像和训练标签后,需要将二者作为MATLAB环境下DeepLabV3+可读取的数据类型,

%% Semantic Segmentation for Cloud
dataFolder = fullfile('.\卫星云图0826\卫星云图0826\葵花8\');%这里填写自己数据所在路径
imageFolderTrain = fullfile(dataFolder,'Canvas-Img');%训练图像路径
labelFolderTrain = fullfile(dataFolder,'Canvas-Label-2');%训练标签路径imdsTrain = imageDatastore(imageFolderTrain);% 加载训练图像classNames = ["Back" "Cloud"];%设置类别名称
labelIDs = [0 1];%设置类别相应的编号,就是Canvas-Label-2中几乎全黑的png中的值
pxds = pixelLabelDatastore(labelFolderTrain,classNames,labelIDs);%生成相应的类别标签

之后随便挑一张图检验一下:

% Read image and pixel label data.
A = readimage(imdsTrain,5);%选中第5号图片
C = readimage(pxds,5);%选中第5号标签% Display the label categories in C
% categories(C{1})
cmap = ColorMap;
% Overlay pixel label data on the image and display.
B = labeloverlay(A, C,'ColorMap',cmap,'Transparency',0.6);
figure
imshow(B)

得到下图,对比原图看到,浅蓝色为云层,蓝紫色为背景

这里的函数ColorMap需要自己写一下:

function cmap = ColorMap()cmap = [000 000 000   % Back102 102 255   % Cloud];% Normalize between [0 1].
cmap = cmap ./ 255;
end

2.DeepLabV3+模型的构建

接下来就开始模型的构建了,直接上代码:

%% 数据分析
%
tbl = countEachLabel(pxds);frequency = tbl.PixelCount/sum(tbl.PixelCount);
bar(1:numel(classNames),frequency)
xticks(1:numel(classNames))
xticklabels(tbl.Name)
xtickangle(45)
ylabel('Frequency') %这里计算云层像素总个数和背景像素总个数之比,用于更改输出层的权重,如果背景元素数量远多于代分割的目标时,不改权重会大大降低网络性能%% 制作语义分割网络DeeplabV3+
% 定义网络输入大小,与图像大小相等.
imageSize = [454 488 3];% 定义类别数量.
numClasses = numel(classNames);%构建deeplabV3+.
lgraph = deeplabv3plusLayers(imageSize, numClasses, "mobilenetv2");%这里骨干网络(图像特征提取网络)选取mobilenetv2,该网络带有ImageNet训练过的参数,采用迁移学习方法可大大提升训练效率% 设置类别权重
imageFreq = tbl.PixelCount ./ tbl.ImagePixelCount;
classWeights = median(imageFreq) ./ imageFreq
% 修改输出层
pxLayer = pixelClassificationLayer('Name','labels','Classes',tbl.Name,'ClassWeights',classWeights);
lgraph = replaceLayer(lgraph,"classification",pxLayer);

3.DeepLabV3+模型训练和验证

完成网络搭建后,就可以设置超参数、进行数据增强并开始训练了

%% 设置训练参数
options = trainingOptions('adam', ...%选取adam优化器'LearnRateSchedule','piecewise',...'LearnRateDropPeriod',20,...%学习率每20代降低一次'LearnRateDropFactor',0.4,...%学习率每20代降低0.4'InitialLearnRate',1e-4, ...%初始学习率'L2Regularization',0.005, ...'MaxEpochs',50, ...  %最大迭代次数'MiniBatchSize',8, ...%小批量尺寸,可根据显存更改,这里用的8g显存'Shuffle','every-epoch', ...'VerboseFrequency',2,...'Plots','training-progress');%绘制训练曲线
% 图像增强,
augmenter = imageDataAugmenter('RandXReflection',true,...'RandXTranslation',[-10 10],'RandYTranslation',[-10 10]);%进行平移和翻转
pximds = pixelLabelImageDatastore(imdsTrain,pxds, ...'DataAugmentation',augmenter);
% 训练网络
[net, info] = trainNetwork(pximds,lgraph,options);

这里在执行lgraph = deeplabv3plusLayers(imageSize, numClasses, "mobilenetv2");时如果没有安装mobilenetv2,则会运行报错,参考我这篇文章中的解决方式

这样就开始模型的训练了,训练过程如下图

可以看到近4小时训练后最终网络在训练集上的准确率有近85%,不算特别高。先看一下训练集上的训练效果:

%% 动态显示
imagePath=pwd;
imageFiles = dir(imagePath); %%读取目录文件下的所有图片文件
numFiles = length(imageFiles);%%获取图片的数量
figure()
for i = 3:numFilesj = i-2; subplot(1,2,1)imageFile = strcat(imagePath,'\',imageFiles(i).name);I = imread(imageFile);imshow(I,[],'parent',gca)subplot(1,2,2)C = semanticseg(I, net);B = labeloverlay(I,C,'Colormap',cmap,'Transparency',0.4);imshow(B,[],'parent',gca)
%     pixelLabelColorbar(cmap, classes);pause(2)
end

训练时可以将414张图像拆分整训练和验证集,这样验证部分可以放在验证集上进行。由于云层类型较多,有些云层十分稀薄,确实不太好界定,因此能够达到这样的训练效果应该还算可以了。

重新再网上下了几张图,构成测试集:

测试结果如下,效果差不多:

小结:本文主要讲述了再MATLAB环境下使用DeepLabV3+实现云层分割。介绍了数据集构建、模型构建和训练以及效果验证。训练集上实现了85%的准确率。但缺少了完整的数据人工标注过程。后续会继续出一篇包含数据标注的完整语义分割任务Demo。

欢迎交流和指正:企鹅2501896344

在MATLAB环境下使用深度学习网络DeepLabV3+进行语义分割(云图分割)相关推荐

  1. 自动驾驶之-MATLAB环境下基于深度学习的目标检测(停车标志检测)

    深度学习,一个大号的,现代的,黑箱的,信号/图像处理器,本文程序运行环境为MATLAB R2018A. 本文简要讲解如何使用深度学习(R-CNN网络)来训练一个停车标志检测器.R-CNN是一种目标检测 ...

  2. MATLAB环境下基于深度学习的JPEG图像去块(Image Deblocking)

    之前主要研究现代信号处理,深度学习嘛,一个大号/深层的,现代的,黑箱的,信号/图像处理器,所以,作为一个研究现代信号处理的,顺便搞些深度学习也是顺理成章的.本文程序运行环境为MATLAB R2018A ...

  3. 用pyinstaller打包pytorch环境下的深度学习模型,实现通过exe程序实现界面显示模型的分类效果

    用pyinstaller打包pytorch环境下的深度学习模型,实现通过exe应用实现界面显示模型的分类效果 训练深度学习模型和界面显示,看我之前的博客,链接在下面: 通过残差网络实现CLFAR-10 ...

  4. 手把手教你在Windows10环境下安装深度学习框架(pytorch or tensorflow)

    手把手教你在Windows10环境下安装深度学习框架(pytorch or tensorflow) 1. 安装Anaconda:(常用的python版本和各类包管理器) 1.1. 下载地址: 1.2. ...

  5. matlab 创建简单的深度学习网络用于分类

    matlab 2018以上版本.如果不是2018以上版本,需要单独安装工具箱Deep learning toolbox 此示例说明如何创建和训练简单的卷积神经网络来进行深度学习分类.卷积神经网络是深度 ...

  6. 直观的获得MATLAB训练得到的深度学习网络参数与结构

    在MATLAB当中可以通过在"命令行窗口"输出help trainNetwork获得简单的深度学习网络的搭建的代码. 为了获得经过训练得到的深度学习模型的结构与学习参数个数,而不用 ...

  7. 毕设路线—pytorch环境下的深度学习的高光谱图像分类问题

    毕设快要结束了,一路走来一直记录着点点滴滴的技术内容,主要想写给自己看吧,作为一个项目整理的大致框架,改完最终定稿,再填补每一部分的细节. 另外如果以后有做这个方向的朋友看到了,希望能提供一点小小的帮 ...

  8. C++环境下部署深度学习模型方案

    目录 一.问题背景 二.解决方案 2.1 C++调用python 2.2 Python服务接口 2.3 Python转c++(不推荐) 2.4 深度学习部署框架(推荐) 三.总结 3.1 接口形式分类 ...

  9. Windows8.1 64bit环境下搭建深度学习平台之CUDA安装与配置

    http://blog.csdn.net/baigoocn/article/details/36188029 说明:想要让Theano在Windows8.1下能利用GPU并行运算,必须有支持GPU并行 ...

最新文章

  1. 自己制作 SPx N合1 自动安装盘(x86)
  2. c# SQLServer导入大批量数据
  3. sqlserver中编写自定义函数中的返回值问题
  4. 软件是否有必要进行性能测试
  5. linux mysql密码转义_linux忘记mysql密码处理方法
  6. IntelliJ IDEA 2020修改菜单显示大小
  7. Maven3路程(六)用Maven创建Spring3 MVC项目
  8. JAVA Eclipse 启动 Eclipse 弹出“Failed to load the JNI shared library jvm_dll”怎么办
  9. C++--第25课 - 异常处理 - 上
  10. tp3.2 判断请求类型
  11. Linux内核探索之路——关于方法
  12. linux syscore suspend/resume方法
  13. 海思SDK学习(7)海思媒体处理软件平台MMP(6)视频编码VENC
  14. 闲聊HTML5的新特性
  15. Bluetooth core 5.0 Generic Access Profile ---------- 模式 - BR/EDR 物理传输(physical transport)
  16. SQL语言——更新操作命令
  17. 需求文档怎么写?这里有一套思维框架
  18. Windows 7 bluetooth 外围设备 解决方案
  19. Golang蓝湖一面
  20. 2021年施工员-设备方向-岗位技能(施工员)考试试卷及施工员-设备方向-岗位技能(施工员)证考试

热门文章

  1. python关于二手房的课程论文_用Python对2019年二手房价格进行数据分析
  2. ZigBee网络数据传递流程_蓝牙、WIFI、Zigbee谁更适合物联网,各有哪些优缺点?...
  3. 目前主流的移动广告联盟有哪些呢?
  4. Self2Self With Dropout: Learning Self-Supervised Denoising From Single Image【使用单张图像进行自监督学习去噪】
  5. 心理学与计算机交叉学专业,心理学与计算机的交叉学科有哪些?
  6. 基于Java毕业设计养老院信息管理源码+系统+mysql+lw文档+部署软件
  7. 教你ZBrush中的笔触
  8. 栅格化处理激光雷达点云数据
  9. 台式机安装Windows11正式版(跳过TPM)
  10. 从iTunes获取App信息