深度学习高分辨率遥感影像语义分割

article/2025/8/19 4:52:39

深度学习大家都知道,在计算机视觉领域取得了很大的成功,在遥感影像自动解译方面,同样带来了快速的发展,我在遥感影像自动解译领域,也做了一些微薄的工作,发表几篇论文,我一直关注遥感影像自动解译领域,

在北京出差的这段时间,终于可以沉下心来,好好研究下深度学习,目前在语义分割领域,也有部分心得,在此同大家分享,权当是互相学习。本篇博文就是论述现有的state-of-art方法在遥感影像语义分割领域的进展,及以后的发展方向!

       首先不多说,我采用当前效果表现最稳定、精度较高的几种语义分割网络进行讲述:1.unet网络;2.Deeplab网络(mobile特征提取器,resnet18特征提取器,resnet50特征提取器,Inceptionv3特征提取器等);3.CEnet。

下面我对这几种网络进行简单的讲解,单纯作为抛砖引玉,如有个别不当的地方,

      1.unet网络

      unet网络由于形状像一个u型,因此称为Unet网络,关于它的资料,大家可以在CSDN的一篇博客找到,介绍的论文太多我就不细讲了!

      它的形状如下图所示:

图1 unet语义分割网络(参考unetCSDN博客)

      从它的形状,我们可以看出, 非常优美,这是原版论文的架构,我们可以在这个基础上进行大量的改进,比如说,特征提取块,我们可以采用残差网络(resnet)进行替换,这有什么好处呢?主要是可以加深网络,在防止梯度消失的同时,

可以学习到更深层次的特征,有利于提高精度。我看了几个版本的代码,在特征融合层,大家普遍采用两种方式,第一种直接相加,即将编码层与解码层特征直接相加,另外一种就是常用的concat,关于这两种有什么优缺点,我个人的理解是,

concat可以融合更多特征,其实说白了就是以前的向量相加(vector stacking),效果好的同时,GPU的显存肯定要消耗大;而对于特征相加的方式,直观的表现就是节省GPU显存,但是呢,是否比concat更好呢?我这里没有做实验,大家可以

跑跑代码试试!

 

      2.Deeplab网络

图3 DeeplabV3plus语义分割网络(参考原作者论文)

      其实从Deeplab的网络可以看出,这个网络简单优美,没有那么多复杂的组合等等,最核心的东西就是四个空洞卷积块,卷积核的大小分别是1 6 12 18,关于作者为什么只用这四个参数呢,作者也只是用实验进行了说明,

证明了用这四个参数可以获得最高的精度,另外一种解析就是,不同大小的空洞卷积核可以感受不同范围的特征。第二个比较重要的地方,就是与四倍采样大小的特征进行concat,这个比较重要,它融合了编码层与解码层的

特征,从本质上来说,这个其实就是unet的变种,但是你可以自定义特征提取网络,例如我这里实现了mobilenet、inceptionv3,resnet18,resnet50等四种经典的特征提取网络。

      关于DeeplabV3 里面的关键部分ASPP(空间金字塔池化),核心代码实现如下:

