深度學習大規模道路網絡自動提取


       好久沒有更新了,近期做了一個工作,就是用深度學習方法來自動提取高分辨率遙感影像上的道路網絡,16年的時候都是用的什么SVM,什么增強線性指數等

手工設計的線性目標增強特征,然后去提取道路,那些個東西說白了,沒啥用,在一個小區域可能做的有那么點效果,但是換一個場景,立馬就沒了,沒有任何普適性

可言,之前用深度學習方法做過高分辨率影像變化監測工作,這一次,我重新把網絡進行了設計,用於提取道路網絡,最終生成道路中心,並進行大規模場景實驗,結果

還是非常不錯的,個人覺得在一定程度上可以減少人工提取道路網絡的工作量。如需要代碼:Email:1044625113@qq.com,qq:1044625113,添加好友時,請備注:道路網絡自動提取!

       好了不多說了,介紹下道路網絡提取的部分工作,首先是樣本部分,樣本采用開源的道路網絡數據和標簽(應該是國外某個地區),大家可以到開源數據網站下載,

訓練集大概是6000多張1024*1024的三通道高分辨率影像,看下面:

                                           圖1 樣本和標簽

     其實,客觀的說,這個樣本做的確實不夠好,為什么呢,因為有一些道路該畫出來的,沒有畫出來,比如說這個樣本上的中間那條路,就沒有畫出來,但是總的來說,在深度學習里面,

樣本是燃料,有總比沒有要好,是吧!接下來就輸入到我設計的網絡中來,總體來說,參考了Deeplabv3+的思想,使用多尺度特征進行提取,但是全部采用分離卷積替換resnet50層,這樣

有一個好處,學習速度快,而且輕量,比Deeplab輕了5倍,更為關鍵的是,一張卡可以扔進更多的樣本。一張RTX2080ti可以扔進16個1024*1024的樣本,而一般的Deeplabv3v 只能扔進4個,

多了就out of memory了,可能在學術上意義不大,但是在工程上意義巨大,因為工頭往往不會有那么多時間給你訓練!!!!!(開個玩笑)

    模型訓練完畢,測試結果代碼如下所示:

function resultBlock = testDLmodel(imgBlock, inputSize, net)
% we can use this function to process big image

TestImg = imgBlock(:,:,1:3);                                            % google 地圖下載的是四個通道

patchSize = inputSize;                                                 % 按照訓練圖像塊的大小去分塊預測
Result = segmentImage(TestImg, net, patchSize);
Result = im2bw(mat2gray(Result), 0.1);

line = extractionLine(Result);                                         % 提取中心線

se = strel('disk',2);
line = imdilate(line, se);
resultBlock = labeloverlay(mat2gray(TestImg),line,'Transparency',0);          % 疊加到原始影像上

fprintf(['a block has been finished...\n']);

% imwrite(mat2gray(line),[path(1:end-4),'_LiteSeg_out_Line.tif']);
% imwrite(mat2gray(Result),[path(1:end-4),'_LiteSeg_out.tif']);

end

  由於影像實在太大,我用了分塊處理的方式進行解決,這樣簡單而又方便的解決IO,內存不足的問題了,這個比較工程手段了,其實我個人學術上也做了一點工作,

我發現學院派有一個很大的缺點,就是小區域做個實驗就完事了,但是真正的工程不是這樣的,小區域實驗成功后,應當大規模應用起來,所以我的博客都是一些實際而

又有用的工作,比如下面這個分塊處理大影像問題:

%% read test image
load net_liteSegModel.mat
inputSize = [4096, 4096];


%% block process to extract road line
fun = @(block_struct) testDLmodel(block_struct.data, inputSize, net);        % 調用分塊處理超大影像
blockproc('岳麓區.tif', inputSize, fun, 'Destination', '岳麓區中心線.tif');

     在開源數據訓練完畢后,我直接爬了google數據進行測試,地區選擇國內湖南地區,大小是4萬*3萬像素,總共是14個g,跑完大概花了30分鍾,如果換成固態硬盤會快的多,如果並行的話,

控制在10分鍾以內應該問題不大,主要時間花在IO上面了,窮人只能用機械硬盤,唉。。。。。好了,直接看結果吧!

 

                                                                            圖2 道路提取結果

      圖中藍色區域為道路中心線,大家可能看的不是非常清晰,下面我放大幾個區域:

                       

                                                                         圖3 農田部分

                        

                                                                        圖4 山區公路部分  

                        

                                                                圖5 山區盤山泥濘小路

                        

                                                             圖6 丘陵地帶道路提取結果

     從結果來看,確實是不錯的,但是仍然存在部分道路網絡斷裂,彎曲等等,這些可以通過后續優化來改進,不是特別難的問題了,

    下面我們來測試一下這個模型的極限性能,它在復雜的城市道路網表現如何呢?我選擇了深圳全市作為測試區域,進行了測試,結果看下面;

 

 

我們挑選幾個復雜的場景看看:

 

 

     從這個結果來看,已經非常不錯了,城市這種非常復雜的環境,跑出這個結果,已經出乎我的預料了,下一步改進應該可以直接工程化了,先寫到這里吧。

    好吧,如果大家有需要的代碼的,請聯系我吧。qq:1044625113,加時備注“全自動道路網絡提取”。

     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM