EuroSAT — 一套 64×64 瓦片,逼着遥感模型承认地理泄漏

2.7 万张 Sentinel-2 瓦片,10 类地表覆盖,13 个波段,覆盖 34 国

来源 EuroSAT(DFKI / TU Kaiserslautern,Zenodo 分发) url: https://zenodo.org/records/7711810发布时间: 2026-10-29最后更新: 2026-10-29 阅读 9
EuroSAT — 一套 64×64 瓦片,逼着遥感模型承认地理泄漏

信息速览

数据集名称EuroSAT — 一套 64×64 瓦片,逼着遥感模型承认地理泄漏
数据类型27,000 张瓦片,10 类地表覆盖,13 个光谱波段,64×64 像素,34 国覆盖,EuroSAT_MS 2.1 GB,MIT 许可
规模不适用(卫星影像瓦片,无个体记录;地理单位为瓦片中心经纬度)
接入方式EuroSAT(DFKI / TU Kaiserslautern,Zenodo 分发) url: https://zenodo.org/records/7711810
AI 就绪度

EuroSAT 是遥感机器学习里最常被拿来「先跑通」的那一个数据集:文件小、类别干净、任务简单,一行代码就能下载。它的分量不在规模,而在一个持续十几年没被解决的问题——把同一片欧洲土地的相邻瓦片随机分进训练集和测试集,模型凭什么说自己认得出这片土地。

真正的麻烦藏在地理坐标里。给定经纬度,模型能背下整片区域的地表类型,用不着看图;而这一点在只给像素的评测协议里完全看不出来。EuroSAT 的瓦片全部带坐标,这让它成了少数「可以亲手做一次地理泄漏实验」的公开基准。

它的第二个身份是跨领域的迁移探针:计算机视觉里的域适应、少样本、零样本方法,几乎都拿它当「从照片到卫星影像」的第一个考场。一屏速览见下表。

项目 数值 来源
瓦片总数 27,000 Zenodo 记录 7711810
类别数 10 同上 / JSTARS 论文
光谱波段数 13(B01–B12 加 B8A) 同上
瓦片尺寸 64×64 像素 论文 §III-B
原始分辨率 10 m / 20 m / 60 m 混合 论文表 I
地理覆盖 欧洲 34 国 论文 §III-A
每类瓦片数 2,000–3,000 论文 §III-B
分发格式 JPEG(RGB)与 GeoTIFF(多光谱) Zenodo 文件说明
许可 MIT(星上数据另有 ESA 条款) Zenodo license 字段
主 DOI 10.5281/zenodo.7711810 Zenodo

§1 速览:它是什么,也不是什么

§1.1 一句话定义

EuroSAT 是一批从 Sentinel-2A 影像里裁出来、贴好地表覆盖标签、带地理坐标的 64×64 像素方块,被组织成一个十类图像分类任务。

它不是「一张欧洲地图」,也不是「按时间排列的影像序列」,更不是「多传感器融合数据集」。它是分类器的一道练习题,题目是把一小块景观看对,答案只有十个选项。

§1.2 为什么它不算「普通数据集」

先说清楚一件事:这篇稿件所在的中文数据集维基,长期以医学影像、组学、电子病历为主,遥感方向此前接近于零。站内与「卫星」二字沾边的只有哥伦比亚多模态公共卫生数据集,那是以城市街区为观察单元的地面数据,不是天基影像。所以在讲 EuroSAT 之前,需要先回答一个前置问题:遥感影像凭什么也算 AI-ready。

理由有三层,都能在这份数据里找到落点。

第一层是标签的稀缺性。Sentinel-2 星座每天产出约 1.6 TB 压缩影像(论文 §III-B 原文),而带人工确认地表类型标签的瓦片只有两万余张。卫星数据是供给过剩、标签是绝对瓶颈,这与医学影像的处境完全不同:医院里的 CT 不缺,缺的是读片结论。

第二层是同质性。同一景影像裁剪出的瓦片共享大气条件、光照角度、地表纹理,彼此之间高度相似。随机划分会把「几乎相同的图」同时放进训练和测试,于是准确率失去意义。

第三层是几何的先验性。每一张瓦片都带经纬度。模型一旦拿到坐标,就可以绕过图像直接回归标签——位置本身就是极强特征。医学影像里的「患者同源性泄漏」是同一类问题的另一个面孔,但遥感这边泄漏的强度更大,因为它可以从外部地图上直接查到。

所以这份数据虽然体量很小(多光谱版压缩包约 2.1 GB,解压后也不过几万个 64×64 的小文件),却是理解「数据泄漏如何随空间结构发生」的最好教具之一。它便宜、开放、可控,坏了可以重来。

§1.3 三十秒决策卡:你的处境,它能帮你什么

你的处境 它能帮你什么
想把一条 CV 流程从自然图像搬到卫星图,先看看会不会崩 十类、小尺寸、十万级以下的规模,一张消费级显卡十几分钟能跑完一轮
要写论文讨论「地理泄漏」,需要一个可复现的公开例子 瓦片带坐标,可以用经度切分与随机切分做出干净的对照
要评估零样本或跨域迁移方法 域间隙(地球照片到俯视卫星)明确,社区把它当作标准的第一站
想做多光谱入门,但懒得处理几 GB 的 Sentinel 原始产品 官方直接把 13 个波段裁成 64×64,省去了大气产品解析与云掩膜
要在医疗影像之外找一个「小而完整」的工程样例 下载、解压、加载、训练、评测五步都极短,适合写进内部教程
想研究欧洲某一年的地物变化 给不了,见下一节

§1.4 不适合谁

如果需求是时序变化检测,EuroSAT 给不了。官方记录中没有任何时间戳字段,瓦片取自不同日期,也不保证同一地区有多个时相。做变化检测要用 Sentinel-2 的原始 L2A 产品序列,或者 BigEarthNet、SSL4EO 这类按时相组织的数据。

如果需求是高分辨率地物识别,比如数清停车场里的车、分辨屋顶材质,也用它不上。10 米像素下,一辆车不到一个像素;64×64 的视野只有 640 米见方,勉强装下一个街区。高分辨率任务要去看 xView、DOTA 这类亚米级数据集。

如果需求是全球尺度或中国本土的地表覆盖,EuroSAT 覆盖的是欧洲 34 国,向其他区域迁移会有明显域偏移。国内的对应资源是 GlobeLand30 一类产品,用途不同。

如果需求是语义分割,它也不合适:标签是整张瓦片一个类别,没有像素级掩膜。这类任务去看 OpenEarthMap、LoveDA。

§2 数据构成:两万七千块方格的来源与配方

§2.1 全量规模

官方口径只有一句话,Zenodo 描述、GitHub 首页与 JSTARS 论文用词一致:13 个光谱波段、10 个类别、共两万七千张带标注且地理配准(geo-referenced)的影像。拆开来看:

维度 数值 出处在哪
瓦片总数 27,000 同上
类别数 10 同上
每类瓦片数 两千至三千 论文 §III-B
瓦片边长 64 像素 论文 §III-B
地面覆盖边长 约 640 米(按 10 米分辨率折算) 由 64×64 与 10 m 推算
光谱波段 13 论文表 I
覆盖国家 34(见图 5 的分布图) 论文 §III-A 与图 5
卫星 Sentinel-2A 论文 §III-A

值得留意的是「地理配准」这个词的分量。它不是说有一套单独的坐标表可供下载,而是说每个瓦片文件自身携带坐标参考信息;多光谱版是 GeoTIFF,坐标内嵌在文件头里。这一点会在 §4 与 §7 里反复出现,因为它同时是这份数据最大的价值来源和最容易被误用的入口。

§2.2 十个类别怎么来的

