深度學習高分辨率遙感影像語義分割git
深度學習你們都知道,在計算機視覺領域取得了很大的成功,在遙感影像自動解譯方面,一樣帶來了快速的發展,我在遙感影像自動解譯領域,也作了一些微薄的工做,發表幾篇論文,我一直關注遙感影像自動解譯領域,github
在北京出差的這段時間,終於能夠沉下心來,好好研究下深度學習,目前在語義分割領域,也有部分心得,在此同你們分享,權當是互相學習。本篇博文就是論述現有的state-of-art方法在遙感影像語義分割領域的進展,及之後的發展方向!算法
首先很少說,我採用當前效果表現最穩定、精度較高的幾種語義分割網絡進行講述:1.unet網絡;2.Deeplab網絡(mobile特徵提取器,resnet18特徵提取器,resnet50特徵提取器,Inceptionv3特徵提取器等);3.CEnet。網絡
下面我對這幾種網絡進行簡單的講解,單純做爲拋磚引玉,若有個別不當的地方,請看到的專家不吝賜教,Email:1044625113@qq.com,Phone:15211874660。若是你們須要全套遙感影像語義分割代碼,一樣能夠聯繫我。架構
1.unet網絡框架
unet網絡因爲形狀像一個u型,所以稱爲Unet網絡,關於它的資料,你們能夠在CSDN的一篇博客找到,介紹的論文太多我就不細講了!ide
它的形狀以下圖所示:學習
圖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的三倍左右,效率仍是很是高的。固然了,對於精度與效率是看你們的各自需求了!
先寫到這裏,有空再持續更新,qq:1044625113,加qq時,請備註(語義分割交流)!