马萨诸塞州道路数据集预处理

今天我们将分享Massachusetts Roads遥感道路语义分割数据集,并会在下期使用FC-DenseNet进行遥感影像道路提取。

Massachusetts Roads遥感道路语义分割数据集覆盖了美国马萨诸塞州超过2600km2的面积,包含城市、城镇、农村和山区等多种地区的道路信息,图像大小均为1500像素×1500像素,空间分辨率约为1m。其中训练集1108张、验证集14张、测试集49张。部分数据如下所示。 马萨诸塞州道路数据集预处理_第1张图片

前面我们分享的网络中,都是对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)且含有道路目标时,才保存滑窗的结果。

处理完成的结果如下所示。 马萨诸塞州道路数据集预处理_第2张图片

获取方式

感兴趣的可以按文末方式,免费获取原始数据集

获取方法

如有需要,请关注微信公众号「DataAssassin」后,后台回复「026」领取。

本文由 mdnice 多平台发布

你可能感兴趣的:(深度学习)