信息速览
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 — 共享标签:多模态 / 评测基准 / 影像-文本对齐
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