十个类别不是凭直觉划的,论文给出了两条筛选原则:一是在 10 米像素下肉眼可辨,二是在欧洲城市地图册(European Urban Atlas)中足够常见,能凑出上千张样本。两条都过不了的类别直接不入围。

十类分属四组:

  • 农业:AnnualCrop(一年生作物)、PermanentCrop(多年生作物,例如果园、葡萄园、橄榄林)、Pasture(牧场)
  • 建成区:Residential(居住区)、Industrial(工业区)、Highway(公路)
  • 自然与半自然:Forest(森林)、HerbaceousVegetation(草本植被)
  • 水体:River(河流)、SeaLake(海洋与湖泊)

这套划分比更早的 UC Merced 一类数据细了一档。论文自己强调的差别是:把「建成区」拆成了居住与工业两类,把「农业」拆成了三种耕作方式,类别数从 6 提到 10,代价是分辨率降了十倍。

§2.3 从原始影像到瓦片:一条五步流水线

数据集是怎么造出来的,论文 §III 写得相当清楚,可以原样复述成一条流水线。

第一步,取源。通过 Amazon S3 下载 Sentinel-2A 的影像,从中挑选覆盖 European Urban Atlas 所列城市的场景。这一选择决定了地理分布:城市地图册收录了哪些城市,EuroSAT 就跟着覆盖到哪些国家。

第二步,筛云。ESA 为每景影像提供场景级云量百分比,以此快速剔除云太重的景。注意这是场景级筛选,不是逐像元云掩膜,所以瓦片里仍可能残留薄云。

第三步,跨时相取样。论文明确写了「从全年记录的影像中提取」,目的是让同一类别内部包含不同季节的外观差异。这一条同时解释了为什么不能把它当时序数据集用:季节变了,日期也散了。

第四步,并行取样。按类别在不同国家、不同季节裁出 64×64 的方块,凑到每类两千至三千张。

第五步,人工核对。作者称对全部瓦片「人工检查了多次」,剔除错标样本,以及满是积雪或冰盖的样本。论文图 6 展示了被丢弃的典型样本:声称是工业区,实际只有云、死像元或雪。

第五步有一个容易被忽略的后果:被剔除的样本没有补回。所以各类的最终数量不整齐,落在 2,000 到 3,000 之间,而不是每类恰好 2,700。

§2.3b 一个取样决定,两种后果

流水线里最不起眼的一步是「每类取多少张」。这一步决定了整份数据的性格。

取少了,类内方差不够,模型学到的只是少数几个地点的外观,稍微换个城市就认不出;取多了,同一景影像会反复贡献瓦片,类内方差看似变大,实际上增加的都是几乎相同的副本。

论文选择的是中间路线:既要「覆盖尽可能多的国家以覆盖类内的高方差」,又要在每个国家、每个季节里都取一些。原文用的词是「尽可能高」,也就是说,这是一个被优化的目标,而不是一个被达成的状态。

这带来一个可以自行检验的性质:如果把每张瓦片反算到经纬度,再按城市聚类,会发现瓦片数量在不同城市之间高度不均匀。原因写在论文图 5 的说明里——分布由各城市在地图册中的数量决定。西欧城市多、收录密,自然贡献的瓦片就多。这一点在下文 §4.7 会作为空间偏倚重新出现。

对使用者而言,这条性质的实践含义是:不要把 EuroSAT 当作「欧洲地表覆盖」的无偏样本。它是一批按城市地图册加权抽样的瓦片,做国家层面的统计推断会把结论带偏。

§2.4 一张瓦片的逐项解剖

拿多光谱版里的一张 Forest/Forest_1234.tif 来拆。

层面 内容 使用者要注意什么
文件名 Forest_1234.tif 序号按类独立编号,Forest 的 1234 与 River 的 1234 毫无关系
目录名 Forest 目录即标签,没有单独的标签文件
尺寸 13 × 64 × 64 波段在前,与常见图像库的 HWC 约定相反
数据类型 UInt16 数值在反射率放大标度上,量级可达数千
波段顺序 B01 至 B12,末尾 B8A B8A 在最后,按名取值比按序取值安全
坐标 GeoTIFF 内嵌 CRS 与仿射变换 可直接反算瓦片中心经纬度
标签 无独立字段 只有目录名一个来源
时间 无 文件里没有任何采集日期

这张表里最有信息量的是最后两行:没有独立标签字段,也没有时间字段。前者意味着任何需要「逐样本元数据」的流程都得先自己生成一份清单;后者意味着一切与时序有关的问题都无解。

§2.4b 为什么是 64 像素

64 这个数字不是随手定的,它同时被三个约束夹住。

上界来自标签的可靠性。作者采用的判据是「在这张图上能不能看出这类地物」,瓦片越大,一张图里混进的地物类型就越多,单标签的假设越脆弱。640 米见方已经能装下一整条街区,再大就会出现「一半工业、一半居住」这种无法归类的图。

下界来自判别所需的最小上下文。10 米像素下,单棵果树不可见,但果园的行列结构可见;单栋房屋不可见,但屋顶群可见。要让这些结构显现,视野必须覆盖几十个像素。

第三个约束来自算力。2018 年前后的基准实验要在单卡上跑完数十次对照,瓦片边长翻倍意味着像素量翻四倍。64 是当时能兼顾三者的位置。

这层背景解释了一个容易被误解的现象:很多后来的方法在 EuroSAT 上早已接近饱和,却在大图上表现平平。原因不在模型变弱,而在 64×64 的视野本就不需要强模型——小视野削弱了模型容量与性能之间的联系,这也是评估这类基准成绩时要留一分清醒的理由。

§2.5 与同类资源的定位差异

资源 核心内容 与 EuroSAT 的差别
UC Merced 21 类、每类 100 张、256×256 分辨率更高,但类别少、样本少,出自航拍而非 Sentinel
AID 30 类、万张量级、600×600 类别更细、尺度更大,下载更重
BigEarthNet Sentinel-1/2 双传感器、多标签、按时间组织 有真实时间戳与多传感器,规模大两个数量级,但任务从单标签变成多标签
So2Sat Sentinel-1/2 配对、城市级 传感器配对是它的重点,EuroSAT 只有光学
RESISC45 45 类、单传感器 类别细但缺少地理坐标,做不了泄漏实验

判断规则可以压成一句:要小而快、要地理坐标、要泄漏实验 → EuroSAT;要多时相、要多传感器、要多标签 → BigEarthNet 一线;要高分辨率 → 另一族。

§3 定位层:坐标与版本,先选对再谈训练

这一章只解决两个问题:我拿到的到底是哪个版本,以及它凭什么可以被唯一地指认。这两件事没想清楚,后面的所有数字都没有意义。

§3.1 三个版本,一句话分清

初学者最容易在版本上翻车。EuroSAT 的家族里实际存在三个不同粒度的东西,名字接近,内容差很远。

名称 是什么 规模 在哪
EuroSAT 原始版(RGB) R/G/B 三波段 JPEG 同样的两万七千张,压缩包约 94.7 MB Zenodo 记录内的 EuroSAT_RGB.zip
EuroSAT 原始版(多光谱) 13 波段 GeoTIFF 同一批瓦片,压缩包约 2.1 GB Zenodo 记录内的 EuroSAT_MS.zip
EuroSAT 衍生版 各类仓库重新打包的分区与格式 与上同源 TorchGeo、timm、Hugging Face 镜像

第一个与第二个不是两批数据,而是同一批瓦片的两种编码。多光谱版保留了原始波段与原始数值标度,RGB 版把它压成三通道 8 位 JPEG。两者的一一对应并不严格保证:JPEG 是有损压缩,重采样也有所不同,所以严格的多模态实验不要拿两版混拼。

