/Semantic-segmentation-of-remote-sensing-images

遥感图像的语义分割,基于深度学习,在Tensorflow框架下,利用TF.Keras,运行环境TF2.0+

Primary LanguagePythonApache License 2.0Apache-2.0

Semantic-segmentation-of-remote-sensing-image
基于深度学习关于遥感影像的语义分割

首先看一下数据集,包含原始影像与标签,实际的分辨率很大,这个只是缩略图。
影像数据是Landsat8卫星的,用五四三波段进行合成,并利用GS方法进行全色第八波段的融合。(Envi软件处理)
标签是通过矢量图层以ArcGIS软件来处理生成的。

此代码库可在Tensorflow下keras环境运行,在Tensorflow1.12及Tensorflow2.0测试运行,代码更改后,更适合于Tensorflow2.0

train label

Unet、FPN模型及嵌入相关模块后的结果:

通过fit_generator运行,所以生成器需要自己编写,FCN8S与Segnet均为序列式模型与Keras的Model类有些不同,可以调用更多的方法。
展示一下Unet模型及FPN模型在此数据集上的结果,结果比Segnet与FCN好太多,所以就在这里不对比Segnet与FCN了。

其中Unet未经过预训练,其他集成的模块都经过了Imagenet预训练,并且测试都是通过划分数据来进行测试的,train75%,val25%。

准确率对比:

ACC

Iou对比:

IOU

Loss对比:

Loss

参数对比:

在相同的硬件条件下运行: 参数

不同全色波段融合方法的结果:

在目录里可以看到,这个影响不大。

Unet++模型结果:

混淆矩阵百分比:

混淆矩阵

混淆矩阵像素数:

混淆矩阵

相关统计:

当中1,2,3,4,5,15分别代表预测后的像素值,每个像素值代表一类 1 2 3

结果图的拼接痕迹问题:

我认为这个很大概率上跟模型的拟合能力、泛化能力有关,所以这个问题不用考虑,只要能够训练到所有的像素就可以了。 Unet等相关模型预测的图,“拼接痕迹”很小。

代码运行:

弄好数据集后,需要切割,切割的话这个可以参考一下生成数据并增强.py,更改相关参数即可。
然后通过里面的Segnet的训练程序启动即可,需要修改参数。
这个Segnet、FCN8S是用序列式类来实现的模型,所以预测的话是跟Model类有一点不相同,就是可以调用predict_classes的方法。
Model类文件里提供了使用Model类的模型的预测方法。
以上所有代码只是提供参考,训练其他数据的话很多参数需要自己修改,甚至生成器也需要更改,如果想对数据类别进行加权或使用样本权重,主要记得在生成器中做修改就可以了。

CRF后处理:

模型预测完毕后,可以使用CRF进行后处理,CRF.py文件提供了相关代码参考,但未必保证结果可靠。

GDAL

如果自己做的图包含多个波段(往往大于4个),Opencv或PIL就不太顶用了,这时候GDAL就派上用场了
例如我有一个十波段图像,用此函数读取后为numpy数组类,shape为[h,w,10]

from osgeo import gdal
import numpy as np

def load_img(path):
    dataset = gdal.Open(path)
    im_width = dataset.RasterXSize
    im_height = dataset.RasterYSize
    im_data = dataset.ReadAsArray(0,0,im_width,im_height)
    im_data = im_data.transpose((1,2,0)) #此步保证矩阵为channel_last模式
    return im_data

提示

我的该贡献库中,提供了一些分割的模型及相关指标与损失的代码
1044197988-TF.Keras-Commonly-used-models