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


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

         

  • 相关阅读:
    XSS 1
    KALI修改密码
    bugku web4
    16进制 32进制 base64之间的区别
    buuctf
    buuctf wireshark
    buuctf 变异凯撒
    2016集训测试赛(二十)Problem A: Y队列
    USACO 4.1.1 麦香牛块 Beef McNuggets
    2016集训测试赛(十八)Problem C: 集串雷 既分数规划学习笔记
  • 原文地址:https://www.cnblogs.com/wzp-749195/p/12422455.html
Copyright © 2020-2023  润新知