GID数据集(Gaofen Image Dataset)由武汉大学夏桂松团队制作。它包含从中国60多个城市获得的150张高分辨率Gaofen-2(高分二号卫星)图像(7200*6800)。这些图像覆盖了超过50,000平方公里的地理区域。GID中的图像具有高的类内分集以及较低的类间可分离性。分为建成区、农用地、林地、草地、水系与未标记区域,共6类,如下图所示。
这个数据用来做遥感深度学习影像解译(语义分割)是比较好的素材,特别是对于很多同学无法直接找到清晰可用的语义分割素材。VOC数据集比较适合通用的语义分割,对于遥感影像的分割用这一类高分卫星拍摄的数据比较好。
武大的GID数据包含150张高分辨率影像以及其标签,但是标签是以RPG三通道的图片存储的,不利于我们直接拿来训练,语义的分割的标签最好是单通道灰度图,每个像素赋予一个标签。所以我们需要对原始的标签进行一些处理。直接上代码:
"""
make label
@author: ZhangJian
"""
from skimage.io import imread, imsave
import skimage
import numpy as np
import os
def label(img_path, new_path, file_name="label2.tif"):
img = imread(img_path)
#print(img)
print(img.shape)
width = img.shape[0]
height = img.shape[1]
print(type(img[0][0]))
new_image = np.random.randint(0, 256, size=[width, height], dtype=np.uint8)
print(np.array([0, 255, 0]))
for i in range(img.shape[0]):
for j in range(img.shape[1]):
if all(np.array(img[i][j]) == np.array([255, 0, 0])): # 红色,建成区
#new_image[i][j] = 100
new_image[i][j] = 1
elif all(np.array(img[i][j]) == np.array([0, 255, 0])): # 绿色,农用地
#new_image[i][j] = 50
new_image[i][j] = 2
elif all(np.array(img[i][j]) == np.array([0, 255, 255])): # 天蓝色,林地
#new_image[i][j] = 150
new_image[i][j] = 3
elif all(np.array(img[i][j]) == np.array([255, 255, 0])): # 黄色,草地
#new_image[i][j] = 200
new_image[i][j] = 4
elif all(np.array(img[i][j]) == np.array([0, 0, 255])): # 蓝色,水系
#new_image[i][j] = 250
new_image[i][j] = 5
else:
new_image[i][j] = 0
pass
imsave(new_path+file_name, new_image)
#skimage.io.imshow(new_image)
#skimage.io.show()
if __name__ == "__main__":
# 读取文件夹下的所有图片,并进行处理,存储到相应文件夹下
files = os.listdir("H:\深度学习二期\武大公开数据\label_5classes")
for file in files:
print("--------------%s" % file)
label("H:\\深度学习二期\\武大公开数据\\label_5classes\\"+file, "H:\\深度学习二期\武大公开数据\\mylabel\\", file)
这里要注意的就是,我读取的是三通道的RGB图像,生成的是单通道的灰度图像,因此我的size里面就定义了两个维度。另外就是,在遍历原图像时,判断某个像素是否属于某种颜色的时候,由于是三通道的数组,不能直接用"=="比较,而是要加上all( ),也就是数组中的每个元素都相同才行。
生成后的标签直接打开是一片黑的,因为我赋值直接给出了1,2,3,4,5,相对于[0,255]区间的灰度值来说,都是接近黑色的,因此直接看是看不出来的。需要在QGIS一类的软件中展现:
网友评论