很久沒有更新了,近期作了一個工做,就是用深度學習方法來自動提取高分辨率遙感影像上的道路網絡,16年的時候都是用的什麼SVM,什麼加強線性指數等網絡
手工設計的線性目標加強特徵,而後去提取道路,那些個東西說白了,沒啥用,在一個小區域可能作的有那麼點效果,可是換一個場景,立馬就沒了,沒有任何普適性性能
可言,以前用深度學習方法作太高分辨率影像變化監測工做,這一次,我從新把網絡進行了設計,用於提取道路網絡,最終生成道路中心,並進行大規模場景實驗,結果學習
仍是很是不錯的,我的以爲在必定程度上能夠減小人工提取道路網絡的工做量。如須要代碼:Email:1044625113@qq.com,qq:1044625113,添加好友時,請備註:道路網絡自動提取!測試
好了很少說了,介紹下道路網絡提取的部分工做,首先是樣本部分,樣本採用開源的道路網絡數據和標籤(應該是國外某個地區),你們能夠到開源數據網站下載,優化
訓練集大概是6000多張1024*1024的三通道高分辨率影像,看下面:網站
圖1 樣本和標籤this
其實,客觀的說,這個樣本作的確實不夠好,爲何呢,由於有一些道路該畫出來的,沒有畫出來,好比說這個樣本上的中間那條路,就沒有畫出來,可是總的來講,在深度學習裏面,google
樣本是燃料,有總比沒有要好,是吧!接下來就輸入到我設計的網絡中來,整體來講,參考了Deeplabv3+的思想,使用多尺度特徵進行提取,可是所有采用分離卷積替換resnet50層,這樣spa
有一個好處,學習速度快,並且輕量,比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,加時備註「全自動道路網絡提取」。