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