% 创建空洞卷积空间金字塔网络,Deeplab的核心算法部分
function LayerGraph = ASPP_layer(LayerGraph)
% 创建ASPP层
dilate_size2 = 6;
dilate_size3 = 12;
dilate_size4 = 18;% 尺度1空洞卷积层
convLayer_scale1 = convolution2dLayer(1,256,...  % 1*1,原文为256个卷积核'Padding','same',...'BiasL2Factor',0,...'Name','convLayer_scale1');% convLayer_scale1 = groupedConvolution2dLayer(1,1,40,'Padding','same', 'Name','convLayer_scale1');bn_scale1 = batchNormalizationLayer('Name','bn_scale1');
% relu_scale1 = clippedReluLayer(6,'Name','relu_scale1');
relu_scale1 = reluLayer('Name','relu_scale1');
scale_net1 = [convLayer_scale1;bn_scale1;relu_scale1];% 尺度2空洞卷积层
convLayer_scale2 = convolution2dLayer(3,256,...'Padding','same',...'DilationFactor', dilate_size2,...'BiasL2Factor',0,...'Name','convLayer_scale2');% convLayer_scale2 = groupedConvolution2dLayer(3,1,40,'Padding','same', 'DilationFactor', dilate_size2, 'Name','convLayer_scale2');bn_scale2 = batchNormalizationLayer('Name','bn_scale2');
% relu_scale2 = clippedReluLayer(6,'Name','relu_scale2');
relu_scale2 = reluLayer('Name','relu_scale2');
scale_net2 = [convLayer_scale2;bn_scale2;relu_scale2];% 尺度3空洞卷积层
convLayer_scale3 = convolution2dLayer(3,256,...'Padding','same',...'DilationFactor', dilate_size3,...'BiasL2Factor',0,...'Name','convLayer_scale3');% convLayer_scale3 = groupedConvolution2dLayer(3,1,40,'Padding','same', 'DilationFactor', dilate_size3, 'Name','convLayer_scale3');bn_scale3 = batchNormalizationLayer('Name','bn_scale3');
% relu_scale3 = clippedReluLayer(6,'Name','relu_scale3');
relu_scale3 = reluLayer('Name','relu_scale3');
scale_net3 = [convLayer_scale3;bn_scale3;relu_scale3];% 尺度4空洞卷积层
convLayer_scale4 = convolution2dLayer(3,256,...'Padding','same',...'DilationFactor', dilate_size4,...'BiasL2Factor',0,...'Name','convLayer_scale4');% convLayer_scale4 = groupedConvolution2dLayer(3,1,40,'Padding','same', 'DilationFactor', dilate_size4, 'Name','convLayer_scale4');bn_scale4 = batchNormalizationLayer('Name','bn_scale4');
% relu_scale4 = clippedReluLayer(6,'Name','relu_scale4');
relu_scale4 = reluLayer('Name','relu_scale4');
scale_net4 = [convLayer_scale4; bn_scale4; relu_scale4];% 组合原来的layer
LayerGraph = addLayers(LayerGraph, scale_net1);
LayerGraph = addLayers(LayerGraph, scale_net2 );
LayerGraph = addLayers(LayerGraph, scale_net3);
LayerGraph = addLayers(LayerGraph, scale_net4);LayerGraph = connectLayers(LayerGraph, 'mixed10', 'convLayer_scale1');
LayerGraph = connectLayers(LayerGraph, 'mixed10', 'convLayer_scale2');
LayerGraph = connectLayers(LayerGraph, 'mixed10', 'convLayer_scale3');
LayerGraph = connectLayers(LayerGraph, 'mixed10', 'convLayer_scale4');catFeature4 = depthConcatenationLayer(4,'Name',"dec_cat_aspp");  % 融合多特征
LayerGraph = addLayers(LayerGraph, catFeature4);
LayerGraph = connectLayers(LayerGraph, 'relu_scale1', 'dec_cat_aspp/in1');
LayerGraph = connectLayers(LayerGraph, 'relu_scale2', 'dec_cat_aspp/in2');
LayerGraph = connectLayers(LayerGraph, 'relu_scale3', 'dec_cat_aspp/in3');
LayerGraph = connectLayers(LayerGraph, 'relu_scale4', 'dec_cat_aspp/in4');% 卷积层降低参数个数
convLayer_input = convolution2dLayer(1,256,...  % 1*1卷积就是为了降低参数个数'Stride',[1 1],...'Padding',1,...'BiasL2Factor',0,...'Name','Conv_block16');
bn_layer1 = batchNormalizationLayer('Name','bn_block16');
% relu_layer1 = clippedReluLayer(6,'Name','relu_block16');
relu_layer1 = reluLayer('Name','relu_block16');con_net = [convLayer_input; bn_layer1; relu_layer1];LayerGraph = addLayers(LayerGraph, con_net);
LayerGraph = connectLayers(LayerGraph, 'dec_cat_aspp', 'Conv_block16');% 向上采样四倍
deconvLayer = transposedConv2dLayer(8,256,...   % 8*8'Stride',[4 4],... % 四倍大小'Cropping','same',...'BiasL2Factor',0,...'Name','deconv_1');decon_net = [deconvLayer;batchNormalizationLayer('Name','de_batch_1');reluLayer('Name','de_relu_1')];
%              clippedReluLayer(6,'Name','de_relu_1')];LayerGraph = addLayers(LayerGraph, decon_net);
LayerGraph = connectLayers(LayerGraph, 'relu_block16', 'deconv_1');end

      这一段ASPP代码是我根据作者论文的原版实现,同时也参考了pytorch、keras、caffee等不同框架的实现代码,大家可以直接使用!

 

      3.CEnet网络

图2 CEet语义分割网络(参考原作者论文)

      CEnet这个网络主要是用到医学图像分割里面,发表在IEEE 的医学权威期刊,这个网络我第一眼就感觉特别熟悉,仔细一看,这不就是PSPnet的变种吗?后面组合了多个不同的最大池化层特征,前面组合了Deeplab里面的多尺度空洞卷积,

我觉得这里面比较有意思的地方在于,作者的空洞卷积核大小,由于血管比较小,因此作者的空洞卷积核并不大,最大只有5,这跟Deeplab的参数有较大的不同,作者这种设计网络的方式值得我们去学习,例如,我们只需要提取遥感影像上的

