好久没有更新了,近期做了一个工作,就是用深度学习方法来自动提取高分辨率遥感影像上的道路网络,16年的时候都是用的什么SVM,什么增强线性指数等,手工设计的线性目标增强特征,然后去提取道路,那些个东西说白了,没啥用,在一个小区域可能做的有那么点效果,但是换一个场景,立马就没了,没有任何普适性可言,之前用深度学习方法做过高分辨率影像变化监测工作,这一次,我重新把网络进行了设计,用于提取道路网络,最终生成道路中心,并进行大规模场景实验,结果还是非常不错的,个人觉得在一定程度上可以减少人工提取道路网络的工作量。好了不多说了,介绍下道路网络提取的部分工作,首先是样本部分,样本采用开源的道路网络数据和标签(应该是国外某个地区),大家可以到开源数据网站下载,训练集大概是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,加时备注“全自动道路网络提取”。):

从这个结果来看,已经非常不错了,城市这种非常复杂的环境,跑出这个结果,已经出乎我的预料了,下一步改进应该可以直接工程化了,先写到这里吧。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