README.md
July 1, 2026 Β· View on GitHub
π°οΈ GeoMMBench & GeoMMAgent: A Multimodal Benchmark and Multi-Agent Framework for GeoScience and Remote Sensing
π» Code | π Paper | π€ Dataset | π Project Page |
News
2026/04/09: β GeoMMBench & GeoMMAgent is selected as a CVPR 2026 Highlight!2026/03/23: π GeoMMBench & GeoMMAgent is accepted by CVPR 2026!2026/03/23: We release the GeoMMBench dataset on π€ Hugging Face, containing 1,053 expert-level multiple-choice questions.2026/03/23: Code for GeoMMAgent (coordinator, exec_agents, toolkit) is publicly available.
Introduction
GeoMMBench is a comprehensive multimodal question-answering benchmark for geoscience and remote sensing (RS), featuring 1,053 expert-level, image-based multiple-choice questions covering:
- π 4 disciplines: Remote Sensing, Photogrammetry, GIS, GNSS
- π‘ 6 sensor modalities: Optical, SAR, Hyperspectral, LiDAR, DEM, Thermal
- π¬ Diverse task spectrums: Scene classification, object detection, change detection, spectral analysis, spatial reasoning, and more

GeoMMAgent is a multi-agent framework following a planβexecuteβevaluate paradigm, integrating toolkits and agent roles below.
| Toolkit | Capability (this repo) |
|---|---|
| π§General | Format conversion, filtering, scaling, neural super-resolution (Real-ESRGAN optional), etc. (toolkit/general.py) |
| πKnowledge | Web search (short-circuit: DuckDuckGo β Google β Bing β Wikipedia text); optional image search + downloaded evidence images; GME textβimage similarity to rank/filter candidates (toolkit/gme_filter.py, weights in config) |
| ποΈPerception | Scene classification & object detection (YOLO11); semantic segmentation (DeepLabV3+ with Xception, bundled under toolkit/deeplabv3plus_xception/, weights in config) |
| π§ Reasoning | Reasoning & matching agents (multimodal LLM); option alignment in-agent |
| Agent | Role |
|---|---|
| Coordinator | Task planning, decomposition, and orchestration (coordinator/) |
| Perception (Cls / Det / Seg) | Classification, detection, DeepLab segmentation |
| Search | Retrieval + evidence images for downstream VLMs |
| Reasoning / Matching | Multi-step inference and MCQ alignment |
| Self-Evaluation | Optional quality check (exec_agents/evaluation/) |

Benchmark Results
GeoMMBench evaluates 36+ vision-language models under zero-shot conditions. GeoMMAgent achieves strong performance.

