セマンティック解像度リモートセンシング画像分割の深さ研究[ターン]

オリジナルリンク:https://www.cnblogs.com/wzp-749195/p/11114624.html

       私たちの深い学習が、私の分野におけるリモートセンシング画像の自動通訳の同じもたらした急速な発展の面でコンピュータビジョンの分野で大きな成功を収め、リモートセンシング画像の自動解釈を達成したことをすべて知っているだけでなく、いくつかのささやかな仕事をしました、公表され、いくつかの論文は、私は、リモートセンシング分野の自動解釈を心配されています

北京では出張この時点で、最終的には、心の中で互いに右の学習があるときに、現在のセマンティックセグメンテーションの分野では、学習だけでなく、あなたと共有するには、この中のいくつかの経験の深さで硬い表情をシンクすることができます。このブログは、開発の既存のリモートセンシング画像セマンティックセグメンテーションの分野における最先端の方法の進歩、および将来の方向性を議論することです!

       まず、より多くのそれよりも、私はほとんどの現在の結果、約いくつかのセマンティックセグメンテーションネットワークの安定性と高精度を示して使用:1.unetネットワークを、2.Deeplabネットワーク(モバイル特徴抽出、resnet18特徴抽出、resnet50特徴抽出、 Inceptionv3特徴抽出、等); 3.CEnet。

今、私はこれらのタイプのネットワークのための簡単な説明、簡単な開始として、任意の個々の間違った場所ならば、専門家の翼は、以下を参照してください午前1044625113 @ qq.com、電話:15211874660メールを。リモートセンシング画像分割セマンティックコードの完全な範囲を必要とする場合も、私に連絡することができます。

      1.unetネットワーク

      そうUNETネットワークと呼ばれるU字型のような原因形状にUNETネットワーク、それに関する情報を、私たちは、私は詳細には触れませんあまりにも多くのブログCSDN紙紹介を見つけることができます!

      その形状は以下の通りであります:

図1 UNETは(unetCSDNのブログを参照してください)意味ネットワークを分割しました

      その形状から、我々はこれに基づいて改善をたくさん作ることができ、これは、元の論文のアーキテクチャであり、非常に美しい、見ることができ、例えば、特徴抽出ブロックは、我々は残留ネットワークの使用(resnet)を置き換えることができ、これは何が良いですか?勾配の消失を防止しつつ、主に、ネットワークを深め、

あなたは、精度を向上させるために、より深い機能、ヘルプを学ぶことができます。Iは、特徴統合層では、一般に、第1の直接和が直接添加される層と機能をデコード層符号化についてである、2つの方法で使用され、コードのいくつかのバージョンを読み取り、別の共通の連結は二つについて、ありますどのような長所と短所の、私は、それを理解します

、追加機能や方法のために、直感的なパフォーマンスは、GPUのメモリを節約することであり、連結は、効果は良いですが、GPUのメモリは確かに高価になるだろう、白は前のベクトル(ベクトルスタッキング)の和であることを、実際には、より多くの機能を組み込むことができますしかし、その後、それ連結よりも良い場合は?私たちができる、実験を行う必要はありません

試しにコードを実行しています!

 

      2.Deeplabネットワーク

図3 DeeplabV3plusは、(元の著者紙参照)意味ネットワークを分割しました

      実際には、それはDeeplabネットワークから見ることができ、このネットワークはそんなに複雑な組み合わせは、シンプルで美しいではないというように、物事の核心は、コンボリューションの4つの空のブロックで、コンボリューションカーネルサイズは、なぜ著者について、161218でしたその4つのパラメータのみ、著者は実験的にちょうど記載されて、

これら四つのパラメータは、最高の精度とすることができるとともに、解像度が別のことをいうことを証明し、異なるサイズの空洞畳み込みカーネルは、特性の異なる範囲を感じることができます。4倍のサンプルサイズ連結していることを特徴と第より重要な場所は、もっと重要なのは、それがコーディング層と層復号を組み合わせ

特徴は、本質的に、これは実際にUNETの変種ですが、特徴抽出ネットワークをカスタマイズすることができ、例えば、ここで私はmobilenet、inceptionv3、resnet18、resnet50他の4つの古典的な特徴抽出ネットワークを実現しました。

      ASPP(空間ピラミッドプーリング)、以下を達成するためのコアコードの内部のDeeplabV3重要な部分について:

复制代码
%% 创建空洞卷积空间金字塔网络,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的三倍左右,效率还是非常高的。当然了,对于精度与效率是看大家的各自需求了!

      

      先写到这里,有空再持续更新,qq:1044625113,加qq时,请备注(语义分割交流)!

おすすめ

転載: www.cnblogs.com/xiexiaokui/p/12151688.html