第三个是一个容易误解的概念。TorchGeo 提供的 EuroSATallBands.zip 是从上游转存并重新组织过的包,附带划分文本文件;它内容对应多光谱版,但目录层级加了一层 ds/images/remote_sensing/otherDatasets/sentinel_2/tif。很多教程里写的 base_dir 就是这一层。

§3.2 「Geo-referenced 版」其实是唯一的版本

预设里把「原始版」与「Geo-referenced 版」并列成两个版本,这在官方口径里站不住。Zenodo 描述、GitHub 首页、论文摘要三处都把整套数据称为「labeled and geo-referenced images」,没有另设一个不带坐标的版本。

准确的分法是:所有瓦片都带坐标,差别只在坐标怎么存。多光谱版以 GeoTIFF 内嵌的方式携带;RGB 版由 JPEG 承载,坐标信息在转换时可能丢失,具体保留与否取决于你是从哪条路径拿到的文件。

所以在实践里,「Geo-referenced 版」这个说法最好理解为一种能力而不是一个发行物:你手上这批瓦片能不能反算经纬度,取决于格式与来源,而不取决于版本名。

§3.3 名字、序号与唯一指认

一份数据能不能被唯一指认,是复现的起点。EuroSAT 的唯一键是「目录名 + 文件名」,也就是说类别与类内序号共同构成主键。

这套主键有一个陷阱:序号在不同类之间重叠。Forest_0000 与 SeaLake_0000 都存在,前者是森林,后者是海。任何按文件名前缀做去重、或按序号做连接的脚本,都会把两个完全无关的地点混在一起。

第二个陷阱与排序有关。文件系统按字典序返回时,Forest_10.tif 会排在 Forest_2.tif 之前,导致同一批实验换个环境跑出不同顺序。要稳定,必须显式按数值排序。

§3.4 版本与时间的错位

Zenodo 记录的 publication_date 是 2018-07-22,对应当年 IGARSS 会议上首次公开;记录本身的创建时间是 2023-03-09,最后修订 2023-03-10,revision 为 2。也就是说,2018 的日期是「首次发布日」,文件是 2023 年重新上传的。

这个错位在引用时会咬人:按 2018 引用,会被问为什么 Zenodo 上没有 2018 年的文件;按 2023 引用,又与论文年份对不上。稳妥的写法是同时给出两个时间点,并把「首次发布」与「记录修订」分开表述。

§4 质量层:标签可信度与地理泄漏

这一章是整篇的重心。EuroSAT 的规模小到不需要讨论,它真正需要讨论的是:标签有多信得过,以及一个有坐标、无时间的分类集合会以什么方式骗过评测。

§4.1 标签是怎么保证的

作者的做法是人工多轮全量核对,而不是抽样检查。核对目标有两类:错标(说好是工业区,其实没有工业建筑)与无效样本(被雪、冰或云完全覆盖)。论文图 6 用四个例子说明了剔除标准,其中包括「因云层、错标、死像元或冰雪导致看不见目标建筑」的工业区样本。

这套流程的可信度来源于三点:全量而非抽样、多轮而非一轮、判据写进了论文可以复核。它的局限同样清楚:判据是「在这张图上能看出这类地物」,而不是「这块地的真实用途是什么」。一张看起来像牧场的草地,可能是休耕的农田;一张看起来像居住区的屋顶群,可能在城市地图册里被标成混合用地。

标签反映的是视觉可辨性,不是土地登记用途。 这一条差异在做细粒度农业分析时尤其要紧。

§4.2 地理泄漏:这份数据最值得讲的一件事

先给结论:EuroSAT 上最常见的评测错误,是把同一地区的瓦片随机分进训练与测试,然后报出一个虚高的准确率。

机制不复杂。瓦片是从有限数量的城市景观里裁出来的,同一景影像能出上百张瓦片;相邻瓦片只差几十米,纹理、光照、大气几乎一样;同一城市的地物类型又高度一致。随机划分时,测试集里的瓦片往往能在训练集中找到「隔壁邻居」。分类器于是退化成最近邻检索,而不是学习地物语义。

这条问题的公开证据来自一篇讨论表示学习的论文。Neumann 等人在 2019 年把五个遥感数据集标准化后做统一评测,并指出此类基准普遍存在「同一场景的不同裁剪跨集合分布」的问题,为此给出了一套按区域切分的方案。TorchGeo 后来把这个划分直接内置,取了 EuroSAT 与 EuroSAT-Spatial 两个类,后者「按经度划分训练、验证与测试,比例 60%/20%/20%」(TorchGeo 源码文档)。这两个类的存在本身就说明:随机划分与空间划分会给出不同结论,而社区认为值得分别保留。

需要强调的是,这里的判断有边界。以上是机制说明与设计取向,不是对某个具体数字的核定:官方原始发布没有给出任何划分文件,论文里的 80/20 是一次实验设定,不是数据的一部分。所以「官方划分」这个说法在 EuroSAT 上并不成立,任何引用划分的方案都要写清楚取自哪篇论文。

§4.3 位置特征与图像特征的张力

坐标既是泄漏源,也是一种合法特征。做地理空间分析的人,确实会用位置信息辅助分类;做通用视觉模型的人,则要求模型在看不到坐标时也能分类。

这两种需求冲突,而 EuroSAT 同时满足两边:文件里坐标就在。于是同一份数据可以被配置成两个难度很不同的任务:

  • 纯图像任务:加载时丢弃地理变换,只保留像素与标签
  • 带位置任务:把中心经纬度作为额外输入,或用来构造空间划分

论文并未规定哪一种才是「标准用法」。这带来一个现实后果:不同论文的 EuroSAT 准确率数字,往往在任务定义上就不可比。

§4.4 大气校正缺失与色偏

论文有一句相当坦率的说明:数据集没有做大气校正,因此部分瓦片会出现色偏,极端情况在图 7 中展示;而作者有意不剔除这类样本,理由是希望分类器也学会处理这些情况。

这句话是一个重要的设计意图声明。它意味着:数据里存在一批视觉上明显偏色、与同类别其他样本外观差异很大的图。对训练而言,这是免费的数据增强;对评测而言,这是一部分困难样本,会拉低上限;对使用者而言,这意味着看到一张诡异色调的图不要以为是数据坏了。

副作用是归一化策略变得敏感。因为未校正,不同日期、不同景的亮度分布差异很大,用全数据集统计量做标准化比按类别统计更稳妥。

§4.5 分辨率混合:13 个波段不是同一把尺子

Sentinel-2 的 13 个波段分三档空间分辨率,这是原生产品的性质,不是 EuroSAT 的处理结果。

波段 名称 原生分辨率 中心波长
B01 Aerosols(气溶胶) 60 m 443 nm
B02 Blue 10 m 490 nm
B03 Green 10 m 560 nm
B04 Red 10 m 665 nm
B05 Red edge 1 20 m 705 nm
B06 Red edge 2 20 m 740 nm
B07 Red edge 3 20 m 783 nm
B08 NIR 10 m 842 nm
B8A Red edge 4 20 m 865 nm
B09 Water vapour 60 m 945 nm
B10 Cirrus 60 m 1375 nm
B11 SWIR 1 20 m 1610 nm
B12 SWIR 2 20 m 2190 nm

于是 64×64 的瓦片实际上是不同波段各取各的尺度之后,重采样到同一个像素网格。论文在波段评测里说明了做法:低分辨率波段「用三次样条插值上采样到 10 米」。也就是说,多光谱瓦片里的 B01、B09、B10 是被插值放大的,信息量并不比原来多。

