Dataset and model weights for the paper:
Beyond Visual Fidelity: Benchmarking Super-Resolution Models for Large-Scale Remote Sensing Imagery via Downstream Task Integration [arXiv]
The code is available on GitHub: https://github.com/ai-spatial/GeoSR-Bench
GeoSR-Bench directly connects super-resolution (SR) with downstream Earth monitoring tasks, moving beyond conventional fidelity-based evaluation. It comprises spatially co-located, temporally aligned, and quality-controlled image pairs from about 36,000 locations across diverse land covers, spanning spatial resolutions from 500 m to 0.6 m. It is designed to evaluate whether improved image resolution from SR models translates into better downstream performance for tasks such as land cover segmentation, infrastructure mapping, and biophysical variable estimation. GeoSR-Bench includes two cross-platform super-resolution tasks:
For each task, the dataset is organized into two types of subsets:
Super-resolution-only datasets
These subsets include paired lower-resolution and higher-resolution remote sensing images without downstream task labels. They are designed for training SR models.
Downstream task datasets
These subsets include paired lower-resolution and higher-resolution images together with task-specific labels. They are designed to finetune SR models and evaluate whether super-resolved images improve downstream Earth monitoring tasks, such as land cover segmentation, infrastructure mapping, and biophysical variable estimation.
Each sample may contain:
GeoSR-Bench is intended to support research on task-aware super-resolution, cross-platform learning, and remote sensing foundation models.
The dataset contains both SR-only datasets and downstream task datasets.
SRDatasetName/
βββ data/
β βββ SRDatasetName_part_0000.parquet
β βββ SRDatasetName_part_0001.parquet
β βββ ...
βββ index.csv
Each Parquet file contains paired low-resolution and high-resolution images together with metadata:
id
lr_name
hr_name
lr_image
hr_image
meta
DownstreamDatasetName/
βββ train/
β βββ DownstreamDatasetName_train_part_0000.parquet
β βββ DownstreamDatasetName_train_part_0001.parquet
β βββ ...
β βββ DownstreamDatasetName_train_index.csv
βββ val/
β βββ DownstreamDatasetName_val_part_0000.parquet
β βββ DownstreamDatasetName_val_part_0001.parquet
β βββ ...
β βββ DownstreamDatasetName_val_index.csv
βββ test/
β βββ DownstreamDatasetName_test_part_0000.parquet
β βββ DownstreamDatasetName_test_part_0001.parquet
β βββ ...
β βββ DownstreamDatasetName_test_index.csv
βββ index.csv
Each Parquet file contains paired images, labels, and metadata:
id
lr_name
hr_name
label_name
meta_name
lr_image
hr_image
label_image
meta
Images and labels are stored as binary GeoTIFF bytes inside each Parquet file. They can be read directly with rasterio.
import io
import json
import pandas as pd
import rasterio
parquet_path = "Sentinel2_to_NAIP\SR_Dataset\data\sentinel2_to_naip_part_0000.parquet"
df = pd.read_parquet(parquet_path)
sample = df.iloc[0]
with rasterio.open(io.BytesIO(sample["lr_image"])) as src:
lr = src.read()
lr_profile = src.profile
with rasterio.open(io.BytesIO(sample["hr_image"])) as src:
hr = src.read()
hr_profile = src.profile
meta = json.loads(sample["meta"]) if sample["meta"] is not None else None
print(sample["id"])
print(lr.shape, hr.shape)
print(meta)
import io
import json
import pandas as pd
import rasterio
parquet_path = "Sentinel2_to_NAIP/Downstream_Datasets/RoadDetection/train/road_detection_train_part_0000.parquet"
df = pd.read_parquet(parquet_path)
sample = df.iloc[0]
with rasterio.open(io.BytesIO(sample["lr_image"])) as src:
lr = src.read()
lr_profile = src.profile
with rasterio.open(io.BytesIO(sample["hr_image"])) as src:
hr = src.read()
hr_profile = src.profile
with rasterio.open(io.BytesIO(sample["label_image"])) as src:
label = src.read()
label_profile = src.profile
meta = json.loads(sample["meta"]) if sample["meta"] is not None else None
print(sample["id"])
print(lr.shape, hr.shape, label.shape)
print(meta)
from pathlib import Path
import pandas as pd
parquet_path = "Sentinel2_to_NAIP/Downstream_Datasets/RoadDetection/train/road_detection_train_part_0000.parquet"
out_dir = Path("recovered_sample")
out_dir.mkdir(parents=True, exist_ok=True)
df = pd.read_parquet(parquet_path)
sample = df.iloc[0]
(out_dir / sample["lr_name"]).write_bytes(sample["lr_image"])
(out_dir / sample["hr_name"]).write_bytes(sample["hr_image"])
if "label_image" in sample:
(out_dir / sample["label_name"]).write_bytes(sample["label_image"])
This dataset is intended for research on:
If you use this dataset, please cite:
@article{li2026beyond,
title={Beyond Visual Fidelity: Benchmarking Super-Resolution Models for Large-Scale Remote Sensing Imagery via Downstream Task Integration},
author={Li, Zhili and Chai, Kangyang and Wang, Zhihao and Jia, Xiaowei and Li, Yanhua and Mai, Gengchen and Skakun, Sergii and Manocha, Dinesh and Xie, Yiqun},
journal={arXiv preprint arXiv:2605.00310},
year={2026}
}
Dataset and model weights for the paper:
Beyond Visual Fidelity: Benchmarking Super-Resolution Models for Large-Scale Remote Sensing Imagery via Downstream Task Integration [arXiv]
The code is available on GitHub: https://github.com/ai-spatial/GeoSR-Bench
GeoSR-Bench directly connects super-resolution (SR) with downstream Earth monitoring tasks, moving beyond conventional fidelity-based evaluation. It comprises spatially co-located, temporally aligned, and quality-controlled image pairs from about 36,000 locations across diverse land covers, spanning spatial resolutions from 500 m to 0.6 m. It is designed to evaluate whether improved image resolution from SR models translates into better downstream performance for tasks such as land cover segmentation, infrastructure mapping, and biophysical variable estimation. GeoSR-Bench includes two cross-platform super-resolution tasks:
For each task, the dataset is organized into two types of subsets:
Super-resolution-only datasets
These subsets include paired lower-resolution and higher-resolution remote sensing images without downstream task labels. They are designed for training SR models.
Downstream task datasets
These subsets include paired lower-resolution and higher-resolution images together with task-specific labels. They are designed to finetune SR models and evaluate whether super-resolved images improve downstream Earth monitoring tasks, such as land cover segmentation, infrastructure mapping, and biophysical variable estimation.
Each sample may contain:
GeoSR-Bench is intended to support research on task-aware super-resolution, cross-platform learning, and remote sensing foundation models.
The dataset contains both SR-only datasets and downstream task datasets.
SRDatasetName/
βββ data/
β βββ SRDatasetName_part_0000.parquet
β βββ SRDatasetName_part_0001.parquet
β βββ ...
βββ index.csv
Each Parquet file contains paired low-resolution and high-resolution images together with metadata:
id
lr_name
hr_name
lr_image
hr_image
meta
DownstreamDatasetName/
βββ train/
β βββ DownstreamDatasetName_train_part_0000.parquet
β βββ DownstreamDatasetName_train_part_0001.parquet
β βββ ...
β βββ DownstreamDatasetName_train_index.csv
βββ val/
β βββ DownstreamDatasetName_val_part_0000.parquet
β βββ DownstreamDatasetName_val_part_0001.parquet
β βββ ...
β βββ DownstreamDatasetName_val_index.csv
βββ test/
β βββ DownstreamDatasetName_test_part_0000.parquet
β βββ DownstreamDatasetName_test_part_0001.parquet
β βββ ...
β βββ DownstreamDatasetName_test_index.csv
βββ index.csv
Each Parquet file contains paired images, labels, and metadata:
id
lr_name
hr_name
label_name
meta_name
lr_image
hr_image
label_image
meta
Images and labels are stored as binary GeoTIFF bytes inside each Parquet file. They can be read directly with rasterio.
import io
import json
import pandas as pd
import rasterio
parquet_path = "Sentinel2_to_NAIP\SR_Dataset\data\sentinel2_to_naip_part_0000.parquet"
df = pd.read_parquet(parquet_path)
sample = df.iloc[0]
with rasterio.open(io.BytesIO(sample["lr_image"])) as src:
lr = src.read()
lr_profile = src.profile
with rasterio.open(io.BytesIO(sample["hr_image"])) as src:
hr = src.read()
hr_profile = src.profile
meta = json.loads(sample["meta"]) if sample["meta"] is not None else None
print(sample["id"])
print(lr.shape, hr.shape)
print(meta)
import io
import json
import pandas as pd
import rasterio
parquet_path = "Sentinel2_to_NAIP/Downstream_Datasets/RoadDetection/train/road_detection_train_part_0000.parquet"
df = pd.read_parquet(parquet_path)
sample = df.iloc[0]
with rasterio.open(io.BytesIO(sample["lr_image"])) as src:
lr = src.read()
lr_profile = src.profile
with rasterio.open(io.BytesIO(sample["hr_image"])) as src:
hr = src.read()
hr_profile = src.profile
with rasterio.open(io.BytesIO(sample["label_image"])) as src:
label = src.read()
label_profile = src.profile
meta = json.loads(sample["meta"]) if sample["meta"] is not None else None
print(sample["id"])
print(lr.shape, hr.shape, label.shape)
print(meta)
from pathlib import Path
import pandas as pd
parquet_path = "Sentinel2_to_NAIP/Downstream_Datasets/RoadDetection/train/road_detection_train_part_0000.parquet"
out_dir = Path("recovered_sample")
out_dir.mkdir(parents=True, exist_ok=True)
df = pd.read_parquet(parquet_path)
sample = df.iloc[0]
(out_dir / sample["lr_name"]).write_bytes(sample["lr_image"])
(out_dir / sample["hr_name"]).write_bytes(sample["hr_image"])
if "label_image" in sample:
(out_dir / sample["label_name"]).write_bytes(sample["label_image"])
This dataset is intended for research on:
If you use this dataset, please cite:
@article{li2026beyond,
title={Beyond Visual Fidelity: Benchmarking Super-Resolution Models for Large-Scale Remote Sensing Imagery via Downstream Task Integration},
author={Li, Zhili and Chai, Kangyang and Wang, Zhihao and Jia, Xiaowei and Li, Yanhua and Mai, Gengchen and Skakun, Sergii and Manocha, Dinesh and Xie, Yiqun},
journal={arXiv preprint arXiv:2605.00310},
year={2026}
}