深度学习大规模道路网络自动提取

       好久没有更新了,近期做了一个工作,就是用深度学习方法来自动提取高分辨率遥感影像上的道路网络,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,加时备注“全自动道路网络提取”。

     

 

posted @ 2020-03-05 20:25  我爱木叶123qq  阅读(2898)  评论(0编辑  收藏  举报