遥感图像语义分割数据集制作(使用ArcGIS Pro)

0. 引言

图像分割就是把图像空间按照一定的要求分成一些“有意义”的区域的技术叫图像分割
一幅图像通常是由代表物体的图案与背景组成,简称物体与背景。若想从一幅图像中“提取”物体,可以设法用专门的方法标出属于该物体的点,如把物体上的点标为“1”,而把背景点标为“0”,通过分割以后,可得一幅二值图像

如图所示,我们将遥感图像中目标地物作为前景,通过语义分割网络实现前景与背景之间的分割:

1. 数据获取

遥感数据获取的方式有很多,主要包括自身项目获取的商业卫星影像(如高分系列卫星数据等)和通过网站下载获取的开源免费的遥感卫星数据(如Landsat、Sentinel、MODIS等)。下面列举了一些用于获取常用的免费的遥感卫星数据的网站:

1.1 欧空局ESA 哨兵数据

Copernicus Data Space 是ESA提供的在线数据服务平台,主要提供Sentinel卫星数据。用户需要注册账号后,可以通过该平台检索和下载Sentinel数据。Copernicus Data Space 生态系统 |欧洲的地球之眼icon-default.png?t=O83Ahttps://dataspace.copernicus.eu/

1.2 Earth Data地球科学数据系统(NASA)

地球科学数据系统 (ESDS) 计划提供对 NASA 地球科学数据收集的全面和开放访问,提供了多种遥感数据,包括MODIS、ASTER等。用户可以在该网站上注册账号,并通过不同的工具获取数据,如NASA Worldview、NASA GIBS等。

Earthdata | Earthdata (nasa.gov)icon-default.png?t=O83Ahttps://www.earthdata.nasa.gov/

1.3  Google Earth Engine(GEE)

GEE是一个在线的遥感数据处理平台,提供了全球范围内多种遥感数据。用户可以通过编写JavaScript代码在平台上进行数据处理和下载,包括Landsat、Sentinel、MODIS等系列卫星的遥感影像数据。

https://developers.google.com/earth-engine/icon-default.png?t=O83Ahttps://developers.google.com/earth-engine/

1.4 地理空间数据云

地理空间数据云是中国科学院计算机网络信息中心下属数据平台,具有包括Landsat、MODIS、Sentinel等常见遥感数据,也包括高分1/2/3/4/5/6号、资源三号等国产数据。

地理空间数据云icon-default.png?t=O83Ahttps://www.gscloud.cn/home

1.5 NOAA系列卫星数据

NOAA(美国国家海洋和大气管理局)的卫星系列广泛应用于科研、气象预报、环境监测和灾害管理等领域。如GOES(地球静止环境卫星)系列,提供实时天气监测和预报,能够跟踪风暴、温度、湿度等气象参数。POES(极地轨道环境卫星)系列和JPSS(联合极地卫星系统),获取全球气候数据,监测温度、降水、海冰覆盖等。SST(海表温度)和海洋色素数据,有助于研究海洋生态系统和气候变化。此外,NOAA系列卫星还可以提供关于温室气体、气溶胶和臭氧层等大气成分的数据,支持环境和气候变化研究。

国家环境卫星、数据和信息服务 (noaa.gov)icon-default.png?t=O83Ahttps://www.nesdis.noaa.gov/

1.6 吉林一号高分辨率影像

“吉林一号”卫星遥感影像已广泛应用于国土资源监测、土地测绘、矿产资源开发、智慧城市建设、交通设施监测、农业估产、林业资源普查、生态环境监测、防灾减灾及应急响应等领域。

该系列卫星数据可通过教育认证形式申请免费数据使用,分辨率可达亚米级!!

吉林一号网 (jl1mall.com)icon-default.png?t=O83Ahttps://www.jl1mall.com/

2. 数据标注