这一点在建模上要当心:从 B10(60 米)裁出来的 64×64 实际上覆盖了 3.84 公里见方,与 B02 的实际视野差六倍。虽然文件里都是 64×64,但「一个像素代表多少地」并不相同。

§4.6 十个类别的规模与难度排序

官方只给了「每类两千至三千」这个区间,且被剔除的样本没有补齐,所以精确的每类数量要自己清点目录才拿得到。有一项性质却是可以事先推定的:把十个类别按「需要看什么才分得开」排序,会发现它们并不在同一个难度层上。只看色彩均值,水体与植被立刻分开;只看纹理,森林与农田立刻分开;而农业三兄弟(一年生作物、多年生作物、牧场)需要同时看纹理规律、垄向与管理痕迹,三者缺一都容易串味。

这两组混淆都有直观解释。农业类别的差异往往体现在作物结构、垄向、色彩细微变化上,10 米像素下几乎看不出来;公路与河流在灰阶上都是窄长的暗色带,尤其当水面有泥沙、路面有阴影时。还有一层更深的原因:这些差异不体现在单个像素上,而体现在几十个像素的组织方式上。卷积核如果感受野太小,看到的只是一片绿或一片灰,类别之间的差别被平均掉了。这也解释了为什么在同类基准上,加深网络往往比换损失函数更有效。

易混对 为什么 建模时的缓解
AnnualCrop 与 PermanentCrop 同为深色网格状农田,季节差异大 引入时序或多时相辅助特征(本数据不支持,需换数据集)
HerbaceousVegetation 与 Pasture 都是草本覆盖,仅管理强度不同 依赖纹理与颜色统计,避免只看均值
Highway 与 River 都是窄长暗带 需要方向与连续性特征,卷积核做大
Residential 与 Industrial 都是屋顶群,密度与布局不同 关注尺度与排列规则,而非材质

§4.7 三类已知偏倚

偏倚类型 描述 严重程度 缓解
空间偏倚 城市地图册覆盖的城市密集于西欧,东欧与北欧样本较少 高 分析时按国家或经度分层,报告分组准确率
季节偏倚 同一类别包含全年各季外观,但各类的季节构成未必均衡 中 不要假定类别间季节性相同,农业类尤其不可
类别边界偏倚 标签是视觉主导的,不是土地登记用途 中 用于下游决策时明确「视觉类 ≠ 功能类」

§5 工具层:怎么拿到、怎么拆、怎么验

前面两章讲的是数据本身的性质,这一章讲手上的动作。目标是让一个从没碰过遥感的人,能在一个下午之内跑通一次训练,并且知道自己跑的是什么。

§5.1 三条获取路径,推荐顺序明确

路径 适合谁 体积 注意
Zenodo 官方记录 要原始文件、要可引用 DOI 多光谱约 2.1 GB / RGB 约 94.7 MB 推荐。记录式下载带 md5 校验值
GitHub 仓库 要读论文与 FAQ 不直接托管数据 页面上指向 Zenodo,旧主机已标注为废弃
TorchGeo 或 torchvision 封装 要一行下载、要现成划分 由框架转存 方便但多一层间接,引用仍须回到 Zenodo

作者原先放在 DFKI 的直链已被标注为 Deprecated,仓库里明确要求改用 Zenodo。所以任何仍指向 madm.dfki.de 的旧脚本,都可能在某次重定向后就下载不到。

§5.2 校验与解压

下载之后第一步是校验,Zenodo 记录的 API 里直接给出了两个文件的 md5 值。

#-- 从 Zenodo 取文件元数据(含 md5 与字节数),再逐个校验下载结果
curl -s "https://zenodo.org/api/records/7711810/files" \
  | python3 -c "import json,sys; [print(e['key'], e['size'], e['checksum']) for e in json.load(sys.stdin)['entries']]"

wget -q https://zenodo.org/records/7711810/files/EuroSAT_MS.zip
md5sum EuroSAT_MS.zip
#-- 期望:091174add3c8e680a49244acf185b9f0

这两行代码的意义不只是校验。entries 数组里的 size 是字节数,可以用来判断本地文件是否被截断;checksum 是官方给出的唯一正确值。文件损坏是这类转存包最常见的事故,而在训练跑出诡异结果之后才回头查,代价很大。

§5.3 目录结构与解压后的样子

EuroSAT_MS/                     # 解压 EuroSAT_MS.zip 之后
└── 2750/
    ├── AnnualCrop/
    │   ├── AnnualCrop_1.tif
    │   ├── AnnualCrop_2.tif
    │   └── ...
    ├── Forest/
    ├── HerbaceousVegetation/
    ├── Highway/
    ├── Industrial/
    ├── Pasture/
    ├── PermanentCrop/
    ├── Residential/
    ├── River/
    └── SeaLake/

外层那个 2750 是打包时遗留的父目录名。很多教程在这层上翻车:直接把 EuroSAT_MS 当根目录,结果找不到类别子目录。稳妥的做法是解压后先 find 一下类别目录的实际深度。

§5.4 用 TorchGeo 一次加载

TorchGeo 把下载、解压、校验、划分都封好了,适合快速起跑。

#-- 期望 data/ 已存在或可写;首次运行会下载约 2.1 GB 的多光谱包
from torchgeo.datasets import EuroSAT

ds = EuroSAT(root="data", split="train", download=True, checksum=True)
print(len(ds), ds.classes, len(ds.bands))
x, y = ds[0]
print(x.shape, x.dtype, y)
#-- 期望:x 为 torch.Size([13, 64, 64]),dtype 为 float32,y 为 0-9 的整数
#-- 期望:len(ds) 远小于 27000,因为这是按公开划分切出来的 train 子集

bands 参数是关键开关。默认加载全部 13 个波段,传 bands=("B04","B03","B02") 就退回三通道,可以立刻做 RGB 与多光谱的对照实验,而不用另下一份数据。

§5.5 不用框架,自己读 GeoTIFF

要控制细节,或者要做坐标相关的实验,就要自己处理 GeoTIFF。

#-- 依赖:rasterio(pip install rasterio)
import glob
import rasterio
import numpy as np

paths = sorted(glob.glob("EuroSAT_MS/2750/Forest/*.tif"))
with rasterio.open(paths[0]) as src:
    arr = src.read()                      # 形状 (13, 64, 64),UInt16
    bands = [src.descriptions[i] or str(i + 1) for i in range(src.count)]
    centroid = src.xy(32, 32, offset="center")   # 瓦片中心像素的坐标
    lon, lat = src.transform * (32, 32)          # 该点在瓦片 CRS 下的坐标
    crs = src.crs
print(arr.shape, arr.dtype, bands[:3])
print("中心点坐标", lon, lat, "CRS", crs)
#-- 期望:arr.dtype 为 uint16;arr.max() 远大于 255

这里有三处值得停下来看。第一,read() 返回的是波段在前的三维数组,与 PIL 的 HWC 相反。第二,dtype 是 UInt16,直接除以 255 会得到一张近乎全黑的图,正确的做法是除以一个较大的常数(TorchGeo 的展示代码用的是 3000)。第三,src.crs 通常是 UTM 分区,不是经纬度,要换成经纬度还需要投影变换。

§5.6 RGB 版与多光谱版的一致性检查

如果两个版本都要用,先做一次一致性抽检,确认对齐。

#-- 抽查同一文件名在两版中的视觉一致性,作为跨版本实验的前置检查
import numpy as np
from PIL import Image
import rasterio

name = "Forest/Forest_1"
rgb = np.asarray(Image.open(f"EuroSAT_RGB/2750/{name}.jpg")).astype("float32")
with rasterio.open(f"EuroSAT_MS/2750/{name}.tif") as src:
    ms = src.read([4, 3, 2]).astype("float32")   # B04, B03, B02