See the paper for full results and analysis.
GeoMMAgent Architecture
coordinator/
βββ coordinator.py β Dispatch β sequential execution, multi-image context
βββ prompts.py
exec_agents/
βββ general/ β Preprocess agents
βββ perception/ β ClsAgent, DetAgent, SegAgent (DeepLab)
βββ knowledge/ β SearchAgent (+ evidence images)
βββ reasoning/ β ReasoningAgent, MatchingAgent
βββ evaluation/ β SelfEvaluationAgent (optional)
configs/
βββ GeoMMBench.yaml β Coordinator & agents; gme: & SegAgent.deeplab_weights
toolkit/
βββ general.py
βββ classification_toolkit.py β YOLO11 classification
βββ detection_toolkit.py β YOLO11 OBB detection
βββ segmentation_toolkit.py β DeepLabV3+ Xception inference
βββ deeplabv3plus_xception/ β Minimal DeepLab code (from DeepLabV3Plus-Pytorch)
βββ gme_filter.py β GME-style embedding filter (see env / yaml)
βββ knowledge.py β Retrieval hook (optional)
βββ reasoning.py β Placeholder exports (logic in agents)
βββ super_resolution.py
βββ data_loader.py β GeoMMBench parquet loader
Quick Start
Installation
Official repository: github.com/Shihao-Cheng/GeoMMAgent.
git clone https://github.com/Shihao-Cheng/GeoMMAgent.git
cd GeoMMAgent
pip install -r requirements.txt
For GPU, install a matching PyTorch build from pytorch.org before or after the step above. Segmentation and GME may need transformers with versions compatible with your stack (see paper / model cards).
Environment & configuration
cp .env_template .env
Edit .env for API keys. Typical entries:
QWEN_API_KEY: Multimodal / text models (Model Studio).- Search (optional):
GOOGLE_API_KEY+SEARCH_ENGINE_IDfor Google Programmable Search; otherwise other engines in the pipeline are used. - GME / DeepLab (optional overrides): defaults are set from
configs/GeoMMBench.yaml(gme:andSegAgent.deeplab_weights). Use.envonly when you need to override.
Run
From the GeoMMAgent project root (paths in configs/GeoMMBench.yaml are relative to this root unless absolute):
pip install -r requirements.txt
cp .env_template .env # then set API keys
# Single query (plan β execute β trace)
python run/run_geomm.py --single "θΏεΌ ι₯ζεΎεδΈζε ζΆι£ζΊοΌ" --image /path/to/image.png
# Benchmark on GeoMMBench parquet (place or symlink file at datasets/validation.parquet, or pass a path)
python run/run_geomm.py --bench datasets/validation.parquet
python run/run_geomm.py --bench datasets/validation.parquet --limit 5
Parallel benchmark: python run/run_benchmark_parallel.py --parquet datasets/validation.parquet (see run/run_benchmark_parallel.py docstring). Optional: bash run_benchmark.sh with PARQUET / WORKERS env vars.
Layout: put model weights under weights/; for neural super-resolution, clone the Real-ESRGAN inference repo into Real-ESRGAN-master/ at the repo root (see SuperResolutionAgent in configs/GeoMMBench.yaml). YOLO debug outputs go to yolo_out/ (gitignored).
Model configuration
Default coordinator and per-agent models are defined in configs/GeoMMBench.yaml (coordinator.model, agents.*.model). Entry point run/run_geomm.py loads this file via load_config() and create_model_from_config().
Dataset
GeoMMBench is on π€ Hugging Face:
from datasets import load_dataset
ds = load_dataset("GeoMM/GeoMMBench")
Each sample contains: image, question, options (A/B/C/D), answer.
For run/run_geomm.py --bench and run/run_benchmark_parallel.py, export or symlink a Parquet file to datasets/validation.parquet (default in configs/GeoMMBench.yaml) or pass --parquet /your/path.parquet.
Model weights
| Component | Notes | Weights |
|---|---|---|
| YOLO11-cls | Scene classification | shihaocheng/GeoMMAgent Β· yolo11s-cls-sft.pt |
| YOLO11-obb | DOTA-style detection | shihaocheng/GeoMMAgent Β· yolo11s-obb.pt |
| DeepLabV3+ (LoveDA) | Semantic segmentation (Xception backbone, same family as toolkit/deeplabv3plus_xception) | open-mmlab/mmsegmentation Β· deeplabv3plus |
| GME | Multimodal embedding filter for search candidates | Local path in configs/GeoMMBench.yaml β gme.model_path (e.g. weights/gme-Qwen2-VL-2B-Instruct) |
Place downloaded files under weights/ (or use absolute paths) and align SegAgent.deeplab_weights (path, num_classes, output_stride) with how each checkpoint was trained. Classification/detection paths are set in configs/GeoMMBench.yaml under each agent.
Extending GeoMMAgent
Training-free extension:
- Add tools under
toolkit/and bind them inexec_agents/(BaseExecAgent,get_tools()). - Register agents in
configs/GeoMMBench.yaml(agents.<Name>.enabled) and ensureconfigs/loader.pyAGENT_REGISTRYincludes your class. - Run via
run/run_geomm.pywhich callsbuild_agents_from_config().
License
The GeoMMBench dataset is distributed under the CC BY 4.0 License. The code is released under the Apache License 2.0.
Citation
@inproceedings{xiao2026geomm,
title={GeoMMBench and GeoMMAgent: Toward Expert-Level Multimodal Intelligence in Geoscience and Remote Sensing},
author={Xiao, Aoran and Cheng, Shihao and Xu, Yonghao and Ren, Yexian and Chen, Hongruixuan and Yokoya, Naoto},
booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
year={2026}
}