在计算机视觉任务中,尤其是在图像分割领域,数据标注通常使用Labelme工具进行目标标记。然而,与常规RGB图像(如.jpg和.png格式)不同,遥感图像通常包含更多的数据通道(如.tif格式),并且包含丰富的空间坐标信息。因此,使用传统的数据标注方法往往会导致重要属性信息的丢失。

在接下来的部分,我们将以ArcGIS Pro工具为例,进行遥感图像的数据人工标注,以便为深度学习模型的训练提供高质量的输入数据。通过这种方式,我们可以更好地保留遥感图像的多维信息,从而提高模型的性能和准确性。

2.1 加载遥感影像

2.2 新建shapefile(矢量)文件

2.3 标注目标地物

1. 选中新建的shapefile图层

2. 选择编辑

3. 点击创建

4. 选择面

5. 开始勾画索要提取的区域

2.4  设置属性值

1.选中新建的shapefile图层

2.右键该图层打开属性表

3.点击按属性选择

4.选择所有id=0的数据

5.点击计算

6.在计算字段的选项框中字段名称选择id,选择插入值选项,并将插入值=255

注:值255后续可用于创建Label文件时作为目标地物的像元值,该部分也可以在开始时新建一个属性字段value用于保存目标地物的像元值。

当目标地物为多个类别时,可采用不同的像元灰度值作为每一类地物的标识,如128,255等,背景为0

7.点击确定

2.5 将矢量标注文件转换为栅格数据

1.在顶部的视图选项中选择地理处理选项

2. 查找面转栅格工具

3. 在面转栅格的工具栏内进行设置

!!在该部分中,输入要素选择最开始创建的shapefile图层,值字段选择所设置像元灰度值的字段名称,输出的栅格数据集选择自己的路径,像元分配类型以像元中心,像元大小选择进行标注的影像。

!!随后点击环境配置,在该部分中,像元大小,捕获栅格输出的坐标均要以最开始参考的影像一致,不然会出现导出的栅格图层与原始的影像像元数不对应的情况。

最后点击运行,便可将所标注的矢量转为栅格数据(.tif格式),并在ArcGIS Pro中检查该标注栅格是否与原始影像的栅格像元数大小一致

 

3. 数据集制作

在初步标注数据后,我们将获得一对影像:原始的遥感影像和相应的标注影像。然而,由于遥感影像的像元数量(即宽度和高度)往往较大且不规则,而深度学习模型的训练则需要规则的像元大小(如256×256或512×512),因此需要对数据进行进一步处理,以符合网络训练的要求。

接下来,我们将采用Python和GDAL库进行数据的滑动裁剪,以生成符合训练需求的标准化影像。这一过程不仅能保证影像的连续性和完整性,还能有效提高模型的训练效率和准确性。

 3.1 滑动裁剪

下面这段代码用于对遥感影像进行滑动裁剪,以生成适合深度学习模型训练的数据集。

代码的主要功能分为三个部分:读取影像、滑动裁剪和保存裁剪结果。

  1. 读取数据read_image函数使用GDAL库读取指定路径的影像文件。可以选择读取特定波段或所有波段,并将影像数据以NumPy数组的形式返回。如果影像无法打开,将返回None。

  2. 滑动裁剪sliding_crop函数对读取的影像进行裁剪。首先,计算是否需要在图像的边缘进行填充,以确保裁剪窗口的完整性。然后,利用指定的窗口大小和步长,在影像上进行滑动裁剪,生成多个裁剪的小图像,这些小图像被存储在列表中并返回。

  3. 保存数据save_crops函数负责将裁剪后的影像保存到指定目录中。首先检查输出目录是否存在,不存在则创建之。接着,通过检查现有文件,确保新文件的命名不与已有文件冲突。每个裁剪图像使用连续的索引命名。save_image函数使用GDAL库将影像数据保存为GeoTIFF格式。

在主程序部分,代码读取原始影像和标注影像,确保它们的尺寸相同后,执行裁剪并保存结果。如果尺寸不一致,程序会输出相应的错误信息。整体流程高效且易于扩展,适合处理大规模遥感影像数据集。