ms = np.clip(ms / 2750.0, 0, 1) * 255
mae = float(np.abs(ms.mean(0) - rgb.mean(2)).mean())
print("RGB 与 MS 三波段平均绝对差", round(mae, 2))
#-- 期望:MAE 落在几十的量级;若接近 255,多半是波段顺序或标度取错了

这个检查不是为了证明两版相等——它们本来也不相等,一版经过 JPEG 有损压缩,另一版做了插值上采样。检查的价值在于排掉「波段取错」和「标度取错」这两类硬错误。

§5.7 从坐标构造空间划分

想亲手复现地理泄漏的对照,最直接的做法是自己按经度切一刀。

#-- 从每个瓦片中心反算经度,按经度把数据切成西/中/东三块
import glob
import rasterio

rows = []
for lib in ("Forest", "River", "SeaLake"):
    for p in sorted(glob.glob(f"EuroSAT_MS/2750/{lib}/*.tif"))[:200]:
        with rasterio.open(p) as src:
            x, y = src.transform * (32, 32)
            lon, lat = src.crs.transform_to_4326(x, y) if hasattr(src.crs, "transform_to_4326") else (x, y)
        rows.append((p, lon))
rows.sort(key=lambda r: r[1])
n = len(rows)
print("最西经度", round(rows[0][1], 2), "最东经度", round(rows[-1][1], 2))
print("三分位切点", round(rows[n // 3][1], 2), round(2 * n // 3 and rows[2 * n // 3][1], 2))

这里只给出了骨架:transform_to_4326 并非 rasterio 的标准方法,实际换算要用 pyproj 的 Transformer。写成骨架而不是完整脚本,是因为不同瓦片的 CRS 并不相同,直接用 UTM 的东坐标比较经度是错的。

§5.8 归一化与波段选择的最小实践

#-- 按波段统计均值与标准差,用全数据集统计量做标准化(避免逐图归一化丢失相对亮度)
import glob
import numpy as np
import rasterio

paths = glob.glob("EuroSAT_MS/2750/*/*.tif")[:1000]
stack = []
for p in paths:
    with rasterio.open(p) as src:
        stack.append(src.read().astype("float32"))
stack = np.stack(stack)                     # (N, 13, 64, 64)
mean = stack.mean(axis=(0, 2, 3))
std = stack.std(axis=(0, 2, 3)) + 1e-6
print("波段均值", np.round(mean, 1))
print("波段标准差", np.round(std, 1))
#-- 期望:B10(卷云)均值很低,几乎所有像素接近同一值,方差极小

这段代码有一个可观察的结论:B10 的方差通常最小的几个之一。原因是卷云通道在晴空影像上几乎没有信号。把它保留在输入里,等于给模型一个几乎不变化的通道;删掉它通常无损,甚至更快。

§5.9 一次十行的泄漏对照实验

如果只做一件事来理解这份数据,就做这个。固定模型、固定超参数,只换划分方式,看两个准确率差多少。

#-- 同一批数据,两种切法:随机切分 vs 按经度切分;其余全部不变
import random
import numpy as np

def split_random(items, ratio=0.8, seed=0):
    idx = list(range(len(items)))
    random.Random(seed).shuffle(idx)
    k = int(len(idx) * ratio)
    return [items[i] for i in idx[:k]], [items[i] for i in idx[k:]]

def split_by_lon(items, ratio=0.8):
    ordered = sorted(items, key=lambda r: r[1])   # r = (path, lon, label)
    k = int(len(ordered) * ratio)
    return ordered[:k], ordered[k:]

#-- 期望:空间划分的准确率明显低于随机划分;差距就是泄漏的量化形态

这段脚本本身不训练模型,它只提供两种划分。真正要看的是:把同一份代码分别在两种划分下跑一遍,得到的准确率相差多少个百分点。这个差值不是一个需要被「修正」的缺陷,而正是这份数据最有教学价值的地方——它让看不见的东西变得可测量。

社区之所以在 2019 年之后才有了「按区域划分」的正式协议,也是因为这个差值大到无法忽略。TorchGeo 把两种划分都保留成独立的类,等于是把「这个问题值得单独做实验」写进了工具链。

§6 层与层之间:它在本库中的位置

§6.1 库内现有的遥感家底

这套数据集所在的库,主体是医学方向。以卫星、遥感、地表覆盖为关键词做一次检索,命中的记录屈指可数,其中大多只是名字里带了相关字眼:3dteethland 里的 Land 是牙齿,fda-sentinel 里的 Sentinel 是药物安全监测系统,nki-rockland 的 Rockland 是地名。

真正的天基影像此前是空白。因此 EuroSAT 在这套编号体系里承担两个角色:一是遥感方向的第一块砖,二是「跨领域泄漏」这一概念的载体。

§6.2 与哥伦比亚多模态公共卫生数据集的分工

库内最容易被拿来比较的是哥伦比亚多模态公共卫生数据集(记录号 1716)。名字里都带 satellite,但两者不是一回事。

维度 EuroSAT 哥伦比亚多模态公共卫生数据集
观察对象 欧洲 34 国地表景观 哥伦比亚某城市的地面与社区状况
数据来源 天基 Sentinel-2 影像 地面摄像、气象与公共卫生记录
模态 13 波段光学影像 影像、气象、疾病报告
时间结构 无时间戳 三年 156 周
核心用途 分类基准与迁移评测 公共卫生与环境的关联分析
与医学 AI 的关系 间接(方法迁移) 直接(健康结局)

一句话分工:要看地怎么用、模型看不看得对 → EuroSAT;要看环境怎么变、与疾病有什么关系 → 哥伦比亚那份。

§6.3 与其他条目的邻接关系

  • 与 gbif(物种出现记录)相邻:一个是「这片地是什么」,一个是「这片地上有什么生物」。做生态建模时,两者常一起用,前者当地表协变量,后者当响应变量。
  • 与 world-bank-open-data 相邻:都是「地点 × 属性」的点阵,但一个是像素级观测,一个是国家级统计。把 EuroSAT 的单点分类聚合到国家级比例,理论上可以与非卫星统计做交叉验证,只是这种聚合没有官方支持。
  • 与 ucdp、aqs 相邻:都可以按坐标关联到村庄、监测站一级。时空粒度越细越难对齐,EuroSAT 没有时间字段这一点在这里是硬伤。
  • 与 geo、geom 相邻:这两者的名字容易与 geospatial 混淆,实际是基因表达与分子几何,与遥感无关。这里的并列只是提醒中文读者别被缩写骗了。

§6.4 检索路径建议

按用途找,不必按名称找:

  • 想做「从地面到天空」的域迁移 → EuroSAT 是最省事的起点
  • 想做多传感器融合 → 去 BigEarthNet、So2Sat
  • 想做变化检测 → 去用带时相的 Sentinel-2 L2A 产品
  • 想做全球地表覆盖 → 去看 GlobeLand30 一类产品

§7 质量评估与局限:它不该按什么标准评价

§7.0 阅读本节前需要知道的一件事

EuroSAT 是一个 10 类、2.7 万条、单标签 的小型分类基准。用「大数据集」的尺子去量它,会得出「太小了、没价值」的结论;用「数据集质量审计」的尺子去量它,会得出「没有时间字段、没有划分文件、没有元数据」的结论。两种结论都成立,但都没有回答它为什么被引用上万次。

它被引用的原因在于问题定义干净:单一传感器、单一任务、单一标签体系、来源公开、规模可控。在这个尺度上,一个想法能不能成立,一下午就能跑出答案。评估它应该用的尺子因此是:作为对照实验的载体,它够不够稳定、够不够透明。

下面按这个尺子逐项拆。

§7.1 评价框架错位:三种最常见的误判

常见错位 表现 应该怎么想
拿 ILSVRC 的规模期望套它 嫌它只有十类、两万余张 它的目标是对照,不是刷榜;小才有可复现性
拿标注数据集的元数据标准套它 抱怨没有逐瓦片元数据文件 文件名与目录已是全部标签;元数据的缺失是设计,不是疏忽
拿排行榜数字直接比高低 把不同论文的准确率放一张表里排名 任务定义不同(是否给坐标、用什么划分),数字不可直接比

§7.2 DAIMS 二十四项逐条对照

DAIMS(数据统计与元数据标准,Data Documentation Initiative 提出的数据质量评估框架)原本面向社会科学调查数据,这里借用它的二十四项检查点,把 EuroSAT 的成熟度摊开来看。

# 检查项 状态 说明
1 宽格式 ⚠️ 像素数据不是表格,无法直接宽表化;需要先抽样或降维
2 唯一标识 ✅ 目录名加文件名构成主键,跨类序号重叠需注意
3 特殊字符 ✅ 路径全为 ASCII,无空格与特殊符号
4 重复行 ⚠️ 官方未披露重复检测;相邻瓦片高度相似,近似重复无法排除
5 缺失编码 ⚠️ 没有显式缺失值编码;被剔除样本直接消失,不留标记
6 标签标识 ✅ 标签即目录名,十类固定且与论文一致
7 罕见类分组 ✅ 每类两千以上,无不平衡到需要合并的类别
8 偏倚评估 ⚠️ 空间偏倚与季节偏倚真实存在,官方无量化报告
9 数据字典 ⚠️ 波段表在论文中,无机器可读的数据字典
10 信息性缺失解释 ❌ 无字段级缺失说明;云、雪剔除过程不可追溯
11 设备记录 ✅ 传感器明确为 Sentinel-2A MSI,13 波段参数完整
12 共线性 ⚠️ 波段间高度相关(尤其红边各族),无官方共线性说明
13 编码映射 ✅ 十类与 European Urban Atlas 的映射在论文中有交代
14 时间戳处理 ❌ 无时间字段,一切时序分析在源头不可行
15 划分建议 ⚠️ 官方无划分;社区划分(含空间划分)由论文与框架提供
16 泄漏讨论 ⚠️ 官方未讨论地理泄漏;是该数据集最应补的一块
17 标签分布 ✅ 每类两千至三千,均衡度良好
18 测量偏倚 ⚠️ 未做大气校正且有意保留色偏,属于已知的设计性偏倚
19 外部验证建议 ⚠️ 无官方跨数据集验证协议,社区自行组合
20 版本记录 ✅ Zenodo 记录有 DOI 与 revision,文件带 md5
21 预处理脚本 ❌ 官方未发布生成与清洗脚本,流程只在论文中描述
22 合规要求 ✅ MIT 许可明确;上游 Sentinel 条款单独提示
23 多模态对齐 ⚠️ RGB 版与多光谱版同源但处理不同,无对齐清单
24 去标识化 ✅ 卫星影像不含个人信息;但低分辨率下仍可识别特定设施

DAIMS 评分:12.5 / 24。默认按 ✅ 计 1 分、⚠️ 计 0.5 分、❌ 计 0 分,十一个满项、七个半分项、三个零分项,合计 12.5。

评分解读:分数落在中段,与「小型、公开、透明但文档偏薄」的定位吻合。满项集中在标识、标签、许可、版本这些「一旦做好就不用再动」的维度;零分集中在时间、脚本、缺失说明这些「需要持续维护」的维度。这不是疏忽,而是发布者把资源投在了数据本身上。

对你意味着什么:不要指望从官方包里读出「这批数据怎么造的」。造法在论文里,而且是叙述性的,不是可执行的。要做可复现的清洗,只能自己重写一份,并把它当作本研究的一部分方法贡献。

§7.3 逐条局限

把上一节的零分项与半分项展开成具体的失灵场景。

局限 具体表现 后果
无时间字段 无法构造同一地点的前后对比 变化检测、时序建模、季节性校正全部不可行
无官方划分 每篇论文各用各的划分 准确率跨论文不可比,复现成本高
无逐瓦片云量 云剔除是场景级且事后无损检查 少量瓦片仍含薄云,影响模型对晴空样本的拟合
无生成脚本 从 Sentinel 原始产品到瓦片的流程不可执行 想扩样本必须自己重做一遍,且难对齐
坐标与像素分离 位置信息在 GeoJSON/GeoTIFF 侧,像素在另一路径 坐标相关实验需要额外拼接
欧洲限域 只有 34 国 迁移到其他大洲时域偏移显著,需重新校准
视觉标签 标签反映可辨性,不反映登记用途 用作政策或统计依据时口径不一致

§7.3b 这份数据该被追问什么、不该被追问什么

公平地说,用「为什么没有逐瓦片元数据」去问责 EuroSAT 是不合理的。它的定位在论文第一段就写明:提供一个公开、免费、可被机器学习社区使用的基准,用来对比不同的分类方法。基准的第一要务是可比,而不是完备。

真正该追问的是另外三件事,而且三件都指向「可比性」这一核心。

第一,十类的选择是否足以代表欧洲的地表。答案是明确的否:它省略了裸地、湿地、矿区、温室等在地图册中不那么常见的类型。这些省略不是错误,但它决定了基准上得到的准确率不能外推为「欧洲地表分类的整体水平」。

第二,季节构成是否在类别间均衡。论文只说取自全年,没有给出各类的月份分布。如果农业类的取样集中在生长季,而森林类分散全年,那么农业类别之间的可分性会被人为抬高。这一点官方没有披露,也没有人系统统计过。

第三,64 像素的视野是否足够表达类别定义。公路类的样本里,真正决定标签的是那条贯穿瓦片的路带;而瓦片里同时包含路边的植被与建筑。模型完全可能学会「有路带且两侧有绿色 = Highway」,这在样本内成立,在更大范围的照片上未必。

三件事共同说明一件事:这份数据的「基准性」是靠控制变量换来的,不是靠覆盖度换来的。 用对了,它是一把好尺子;用错了,它会把一个局部结论伪装成普遍结论。

§7.4 外部验证与泛化

EuroSAT 常被当作「源域」,去验证方法在其他哨兵影像数据集上的表现。以下是社区中可查的公开组合,具体数值因协议不同而有出入,此处只列用途。

组合 来源方向 典型任务 关键观察
EuroSAT → AID 欧洲 → 中国航拍 跨域分类 分辨率与传感器变化导致明显下降
EuroSAT → UC Merced 卫星 → 航拍 跨域分类 视角从正射俯视变化,纹理统计漂移
EuroSAT → BigEarthNet 单传感器 → 双传感器 多标签迁移 标签体系不同,需要重新映射
ImageNet → EuroSAT 自然图像 → 卫星 预训练迁移 域间隙大,是零样本研究常见设定

这些组合没有统一的官方协议,所以「提升几个点」的说法必须附上协议描述才成立。

§8 生态与版本:它为什么还能被用下去

§8.1 版本时间线

时间 事件 证据
2018-07 IGARSS 会议论文,首次公开数据集 Zenodo publication_date 与会议 DOI
2019-02 arXiv 上更新期刊版全文 arXiv 1709.00029v2
2019-07 JSTARS 正式刊出,卷 12 期 7 CrossRef 记录
2019-11 社区提出按区域划分的评测协议 arXiv 1911.06721
2023-03 Zenodo 记录重新上传为 revision 2 Zenodo API 时间戳
持续 TorchGeo 等框架内置加载器与划分 TorchGeo 源码

时间线里最值得注意的一格是 2019-11。这一年社区把「按区域划分」写成协议,直接改变了 EuroSAT 的正确打开方式。数据集本身没变,评测方式变了。

§8.2 它在生态中的位置

EuroSAT 处在一个很特别的位置:它是几乎所有遥感预训练与迁移学习论文的必备对照。原因不在它是最大的,而在它是最不会出错的。

论文里如果用了 BigEarthNet,审稿人会问预处理细节;用了自建数据,审稿人会问可复现性;用了 EuroSAT,通常一句话带过。这种「低摩擦」让它成了遥感领域的 MNIST——不因为最好的,而因为最稳的。

§8.3 谁在依赖它

  • 框架层:TorchGeo、torchvision 的扩展生态、timm 的数据配置,都内置了加载器
  • 评测层:GEO-Bench 把 EuroSAT 收成了多分类任务之一
  • 方法层:域适应、少样本、零样本、主动学习、模型压缩,几乎每个方向都会报一组 EuroSAT 数字
  • 教学层:遥感入门课与 CV 迁移课的标准例题

§8.4 它为什么能持续

一套 2018 年发布、总量两万余张、每张只有 64 像素见方的小数据,为什么没被淘汰?答案有三层。

第一层是它能被重新定义。数据集本身没变,但社区不断在它上面定义新任务:从分类到少样本,从零样本到模型种群,从泄漏研究到量子卷积。任务定义可以无限叠加,数据不用动。

第二层是它的成本低到可以随手用。2 GB 的多光谱包、一张显卡、几十分钟,这让它成为审稿周期的友好对象。任何新方法都需要一个快速的 sanity check,EuroSAT 就是那个 check。

第三层是它占据了意识形态上的好位置。它用开放数据(Copernicus)代替了封闭数据(商业卫星影像),用可复现的加工代替了黑箱。论文在 §III-B 中把这三点写成「三项创新」,其中就包括「不使用 Google Earth 这类非自由影像」。这种「开放」的立场让它在政策与教学场合都被反复引用。

三层叠加的结果是:没有人在认真地把 EuroSAT 当最终评测,但也没有人能跳过它。

§8.5 引用与许可

  • Zenodo 记录许可:MIT
  • 上游数据:Copernicus Sentinel Data Terms and Conditions(ESA)
  • 建议同时引用 IGARSS 2018 与 JSTARS 2019 两篇
  • 论文由 BMBF 项目 DeFuseNN 部分资助,并在 NVIDIA AI Lab 计划下获得支持(Zenodo notes)

这里的许可结构值得说清楚:MIT 覆盖的是作者加工后的瓦片与打包内容;星上原始影像来自 Copernicus,ESA 另有条款。发表成果时只写 MIT 是不完整的。

§9 使用指引:三条路径,一篇最小实现

§9.1 三种角色,三条路

你的角色 建议路径 关键动作
想验证一个 CV 想法能不能到遥感 RGB 版 + TorchGeo 默认划分 先跑通一次,再换多光谱
想研究地理泄漏或评测协议 多光谱版 + 自己按经度切分 固定模型,只换划分,比较差距
想做遥感方向的工程入门 多光谱版 + rasterio 手写 loader 从读文件到归一化全部手写一遍

§9.2 在 AI 流水线中的位置

EuroSAT 在一条典型的遥感 AI 流水线里,通常出现在验证环节而不是生产环节:

原始 Sentinel-2 产品(L1C / L2A)
        ↓ 裁切、重采样、人工标注   ← EuroSAT 就出生在这一步的输出
EuroSAT 瓦片(64×64,单标签)   ← 用它验证模型架构与训练策略
        ↓ 迁移到自有数据
目标区域的大图推理与解译

这条链说明了一个常见误用:直接把在 EuroSAT 上调好的模型部署到自己的十米级区域影像上,然后奇怪为什么精度掉了。64×64 的视野对大多实际应用来说太小,模型学到的上下文不适用。

§9.3 一份最小可跑的实现

下面这段代码不依赖任何遥感专用库,只用 PyTorch 与 PIL,用 RGB 版即可跑通。目的是让整条链路透明。

#-- 期望 EuroSAT_RGB/2750/<类别>/*.jpg 已解压就位
import glob
import os
import torch
from PIL import Image
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms

CLASSES = ["AnnualCrop", "Forest", "HerbaceousVegetation", "Highway", "Industrial",
           "Pasture", "PermanentCrop", "Residential", "River", "SeaLake"]

class EuroSATRGB(Dataset):
    def __init__(self, root, classes=CLASSES, tfm=None):
        self.items = []
        for i, c in enumerate(classes):
            for p in sorted(glob.glob(os.path.join(root, "2750", c, "*.jpg"))):
                self.items.append((p, i))
        self.tfm = tfm or transforms.Compose([
            transforms.Resize((64, 64)),
            transforms.ToTensor(),
            transforms.Normalize([0.3444, 0.3803, 0.4078],
                                 [0.2037, 0.1366, 0.1148]),
        ])

    def __len__(self):
        return len(self.items)

    def __getitem__(self, i):
        path, y = self.items[i]
        x = self.tfm(Image.open(path).convert("RGB"))
        return x, torch.tensor(y, dtype=torch.long)

ds = EuroSATRGB("EuroSAT_RGB")
loader = DataLoader(ds, batch_size=64, shuffle=False, num_workers=4)
print(len(ds), next(iter(loader))[0].shape)
#-- 期望:len(ds) 为 27000,批张量形状 (64, 3, 64, 64)

其中的均值与方差取自 EuroSAT RGB 的常用统计量,可以直接替换成自己在训练集上算出的值。shuffle=False 是刻意的:默认顺序按类别聚在一起,若要看损失曲线是否正常,需要一个打乱的小子集。

§9.4 评估时最少要报的三件事

要报的 为什么 怎么报
划分方式 随机划分与空间划分的差距可能很大 写明「随机」还是「按经度」,并给出划分来源
是否使用坐标 给了坐标等于多一个强特征 明确模型输入是否含位置信息
波段子集 RGB 与 13 波段的结果不可混谈 列出实际使用的波段名,而非「全波段」

§10 AI 使用声明

项目 内容
数据集性质 公开卫星影像分类基准,非医疗数据,非个人数据
建议用途 方法验证、迁移评测、教学示例、泄漏研究
不建议用途 作为地表覆盖业务产品、作为政策统计依据、直接部署到其他大洲
伦理注意 64 米级分辨率下仍可能识别特定设施,使用时避免与敏感位置关联
引用要求 同时引用 IGARSS 2018 与 JSTARS 2019,并注明 MIT 与 Sentinel 条款
版本锁定 引用 Zenodo 记录 7711810,避免使用无 DOI 的二次打包
页面状态 已发布,最后核对 2026-10-29

常见误读

常见说法 实际情况 证据
「EuroSAT 有十几万张图」 瓦片总数只有两万七千 Zenodo 描述、GitHub 首页、论文摘要三处一致
「它是 12 波段,没有 B10」 13 波段,B01 至 B12 加 B8A,B10 在内 论文表 I 与 TorchGeo 的 all_band_names
「用 CC BY 4.0 可以随便用」 Zenodo 记录与仓库均标 MIT;上游有 ESA 条款 Zenodo license 字段;GitHub License 段
「官方给了训练测试划分」 原始发布不含划分文件,80/20 是论文实验设定 记录内只有两个 zip,无划分文本
「下载地址是 GitHub」 数据在 Zenodo,GitHub 只给说明与指向 仓库 README 的 Dataset 段
「Geo-referenced 版是另一个版本」 全部瓦片都带坐标,差别在存储格式 「labeled and geo-referenced」是整体描述
「多光谱像素是 0-255」 多光谱为 UInt16 原始标度 TorchGeo 展示代码取除以 3000
「可以拿它做时序变化检测」 无时间戳字段,各瓦片日期不同且无重复时相 文件与记录均无时间字段
「随机划分就够了,大家都是这么做的」 相邻瓦片跨集合分布,准确率虚高 区域划分协议见 arXiv 1911.06721
「它和哥伦比亚卫星数据是一回事」 一个是天基影像,一个是城市地面对地观测 两者的模态与时间结构均不同

附录 A 版本对照

版本 波段 格式 体积 划分 适合
EuroSAT_RGB 3(B04/B03/B02) JPEG 约 94.7 MB 无 快速验证、跨域迁移
EuroSAT_MS 13 GeoTIFF 约 2.1 GB 无 多光谱研究、坐标实验
TorchGeo EuroSAT 13 可裁选 GeoTIFF 同上 随机划分 一行加载
TorchGeo EuroSAT-Spatial 13 可裁选 GeoTIFF 同上 按经度 60/20/20 泄漏对照实验

附录 B 波段与类别表

波段部分已列于 §4.5。类别部分如下,顺序与官方目录名一致。

序 目录名 中文 所属组 视觉特征
1 AnnualCrop 一年生作物 农业 规则条带、季节变色
2 Forest 森林 自然 深绿、高纹理密度
3 HerbaceousVegetation 草本植被 自然 浅绿或黄绿、纹理均匀
4 Highway 公路 建成 窄长暗带、常有分叉
5 Industrial 工业区 建成 大屋顶、白色或灰色
6 Pasture 牧场 农业 均匀草地、边界清晰
7 PermanentCrop 多年生作物 农业 果园行列、纹理规律
8 Residential 居住区 建成 密集小屋顶、道路网
9 River 河流 水体 弯曲暗带
10 SeaLake 海洋与湖泊 水体 大面积深色水面

附录 C 术语表

术语 含义
Sentinel-2 ESA Copernicus 计划的双星光学对地观测星座
MSI 多光谱成像仪,Sentinel-2 的主载荷
L1C / L2A Sentinel-2 产品级别,前者为大气顶层反射率,后者经过大气校正
瓦片(patch) 从大图裁出的小方块,本数据为 64×64
地表覆盖(land cover) 地表物理状态,如森林、水体
土地利用(land use) 人类对土地的功能安排,与覆盖相关但不等同
地理配准(geo-referencing) 为影像赋予坐标参考,使其可定位
CRS 坐标参考系统,本数据多为 UTM 分区
反射率 地表反射与入射辐照之比,本数据 UInt16 存储
重采样 把不同分辨率的波段统一到同一网格
卷云通道 B10,用于探测高空薄云的 60 米波段
空间划分 按地理位置而非随机抽样切分数据集的做法
地理泄漏 因空间邻近导致测试集信息渗入训练集
域偏移 训练与部署数据分布不一致
少样本 每类仅给少量标注样本的学习设定
零样本 类别在训练时完全未见
European Urban Atlas 欧盟城市土地覆盖地图册,本数据的类源
Copernicus 欧盟对地观测计划,Sentinel 系列的上级

附录 D 常见误读 FAQ

问:官方那个总数是原影像数还是瓦片数?
瓦片数。同一景影像能裁出上百张瓦片,所以原影像的数量远少于瓦片数。

问:B8A 为什么不在 B08 后面?
Sentinel-2 的波段命名按设计顺序而非波长顺序。B8A 是后补的窄幅近红外,GeoTIFF 里排在最后,按名取值比按序号取值可靠。

问:RGB 版与多光谱版能配对使用吗?
同源但处理不同,JPEG 有损压缩、重采样不同,严格配对需要自己做几何与辐射对齐。

问:64 像素为什么不是 100?
论文强调目标是在 10 米像素下可辨,64 是权衡后的选择:够大到看出纹理,小到能大量取样。

问:它和 UC Merced 谁更好?
取决于任务。要分辨率与类别细度,UC Merced 或 AID 更合适;要地���坐标与泄漏实验,EuroSAT 独有。

问:可以只下载 RGB 版做论文吗?
可以,但要说明只用了三波段,且不能与 13 波段的数字并列比较。

问:TorchGeo 的划分是官方的吗?
不是。它取自 In-domain representation learning for remote sensing 一文,属于社区协议。

问:为什么说它没有时间信息?
文件与记录里都没有日期字段;论文只说取自全年,没给逐瓦片日期。

问:数据量这么小,还能用来训练吗?
可以训练,但训练出来的是十类地物的判别器,不是通用的遥感模型。

问:多光谱版能不能转成 RGB 用?
能,取 B04、B03、B02 并按标度归一化即可,仓库 FAQ 给出了 GDAL 命令示例。

附录 E 许可与引用

许可分两层:作者加工后的数据包为 MIT;星上影像源自 Copernicus,适用 ESA 的 Sentinel 数据条款。Zenodo notes 明确要求使用者留意后者的法律声明。

引用建议同时给出两篇:

  • Helber P., Bischke B., Dengel A., Borth D. Introducing EuroSAT: A Novel Dataset and Deep Learning Benchmark for Land Use and Land Cover Classification. IGARSS 2018, pp. 204–207. DOI 10.1109/IGARSS.2018.8519248
  • Helber P., Bischke B., Dengel A., Borth D. EuroSAT: A Novel Dataset and Deep Learning Benchmark for Land Use and Land Cover Classification. IEEE JSTARS, 2019, 12(7): 2217–2226. DOI 10.1109/JSTARS.2019.2918242

数据记录引用:

  • Zenodo record 7711810, DOI 10.5281/zenodo.7711810(记录 DOI)
  • 概念 DOI 10.5281/zenodo.7711096(跨版本引用首选)

划分协议引用:

  • Neumann M., Pinto A. S., Zhai X., Houlsby N. In-domain Representation Learning for Remote Sensing. arXiv 1911.06721, 2019.

编辑说明

核验时间 2026-10-29。方法:直接读取 Zenodo 记录 API(含 metadata 与 files 两个端点)获取总数、类别、波段、许可、体积与校验值;读取 arXiv 1709.00029v2 的 HTML 全文,取采集流程、波段表、类别定义与基准结果;读取 TorchGeo 的 EuroSAT 数据类源码,取波段名单、目录层级与划分来源;读取仓库 README 取许可说明与废弃主机提示。未下载图像文件本体,未做逐样本清点与分布统计,因此每类的精确数量、重复样本情况、逐瓦片云量均未覆盖。文中「约 640 米」由 64 像素与 10 米分辨率推算,非官方表述。34 国名单以论文 §III-A 的列举为准。与本站预设不符处已在校正文中逐条更正,主要涉及许可(非 CC BY 4.0)、Geo-referenced 是否为独立版本、以及官方是否提供划分。


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • gaia-dr3 — 共享标签:多模态 / 评测基准 / 影像-文本对齐
  • sdss-dr20 — 共享标签:多模态 / 评测基准 / 影像-文本对齐
  • derm1m — 共享标签:多模态 / 评测基准 / 影像-文本对齐
  • empiar — 共享标签:多模态 / 评测基准 / 医学图像分割
  • med-reasonseg — 共享标签:评测基准 / 医学图像分割 / 影像-文本对齐
  • cryoet-data-portal — 共享标签:多模态 / 评测基准 / 医学图像分割
  • pathseg — 共享标签:多模态 / 评测基准 / 医学图像分割
  • revapo — 共享标签:多模态 / 评测基准 / 影像-文本对齐
  • alma-archive — 共享标签:多模态 / 评测基准
  • ms-cxr-t — 共享标签:多模态 / 评测基准 / 影像-文本对齐

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集