道路网络,我们是否真的需要那么的空洞卷积核呢??不需要!因此我们应当针对遥感影像地物的特征,设计不同的网络参数,这样才能取得一个比较好的精度!(纯属个人思想,如有不当之处,请高手指正!phone:15211874660,Email:1044625113)

      关于CEnet的全部代码实现,参见我的github网站(https://github.com/wzp8023391/CEnet,如果觉得好,请大家手动点个星星。。。)

 

      4.其他网络

      其他的语义分割网络,如PSPnet等网络,我这里不再多说,大家可以去看论文。回过头来看,大家有没有发现一个问题?就是目前所有的语义分割网络都是人工设计的!关于它表现的怎么样,谁知道呢,跑跑实验,行就行,不行就拉倒,

结果就出现了大量的“水”论文,(原谅我用了这个词,毕竟当年为了毕业,我也干了这种事),我举一个例子,CEnet里面的膨胀卷积+最大池化,为什么要设这个参数,为什么要这么干,作者其实自己并没有完全讲清楚,当然用实验证明也是

可以的,但是我们更讲究理论,这也是深度学习令人诟病的一个重点地方。手工设计的网络跟当年手工设计特征,何其相似!当然了大牛永远是大牛,LI feifei老师提出的auto Deeplearning我个人其实最看好的,下面就是一个自动化语义分割网络的

示例图,大家可以看看(CVPR2019 oral),这里面关键的地方就是自动寻找最优的网络组合,从而得到最优的语义分割网络,这个就非常有意思,这是以后语义分割一个指向灯!

 

图3 AutoDeeplab语义分割网络(参考原作者论文)

 

      5.实验总结

       我们以开源的全地物分类为例,对这几种经典的网络进行对比说明:

图4 原始真彩色高分辨率影像 

图5 使用Inceptionv3作为特征提取的DeepLabv3+语义分割结果

图6 使用mobilenetv2作为特征提取的DeepLabv3+语义分割结果

       从上面三个结果来看,Inceptionv3作为特征提取器要好于mobilenetv2网络,分割效率方面,mobilenet是Inception的三倍左右,效率还是非常高的。当然了,对于精度与效率是看大家的各自需求了!

原帖:https://www.cnblogs.com/wzp-749195/p/11114624.html

      


http://chatgpt.dhexx.cn/article/GqBvOtsa.shtml

相关文章

FCN全卷积网络模型——高分辨率遥感影像地物识别

FCN全卷积网络模型——高分辨率遥感影像地物识别 这是一篇操作日记 win10与ubuntu的caffe安装过程独立,只是两次不同系统下的演习,真正实验在ubuntu下完成。 操作空间 win10 1:Anaconda 2.0 2:Visual Studio 2013 3:caffe 4:python2.7 Ubuntu 16.04 …

高分辨率遥感影像融合技巧

软件下载地址: https://pan.baidu.com/s/1dt0yDUsAork9LnLnZTwCgw 需要百度网盘下载密码,留言邮箱地址。 或联系联系 QQ:1257396288​ 该软件包含高分辨率遥感影像融合功能(pansharp2),融合效果好&#…

【GIS】高分辨率遥感影像智能解译

1 绪论 随着航空科技工业的不断成熟与发展,我国遥感卫星研制能力不断攀升,发射数量逐年提高,在轨运行的遥感卫星为社会生产及居民日常生活提供了巨大的支持与便利。我国目前同时在轨运行的遥感卫星数量已超过60颗,每天获取并传回…

数据结构学习笔记(四)—— 树

树 文章目录 树一.树的基本概念二.树的遍历1.先序遍历2.后序遍历3.中序遍历4.层序遍历 三.树的存储表示和操作实现1.双亲表示法2.孩子表示法3.双亲孩子表示法4.孩子兄弟表示法 四.树的性质五.二叉树基本概念与定义二叉树的特殊形态——斜树二叉树的特殊形态——满二叉树二叉树的…

sklearn学习(集成算法:随机森林)

随机森林树 一.概述【1】集成算法概述1.概念与应用2.集成算法的目标3.其他定义 【2】sklearn中的集成算法1.sklearn中的集成算法模块ensemble(1)类与类的功能 2.复习:sklearn中的决策树3.sklearn的基本建模流程 二.RandomForestClassifier【1…

数据结构与算法之树(三)AVL树

数据结构与算法之树 数据结构与算法之树(一)二叉树概念及遍历方式(图文并茂) 数据结构与算法之树(二)二叉查找树 数据结构与算法之树(三)AVL树 数据结构与算法之树(四…

C语言数据结构总结:树

树 一,树的定义二,树的基本术语三,二叉树的定义四,二叉树的性质和存储结构五,关于二叉树的算法 一,树的定义 树是n(n>0)个结点的有限集合。 若n0,称为空树。 若n>…

【C++从入门到入土】第二十一篇:二叉搜索树之AVL树

AVL树 文章目录 AVL树一、AVL树1.特点2.操作旋转插入删除查找 一、AVL树 在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平…

数据结构--二叉搜索树

二叉搜索树 一丶概念以及特点二丶相关操作定义TreeMap类put()操作--插入节点get()操作--得到key对应的value值getOrDefault()操作containsKey()操作--检查key是否存在containsValue()操作--检查value是否存在remove()操作--删除操作思路(1)叶子结点&…

Java数据结构--树2

Java数据结构--树 一、平衡树1.1 2-3 查找树1.1.1 2-3查找树的定义1.1.2 查找1.1.3 插入1.1.3.1 向2-结点中插入新键1.1.3.2 向一棵只含有一个3-结点的树中插入新键1.1.3.3 向一个父结点为2-结点的3-结点中插入新键1.3.1.4 向一个父结点为3-结点的3-结点中插入新键1.3.1.5 分解…

数据结构之多路查找树

多路查找树 一、2-3树1.1 查找1.2 2-3树的插入实现1.3 2-3树的删除节点 二、2-3-4树三、总结 二叉排序树简单的实现在多数情况能够达到预期的查找效率,但是每个节点只能存储一个元素和只能有两个孩子,使得在大量数据下会造成二叉排序树的深度特别大&…

【数据结构 7】二叉查找树及其Java实现

【数据结构 1】顺序表及其Java实现 【数据结构 2】单向链表及其Java实现 【数据结构 3】双向链表及其Java实现 【数据结构 4】栈及其Java实现 【数据结构 5】队列及其Java实现 【数据结构 6】符号表及其Java实现(使用链表实现) 【数据结构 7】二叉查找树…

C++从入门到精通(第十篇) :二叉搜索树

二叉搜索树 一:二叉搜索树概念二: 二叉搜索树实现节点的定义二叉搜索树实现 三:二叉搜索树的应用四:二叉树有关面试题ps 很多小伙伴为了刷题发愁 今天为大家推荐一款刷题神奇哦:刷题面试神器牛客 各大互联网大厂面试真…

数据结构与算法之树(二)二叉查找树

数据结构与算法之树 数据结构与算法之树(一)二叉树概念及遍历方式(图文并茂) 数据结构与算法之树(二)二叉查找树 数据结构与算法之树(三)AVL树 数据结构与算法之树(四…

【算法修炼】二叉搜索树

学习自:https://labuladong.gitee.io/algo/2/19/26/ 二叉搜索树 一、BST的中序遍历230、二叉搜索树中第k小的元素(中等)1038、从二叉搜索树到更大和树(中等) 二、判断BST的合法性※98、验证二叉搜索树(中等…

数据结构(C语言)-树

树 一、树1、树的定义2、树的基本术语3、树结构和线性结构的比较 二、二叉树1、二叉树的定义2、二叉树的形态与树的形态3、二叉树的性质4 、二叉树的存储结构5、遍历二叉树6、二叉树的其他操作7、线索二叉树 三、树与二叉树的转换1、树转换成二叉树2、二叉树变树 四、哈夫曼树1…

【数据结构与算法】程序内功篇六--树

程序内功篇六--树 一、树1、树的含义2、树的特点(选看)3、树的逻辑结构 二、二叉树1、二叉树的含义2、二叉树性质3、二叉树-顺序存储4、二叉树-链式存储5、二叉树的遍历6、二叉树创建与遍历C程序的实现(1)二叉树的创建(2)前序遍历…

数据结构---与树相关的知识

与树有关的一系列知识: 树,二叉树,满二叉树,完全二叉树,文章还没完,我会后序补充的 一: 树(了解就行)1.1 概念1.2 一些与树相关的重要概念1.3 树的表示形式 二: 二叉树(非常重要,重点掌握)2.1 概念2.2 两种特殊的二叉树2.2.1 满二叉树2.2.2 完全二叉树 2.3 二叉树的性质2.4 二叉…

Java数据结构--树1

Java数据结构--树 一、二叉树入门1.1 树的基本定义1.2 树的相关术语1.3 二叉树的基本定义1.4 二叉查找树的创建1.4.1 二叉树的结点类1.4.2 二叉查找树API设计1.4.3 二叉查找树实现1.4.4 二叉查找树其他便捷方法1.4.4.1 查找二叉树中最小的键1.4.4.2 查找二叉树中最大的键 1.5 二…

树 一

文章目录 1.查找二分查找判定树 2. 树(Tree)2.1 树的术语2.2树的表示:儿子兄弟表示法 3. 二叉树(Binary Tree)3.1 特殊结构二叉树3.2 二叉树的性质3.3 二叉树的存储3.4二叉树的遍历 分层次组织管理上更有效地操作。 1.查找 静态查找&#xf…