import os
from osgeo import gdal
import numpy as np
from tqdm import tqdm

# 读取数据
def read_image(image_path, num_bands=None, selected_bands=None):
    dataset = gdal.Open(image_path)
    if dataset is None:
        print(f"Could not open image: {image_path}")
        return None
    else:
        if num_bands is None:
            num_bands = dataset.RasterCount
        image_data = []
        for i in range(1, num_bands + 1):
            if selected_bands is not None and i not in selected_bands:
                continue
            band = dataset.GetRasterBand(i)
            band_data = band.ReadAsArray()
            image_data.append(band_data)
        return np.array(image_data)

# 滑动裁剪
def sliding_crop(image, window_size=(512, 512), stride=256):
    height, width = image.shape[1], image.shape[2]

    # 计算需要填充的高度和宽度
    pad_height = 0
    pad_width = 0
    if height % window_size[0] != 0:
        pad_height = window_size[0] - (height % window_size[0])
    if width % window_size[1] != 0:
        pad_width = window_size[1] - (width % window_size[1])

    # 在图像右侧和下侧填充0值
    padded_image = np.pad(image, ((0, 0), (0, pad_height),
                          (0, pad_width)), mode='constant', constant_values=0)

    crops = []
    for y in range(0, height + pad_height - window_size[0] + 1, stride):
        for x in range(0, width + pad_width - window_size[1] + 1, stride):
            crop = padded_image[:, y:y+window_size[0], x:x+window_size[1]]
            crops.append(crop)
    return crops

# 保存数据
def save_crops(crops, output_dir):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    existing_files = os.listdir(output_dir)
    existing_indices = set()
    for filename in existing_files:
        if filename.startswith("crop_") and filename.endswith(".tif"):
            index_str = filename.split("_")[1].split(".")[0]
            existing_indices.add(int(index_str))

    start_index = max(existing_indices) + 1 if existing_indices else 0

    for i, crop in enumerate(crops):
        output_path = os.path.join(output_dir, f"crop_{start_index + i}.tif")
        save_image(crop, output_path)

def save_image(image_data, output_path):
    num_bands, height, width = image_data.shape
    driver = gdal.GetDriverByName("GTiff")
    dataset = driver.Create(output_path, width, height,
                            num_bands, gdal.GDT_Byte)
    for i in range(num_bands):
        dataset.GetRasterBand(i + 1).WriteArray(image_data[i])
    dataset.FlushCache()


if __name__ == "__main__":
    # 影像的路径
    image_path = r"xxxx.tif"
    # 标签的路径
    label_path = r"xxxx.tif"
    images = read_image(image_path)
    labels = read_image(label_path, 1)
    if images.shape[1:] == labels.shape[1:]:
        print("Images have same dimensions. Starting cropping...")
        # 设置滑动窗口的大小及步长,用于生成重叠的滑动裁剪块
        images_crops = sliding_crop(images, window_size=(512, 512), stride=256)
        labels_crops = sliding_crop(labels, window_size=(512, 512), stride=256)
        # 保存裁剪后的图像
        save_crops(images_crops,
                   r"H:\Images")# 影像块的文件夹
        save_crops(labels_crops,
                   r"H:\Labels")# 标签块的文件夹
        print("Cropping done and crops saved!")
    else:
        print("Images have different dimensions. Cannot proceed with cropping.")

最终,通过上述代码,我们可以生成两个对应的文件夹:Images和Labels,分别用于保存原始的遥感影像和相应的标签影像。接下来,用户可以根据自己的语义分割网络的数据读取方式,顺利进行网络训练。

代码已上传至GitHub仓库,未来还将定期更新更多用于遥感图像处理的Python代码,欢迎关注和使用!

