今天我们将分享Massachusetts Roads遥感道路语义分割数据集,并会在下期使用FC-DenseNet进行遥感影像道路提取。
Massachusetts Roads遥感道路语义分割数据集覆盖了美国马萨诸塞州超过2600km2的面积,包含城市、城镇、农村和山区等多种地区的道路信息,图像大小均为1500像素×1500像素,空间分辨率约为1m。其中训练集1108张、验证集14张、测试集49张。部分数据如下所示。
前面我们分享的网络中,都是对256*256的图像进行读取,因此我们需要对原始数据集进行处理,使之满足我们的模型需要。
这里我们调用python的rasterio库对tif影像进行操作。
「Rasterio」是一个很多模块是基于GDAL的 Python 包,可用于处理地理空间栅格数据,例如 GeoTIFF文件。为此,可以使用许多模块和函数,例如,处理来自卫星的原始数据、读取栅格数据、检索地理元数据、转换坐标、裁剪图像、合并多个图像以及以其他格式保存数据。大量的功能和易于实施使 Rasterio 成为卫星数据分析的标准工具。可以使用pip直接安装
pip install rasterio
也可以在https://www.lfd.uci.edu/~gohlke/pythonlibs/根据python版本自行下载对应rasterio的whl文件。
安装完成后,开始进行数据处理。
import os
import rasterio
from rasterio.windows import Window
def crop_images(input_folder, output_folder, window_size=256, stride=256):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for root, dirs, files in os.walk(input_folder):
for file in files:
if file.endswith('.tif') or file.endswith('.tiff') : # 假设影像为TIFF格式,根据实际情况修改
img_path = os.path.join(root, file)
label_path = img_path.replace('data', 'label')
if not os.path.exists(label_path):
# 尝试更换文件后缀名为.tif
label_path = label_path.replace('.tiff', '.tif')
# 获取对应的label路径
output_img_folder = root.replace(input_folder, output_folder)
output_label_folder = output_img_folder.replace('data', 'label')
if not os.path.exists(output_img_folder):
os.makedirs(output_img_folder)
if not os.path.exists(output_label_folder):
os.makedirs(output_label_folder)
with rasterio.open(img_path) as src_img:
with rasterio.open(label_path) as src_label:
width = src_img.width
height = src_img.height
for y in range(0, height - window_size + 1, stride):
for x in range(0, width - window_size + 1, stride):
window = Window(x, y, window_size, window_size)
img_crop = src_img.read(window=window)
label_crop = src_label.read(window=window)
# 如果影像中含有目标并且不含nodata空值,则保存裁剪后的影像和label
if label_crop.any() and not (img_crop == 255).any():
output_img_path = os.path.join(output_img_folder, f"{file.split('.')[0]}_{x}_{y}.tif")
output_label_path = os.path.join(output_label_folder, f"{file.split('.')[0]}_{x}_{y}.tif")
profile = src_img.profile
profile['width'], profile['height'] = window_size, window_size
with rasterio.open(output_img_path, 'w', **profile) as dst_img:
dst_img.write(img_crop)
profile_label = src_label.profile
profile_label['width'], profile_label['height'] = window_size, window_size
with rasterio.open(output_label_path, 'w', **profile_label) as dst_label:
dst_label.write(label_crop)
# 调用函数对数据集进行裁剪
train_folder = './马萨诸塞州数据集/train'
val_folder = './马萨诸塞州数据集/valid'
test_folder = './马萨诸塞州数据集/test'
crop_images(train_folder, 'train_cropped', window_size=256, stride=256)
crop_images(val_folder, 'val_cropped', window_size=256, stride=256)
crop_images(test_folder, 'test_cropped', window_size=256, stride=256)
上述代码首先读取影像与对应的标签(由于部分标签后缀为tif,而大多数影像为tiff,所以在读取影像与标签时,需要进行替换后缀)。而后通过滑窗的方式生产256*256的数据,同时由于部分影像存在空值,会对后续训练产生影响,所以我们对滑窗产生的结果进行一个判断,只有当结果不存在空值(这里值为255,255,255)且含有道路目标时,才保存滑窗的结果。
处理完成的结果如下所示。
获取方式
感兴趣的可以按文末方式,免费获取原始数据集。
获取方法
如有需要,请关注微信公众号「DataAssassin」后,后台回复「026」领取。
本文由 mdnice 多平台发布