基于K-means与CNN的遥感影像分类
一、引言
1.研究背景
航天遥感技术是一种通过卫星对地观测获取遥感图像信息数据的技术,这些图像数据在各领域都发挥着不可或缺的作用。遥感图像分类主要是根据地面物体电磁波辐射在遥感图像上的特征,判断识别地面物体的属性,进而为目标检测与识别等其他应用提供辅助信息,也可以作为最终结果提供基础地理信息用于地图绘测、抢险救灾、军事侦察等领域。遥感影像分类是遥感技术应用的一个重要环节。
遥感影像分类就是利用计算机通过对遥感图像中各类地物的光谱信息和空间信息进行分析,选择特征,将图像中各个像元按照某种规则或算法划分不同的类别,然后获得遥感图像中与实际地物的对应信息,从而实现图像的分类。遥感图像计算机分类的依据是遥感图像像素的相似度。常使用距离和相关系数来衡量相似度。常见的分类方法有:监督分类、非监督分类法
2.研究内容
各方面学者对遥感图像的分类有着诸多研究,提出了许多分类方法,按是否需要选取标记样本可将分类方法分为监督分类和非监督分类。根据最小分类单元可将分类方法分为基于像元的分类、基于对象的分类,以及基于混合像元分解的分类。此外,不同类型的遥感图像(多光谱遥感图像、高光谱遥感图像、合成孔径雷达图像) 分类方法也不尽相同。由于目标分类通常是在特征空间中进行的,因此特征的表达与学习是实现目标分类的关键。根据表达和学习特征的方式,可将现有的遥感图像分类方法大致分为三类: 基于人工特征描述的分类方法、基于机器学习的分类方法和基于深度学习的分类方法。需要注意的是,这三类方法并没有严格的区分界线,相互之间互有重叠和借鉴。本次研究分别使用了一种机器学习和一种深度学习方法进行模型的构建。
二、分类方法
- K-means算法
K-means算法是一种较典型的逐点修改迭代的动态聚类算法,也是一种普遍采用的方法,其要点是以误差平方和为准则函数。一般的作法是先按某些原则选择一些代表点作为聚类的核心,然后把其余的待分点按某种方法(判据准则)分到各类中去,完成初始分类。初始分类完成以后,重新计算各聚类中心,完成了第一次迭代。然后修改聚类中心,以便进行下一次迭代。这种修改有两种方案,即逐点修改和逐批修改。逐点修改类中心就是一个像元样本按某一原则归属于某一组类后,就要重新计算这个组类的均值,并且以新的均值作为凝聚中心点进行下一次像元聚类。逐批修改类中心就是在全部像元样本按某一组的类中心分类之后,再计算修改各类的均值,作为下一次分类的凝聚中心点。
代码展示:
rs_data_trans = rs_data.transpose(1,2,0)
rs_data.shape, rs_data_trans.shape
rs_data_1d = rs_data_trans.reshape(-1, rs_data_trans.shape[2])
rs_data_1d.shape
cl = cluster.KMeans(n_clusters=4) # create an object of the classifier
param = cl.fit(rs_data_1d) # train it
img_cl = cl.labels
img_cl = img_cl.reshape(rs_data_trans[:,:,0].shape)
prof = rs.profile
prof.update(count=1)
with rio.open('result.tif','w',**prof) as dst:
dst.write(img_cl, 1)
fig, (ax1,ax2) = plt.subplots(figsize=[15,15], nrows=1,ncols=2)
show(rs, cmap='gray', vmin=vmin, vmax=vmax, ax=ax1)
show(img_cl, ax=ax2)
ax1.set_axis_off()
ax2.set_axis_off()
fig.savefig("pred.png", bbox_inches='tight')
plt.show()
K-means分类结果(红色:耕地,绿色:森林,蓝色:水体),如图所示:
- CNN算法
CNN卷积网络采用“端对端”的特征学习,通过多层处理机制揭示隐藏于数据中的非线性特征,能够从大量训练集中自动学习全局特征(这种特征被称为“学习特征”),是其在遥感影像自动目标识别取得成功的重要原因,也标志特征模型从手工特征向学习特征转变。本次实验CNN网络架构中设计了四层卷积+池化,然后使用Relu激活函数,最后采用Softmax进行归一化处理计算每个目标类别在所有可能的目标类中的概率,即可对输入的图片进行分类。
代码展示:
# 设计模型: CNN + maxpool
model = tf.keras.models.Sequential([
# 我们的数据是150x150而且是三通道的,所以我们的输入应该设置为这样的格式。
tf.keras.layers.Conv2D(32, (3, 3),
activation='relu',
input_shape=(256, 256, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(64, (3, 3),
activation='relu'),
tf.keras.layers.MaxPooling2D(3, 3),
tf.keras.layers.Conv2D(128, (3, 3),
activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(128, (3, 3),
activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Flatten(), # 512 neuron hidden layer
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(21, activation='softmax') #'sigmoid' ])
对以下图进行识别,输出为森林类别(It is forest),如图所示:
三、总结
深度学习在计算机视觉领域的巨大成功,遥感智能分析提供了重要机遇;机器学习创新,也为遥感影像分类带来更多思路。近年来这些算法被广泛应用在遥感领域,在大范围目标自动快速检测、复杂场景精细分类、地表参数快速识别等方面展示了巨大优势和发展潜力,不断提升智能影像分类效率与质量,为遥感大数据的智能信息提取带来发展契机。
遥感大数据是时空科技发展的新阶段,遥感图像分类、量化、预测,已经由传统的统计数学分析、定量遥感建模分析逐渐向数据驱动的智能分析转变。以智能分析为标志的遥感大数据时代已经到来,如何广泛、深化其应用,还值得产业界、学术界不断探索。但其无疑将在空天产业、智慧城市、政企数字化各领域带来一场深刻变革。
代码:
CNN:
https://gitee.com/A-xinss/cnn-to-remote-sensing-image-classification
CNN-进阶版
K-Means:
https://gitee.com/A-xinss/k-means-to-remote-sensing-image-classification