GitHub - Harsh-M1/Tools-for-making-semantic-segmentation-data-sets-of-remote-sensing-images: The warehouse is used for making related tools for semantic segmentation data of remote sensing images, including: 1-.tif format remote sensing image and label image cropping (sliding cropping) Images and labels in 2-.tif format are converted to. jpg and. png formats. 3-label(.png format) is changed from 0-255 to gray values of 0, 1 and 2. ......The warehouse is used for making related tools for semantic segmentation data of remote sensing images, including: 1-.tif format remote sensing image and label image cropping (sliding cropping) Images and labels in 2-.tif format are converted to. jpg and. png formats. 3-label(.png format) is changed from 0-255 to gray values of 0, 1 and 2. ...... - Harsh-M1/Tools-for-making-semantic-segmentation-data-sets-of-remote-sensing-imagesicon-default.png?t=O83Ahttps://github.com/Harsh-M1/Tools-for-making-semantic-segmentation-data-sets-of-remote-sensing-images/tree/main

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/885022.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于开发板与虚拟机网络不通问题排查

文章目录 一、网络连接二、排查过程1. 首先检查Windows和开发板的WIFI模块是否处于同一个局域网2. 检查端口转发配置是否正确3. 查看防火墙是否关闭 一、网络连接 开发板(客户端)---wifi模块---无线路由器---Windows主机---NAT模式---Ubuntu虚拟机&…

Rust语言桌面应用开发GTK3 Gtk3-rs Glade

文章目录 GTK-RSGithub官网Rust 教程Rust 环境安装 GTK安装 Gladedemo.glade 文件完整示例 main.rs创建 Rust 项目Cargo.toml 文件main.rs 文件 编译运行GTK主题 GTK-RS gtk-rs 是一个用于在 Rust 编程语言中使用 GTK 图形用户界面工具包的库。GTK 是一个流行的跨平台 GUI 工具…

3-3 AUTOSAR RTE 对SR Port的作用

返回总目录->返回总目录<- 一、前言 RTE作为SWC和BSW之间的通信机构,支持Sender-Receiver方式实现ECU内及ECU间的通信。 对于Sender-Receiver Port支持三种模式: 显式访问:若运行实体采用显示模式的S/R通信方式,数据读写是即时的;隐式访问:当多个运行实体需要读取…

智能红外抄表系统的设计与实现(论文+源码)_kaic

摘 要 随着我国现代社会经济的快速发展&#xff0c;工厂居民用电量剧增。人工抄表&#xff0c;费时费力&#xff0c;效率低下。人工抄表会造成漏抄、误抄、估抄等数据不准确。抄表人员可能与用电户合伙作弊&#xff0c;给资产管理者带来损失。在很多智能仪表的应用中需要现场人…

RocketMQ消息发送之广播模式

前言 在前面的文章中我们回顾了RocketMQ的顺序消息和乱序消息&#xff0c;以及里面包含的乱序消息和全局消息&#xff0c;RocketMQ支持多种消息类型和消费模式 今天这篇文章主要介绍RocketMQ的广播消息。希望文章能为正在学习RocketMQ相关知识的大佬们提供帮助&#xff01; 广…

Qt QVector类

Qt中的QVector是一个模板类&#xff0c;用于存储和操作动态数组。它类似于C标准库中的std::vector&#xff0c;但提供了更多的Qt特有的功能和便利性&#xff0c;更适合在Qt应用中使用。 创建和初始化 // 1&#xff09;默认构造函数&#xff1a;创建一个空的QVector对象。 QV…

笔记整理—linux进程部分(2)使用fork创建进程

为什么要创建进程&#xff0c;首先每个程序的运行都需要一个进程&#xff1b;多进程实现宏观上的并行。 fork的原理&#xff0c;是进程的分裂生长模式。如果操作系统需要一个新的进程&#xff0c;那么就会以cp的方法得到一个新的进程&#xff0c;此时老的进程是父进程&#xff…

指定PDF或图片多个识别区域,识别区域文字,并导出到Excel文件中

常见场景 用户有大量图片/PDF文件&#xff0c;期望能将图片/PDF中的多个区域中的文字批量识别出来&#xff0c;并导入到Excel文件中。期望工具可以批量处理、离线识别&#xff08;保证数据安全性&#xff09;。手工操作麻烦。具体场景&#xff1a;用户有工程现场照片&#xff…

