语义分割实践数据集制作—以Sentinel-2 MSI数据为例

文章介绍了如何下载和处理Sentinel-2MSI多光谱遥感数据,包括使用GDAL和Opencv转换为8bitRGB图像,并应用1%线性拉伸增强。此外,还讲述了如何使用labelme软件进行语义分割数据的标注,以及转换标注文件格式,确保目标为白色,背景为黑色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Sentinel-2 MSI多光谱遥感数据下载

        (一)登录Copernicus Open Access Hub网页[2];

        (二)选择研究区域并设定云覆盖百分比和卫星平台等参数(依据自己的研究目的而定);

        (三) 利用GDAL与Opencv库将遥感数据转换为普通RGB三通道影像

        我们知道Sentinel-2 MSI数据是多光谱数据,其包含10米、20米和60米空间分辨率且16bit辐射分辨率数据[3]。对于深度学习而言,个人实验受限于计算机的算力和内存并且大多数深度学习数据集为8bit辐射分辨率,因此,我需要将10米分辨率的红绿蓝三波段转换为8bit数据(即DN∈[0,255])输出。

DNnew = INT(\frac{DNold-DNmin}{DNmax-DNmin}*255)

其中,若需要使得DNnew显得更为合理,可引入四舍五入法归纳正整数。

        在实验中,仅按上述公式转换并不能保证色彩尽可能地与原图一致(色彩为暗色调)。为了使得图像对比度明显且尽可能与原图具有较为一致的色彩,所以采用1%线性拉伸对转换后的数据进行图像增强。

        此处的1%线性拉伸,即将图像小于1%分位的像素值全部赋值为0,将图像大于99%分位的像素值全部赋值为255,其余的像素值线性拉伸(百分位概念及计算方法详见[5]):

DNenhance = 0 DN < DN1%

DNenhance = INT(\frac{DNnew-DN1%}{DN99%-DN1%}*255) DN1%<DNnew<DN99%

DNenhance = 255 DN>DN99%

         

          图一 无拉伸原图                 图二 1%线性拉伸结果                图三 训练数据对比(步骤四修正)

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

# 利用GDAL库读入Sentinel-2 MSI 实验数据
# 解压后10米分辨率影像文件夹地址(批量处理的话,可以设置文件夹操作即可)
path = r"G:\产学研数据备份\S2A\S2A_MSIL2A_20230107T031121_N0509_R075_T49RGQ_20230107T064700.SAFE\GRANULE\L2A_T49RGQ_A039397_20230107T031415\IMG_DATA\R10m"
Rpath = os.path.join(path,"T49RGQ_20230107T031121_B04_10m.jp2")
Gpath = os.path.join(path,"T49RGQ_20230107T031121_B03_10m.jp2")
Bpath = os.path.join(path,"T49RGQ_20230107T031121_B02_10m.jp2")
PathList = [Bpath,Gpath,Rpath]
# 读取文件数据并深度复制保存
gdal.AllRegister()
B = gdal.Open(Bpath)
# 获取影像高宽
height = B.RasterYSize
width = B.RasterXSize
del B
# 正式处理RGB数据
BGR = []
for p in PathList:
    data = gdal.Open(p)
    # GetRasterBand()函数是从1开始计数
    DNdata = data.GetRasterBand(1).ReadAsArray(0,0,width,height)
    # 深度复制数据
    copy = DNdata.copy()
    # 此处直接采用了Numpy的broadcast特性
    copy = 255*((copy-np.min(copy))/(np.max(copy)-np.min(copy)))
    # 对数据进行1%拉伸增强
    minborder = np.percentile(copy,1)
    maxborder = np.percentile(copy,99)
    copy = 255 * ((copy-minborder)/(maxborder-minborder))
    copy[copy < 0] = 0
    copy[copy > 255] = 255
    # 转换COPY格式为uint8
    copy = np.uint8(copy)
    BGR.append(copy)
    del data
BGRoutput = cv2.merge(BGR)
# 将文件写为png格式输出(该函数要求BGR输出)--图片位于同级文件
cv2.imwrite("data1.png",BGRoutput)

        (四)针对研究区对数据进行裁剪

        根据研究区与训练目标选择图像裁剪,裁剪图像大小始终保证256×256pixels。此时,对训练目标的多方式几何裁剪,我认为也是一种图像正则化方式。

        基于ENVI软件利用subset by roi操作保存文件(save as)为TIFF格式并保证训练样本大小为256×256pixels。

        补充:Sentinel-2批量转换生成RGB格式图片的便捷方式详见参考资料[4]。

二、labelme软件的下载安装

        labelme是基于python、Qt编写的具有图形交互界面的图形图像注释工具,其需要由命令行启动。在labelme软件的下载中,我们可能会遇到由网络引起的下载失败问题,此类问题通常可以通过添加镜像或者直接反复下载解决。

具体下载方法如下