应用层 IV(万维网WWW)【★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、WWW 的概念与组成结构 1. 万维网的概念 万维网 WWW&#xff08;World Wide Web&#xff09;并非某种特殊的计算机网络。万维网是一个大规模的、联机式的信息…

本地生活服务项目有哪些:如何利用本地生活市场,打开线下流量!

随着各大互联网公司在本地生活服务板块的布局力度持续加大&#xff0c;越来越多的人都开始意识到了它背后所蕴含着的发展前景和收益潜力&#xff0c;进而纷纷打听起了与之相关的消息。而就小编与多位创业者的交流情况而言&#xff0c;在众多问题中&#xff0c;属本地生活服务项…

探索SpringBoot:学科竞赛管理项目开发

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…

基于SpringBoot+Vue的高校实习管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

将Mixamo的模型和动画导入UE5

首先进入Mixamo的官网 , 点击 Character 选择一个模型 (当然你也可以自己上传模型/绑定动画) 然后点击下载 , 这个作为带骨骼的模型 选择FBX格式 , T Pose 直接下载 点击 Animations 选择动画 , 搜索 idle 默认站立动画 点击下载 , 格式选择 FBX , 不带模型只要骨骼 , 帧数选6…

Windows Defender 强力删除工具 Defender Remover 下载

DefenderRemover.exe官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供DefenderRemover.exe最新版正式版官方版绿色版下载,DefenderRemover.exe安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123865.com/s/ajCgTd-79HEDefenderRemo…

[ComfyUI]Flux:超美3D微观山水禅意,经典中文元素AI重现,佛陀楼阁山水画卷

在数字艺术和创意领域&#xff0c;[ComfyUI]Flux以其独特的虚实结合技术&#xff0c;已经成为艺术家和设计师们手中的利器。今天&#xff0c;我们激动地宣布&#xff0c;[ComfyUI]Flux带来了一款超美的3D微观山水禅意作品&#xff0c;经典中文元素通过AI技术重现&#xff0c;包…

项目学习笔记

Downloads – Oracle VirtualBoxhttps://www.virtualbox.org/wiki/Downloads

2. 将GitHub上的开源项目导入(clone)到(Linux)服务器上——深度学习·科研实践·从0到1

目录 1. 在github上搜项目 (以OpenOcc为例&#xff09; 2. 转移到码云Gitee上 3. 进入Linux服务器终端 (jupyter lab) 4. 常用Linux命令 5. 进入对应文件夹中导入项目(代码) 注意&#xff1a;系统盘和数据盘 1. 在github上搜项目 (以OpenOcc为例&#xff09; 把链接复制下…

Python 读取与处理出入库 Excel 数据实战案例(HTML 网页展示)

有如下数据&#xff0c;需要对数据合并处理&#xff0c;输出到数据库。 数据样例&#xff1a;&#x1f447; excel内容&#xff1a; 出入库统计表河北库.xlsx: 出入库统计表天津库.xlsx: 01实现过程 1、创建test.py文件&#xff0c;然后将下面代码复制到里面&#xff0c;最后…

麒麟桌面系统安装和配置Node.js

1.官网下载tar.xz文件 Node.js — 在任何地方运行 JavaScript 2.解压 可以双击直接窗口解压&#xff0c;也可以使用如下命令进行解压&#xff1a; xz -d xxx.tar.xz&#xff1b; tar -xvf xxx.tar 可以解压到usr目录或者其他目录。 3. 配置环境 解压完毕后&#xff0c…

MAC的几个常见的快捷方式

1.mac 查看图片好的方式 默认查看图片的方式无法直接切换上一张下一张 解决方法&#xff1a; 1.&#xff08;最好的方法&#xff09;选中图片直接按空格&#xff0c;进入快速预览图片 2.就是全部选中然后打开&#xff0c;但是说实话有点奇怪&#xff0c;而且很占内存 3.直接显示…