# 第一步:打开下载好的Anaconda Navigator(anaconda3)软件
# 第二步:打开CMD.exe Prompt
# 第三步:创建Python虚拟环境
conda create --name=labelme python=3.6
# 第四步:激活labelme虚拟环境
conda activate labelme
# 第五步:下载labelme软件(任选一种适合自己并能成功下载的方式)
(可选)pip install labelme
(可选)pip install labelme --trusted-host http://mirrors.aliyun.com/pypi/simple
(可选)pip install labelme --trusted-host https://pypi.mirrors.ustc.edu.cn/simple
(可选)pip install labelme --trusted-host http://pypi.tuna.tsinghua.edu.cn/simple
# 下载成功

三、labelme语义分割数据标注方法

(一)打开labelme软件

# 第一步:打开anaconda3
# 第二步:打开CMD.exe Prompt
第三步:activate labelme
第四步:labelme

(二)载入样本图片

        File -> Open -> 选择样本图片->open;

(三) 勾选训练目标并保存标注文件

        Create Polygons -> 定义目标标签与类别号->Save(保存类别文件);

 (四)关闭GUI后,在命令行运用labelme_draw_json 查看分割文件

(五)利用labelme_json_to_dataset命令形成样本文件(忽略命令行后的提示)      

(六)(统一数据集格式)使得语义分割标注数据的目标为白色,背景为黑色

        命令行转换后的数据为R波段为0/128标识,B\G波段为0的RGB图像,而为了匹配基础数据集,此处需要将128全部替换为255并且输出单幅灰度图像。

                                                                  

                                       图四 转换前                                                      图五 转换后

# 此处可直接构建文件夹进行批量化转换
# opencv识别路径不带中文
path = r"G:\ChanXueYanRemark\label.png"
# 以灰度图像读取
img = cv2.imread(path)
B,G,R = cv2.split(img)
R[R == 128] = 255
cv2.imwrite("label4.png",R)

(七)标签制作数据展示

        os.listdir()所读取到的文件名是乱序的,可选择处理文件名调用list.sort()函数可以对文件按顺序排序或利用字符串解析方法提取相对应文件。

 

参考资料:

[1]深度学习图像标签标注软件labelme超详细教程 - 知乎

[2]https://scihub.copernicus.eu/dhus/#/home

[3]https://jcb-excellent.blog.csdn.net/article/details/125992493

[4]Sentinel 2 批量zip生成RGB图:s22rgb - 知乎

[5]百分位(percentile)是什么概念?怎么理解第95个百分位(95th percentile)_你的瓦刀的博客-CSDN博客_百分位

[6]labelme/examples/tutorial at main · wkentaro/labelme · GitHub

### 遥感语义分割数据集的选择与下载 对于分辨率约为2米的遥感语义分割数据集,可以考虑以下几个选项: #### GID 数据集 GID 是基于中国 Gaofen-2 卫星数据构建的一个大规模高分辨率遥感图像土地覆盖数据集[^2]。虽然其具体分辨率未明确提及为2米,但 Gaofen-2 的空间分辨率达到亚米级别(约1米),因此可能满足需求。 - **特点**: 包含两种子集——GID-5 和 GID-15。前者适用于粗粒度的土地覆盖分类,后者则针对更细粒度的地物类别。 - **获取方式**: 可访问相关研究机构网站或联系作者团队申请数据。 #### 谷歌 Earth 提供的云数据集数据集中包含了来自全球范围内的 RGB 图像,具有不同的分辨率区间 (0.5 米至 15 米)[^3]。尽管并非所有样本都达到精确的2米标准,但仍有可能筛选出符合条件的部分。 - **特性描述**: - 土地覆盖类型多样,涵盖水体、植被等多种环境特征; - 总计拥有150幅独立影像资料,每张大小固定为1280×720像素; - 所有原始素材均为三通道彩色模式呈现,并附带对应的二值化掩码作为真值标签。 如果目标区域恰好位于所提供实范围内,则可以直接利用这些资源开展实验工作。 #### 其他潜在候选者 除了上述提到的内容之外,还有其他一些公开可用或者商业性质的产品也可能符合要求,比如 Sentinel-2 MSI 或 Landsat 系列卫星所记录下来的成果材料。Sentinel-2A/B 平台能够提供最高可达10米的空间精度产品,经过特定算法增强之后有望接近甚至超越预期阈值水平(即≤2m) 。不过需要注意的是,这类衍生品通常需要额外付费购买或许可授权才能合法使用。 --- 以下是几个值得探索的方向及相关链接建议列表: 1. 访问 [GID 官方主页](http://www.rs.whu.edu.cn/GID/) 获取更多详情以及正式版下载地址; 2. 利用 Google Earth Engine API 自动提取感兴趣区域内匹配条件的历史存档照片 ; 3. 探讨国内外知名科研单位发布的类似专题数据库 , 如 USGS EROS Center, ESA Copernicus Hub etc.; 4. 如果预算允许的话还可以尝试订阅 Planet Labs Inc., Maxar Technologies Ltd.(原DigitalGlobe Corp.) 这样的私营企业所提供的定制服务方案. ```python import requests from bs4 import BeautifulSoup def fetch_dataset_links(url): response = requests.get(url) soup = BeautifulSoup(response.text,'html.parser') links = [] for link in soup.find_all('a'): href=link.get('href') if 'download' in str(href).lower(): links.append(href) return links # Example usage with a hypothetical dataset page URL example_url="https://example.com/datasets" print(fetch_dataset_links(example_url)) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

doll ~CJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值