Instructions to use ibm-research/GeoVLM-R1 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use ibm-research/GeoVLM-R1 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="ibm-research/GeoVLM-R1")# pip install -U transformers accelerate # Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("ibm-research/GeoVLM-R1", device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use ibm-research/GeoVLM-R1 with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "ibm-research/GeoVLM-R1" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ibm-research/GeoVLM-R1", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker
docker model run hf.co/ibm-research/GeoVLM-R1
- SGLang
How to use ibm-research/GeoVLM-R1 with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "ibm-research/GeoVLM-R1" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ibm-research/GeoVLM-R1", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "ibm-research/GeoVLM-R1" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ibm-research/GeoVLM-R1", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }' - Docker Model Runner
How to use ibm-research/GeoVLM-R1 with Docker Model Runner:
docker model run hf.co/ibm-research/GeoVLM-R1
Download GeoVLM_R1_grounding/README.md from ibm-research/GeoVLM-R1: direct link, hf CLI and curl.
- Browser
- Download file 3.07 kB
-
https://huggingface.co/ibm-research/GeoVLM-R1/resolve/main/GeoVLM_R1_grounding/README.md
- Command line
-
hf download hf://ibm-research/GeoVLM-R1/GeoVLM_R1_grounding/README.md
-
curl -L -o README.md https://huggingface.co/ibm-research/GeoVLM-R1/resolve/main/GeoVLM_R1_grounding/README.md
library_name: transformers
pipeline_tag: image-text-to-text
base_model: Qwen/Qwen2.5-VL-3B-Instruct
tags:
- remote-sensing
- earth-observation
- geospatial
- qwen2_5_vl
- grpo
GeoVLM_R1_grounding
Disclaimer
THIS MODEL IS PROVIDED “AS IS,” WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, OR NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR THEIR AFFILIATES BE LIABLE FOR ANY DAMAGES ARISING FROM ACCESS TO OR USE OF THIS MODEL.
This model is released without a license. It is not open-source software.
Model description
GeoVLM_R1_grounding is the Visual grounding (grounding description) checkpoint of GeoVLM-R1, from the paper
GeoVLM-R1: Reinforcement Fine-Tuning for Improved Remote Sensing Reasoning.
- Architecture:
Qwen2_5_VLForConditionalGeneration(3B parameters, bfloat16) - Training: Qwen2.5-VL-3B-Instruct, then supervised fine-tuning on EarthDial-Instruct, then
GRPO reinforcement fine-tuning with task-aware rewards on
GRPO_GeoChat_grounding.jsonl - Task: Visual grounding (grounding description)
- Benchmarks: NWPU VHR-10 grounding
GeoVLM-R1 has one checkpoint per task. All 9 are in ibm-research/GeoVLM-R1.
Usage
import torch
from transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessor
from qwen_vl_utils import process_vision_info
model_path = "path/to/GeoVLM_R1_grounding"
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
model_path, torch_dtype=torch.bfloat16, device_map="auto").eval()
processor = AutoProcessor.from_pretrained(model_path)
messages = [{
"role": "user",
"content": [
{"type": "image", "image": "example.png", "resized_height": 448, "resized_width": 448},
{"type": "text", "text": "Describe this image."},
],
}]
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
images, videos = process_vision_info(messages)
inputs = processor(text=[text], images=images, videos=videos,
padding=True, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=128)
print(processor.batch_decode([o[len(i):] for i, o in zip(inputs.input_ids, out)],
skip_special_tokens=True)[0])
To run the benchmark, use GeoVLM_inference/generate_inference_grounding.py from the
GeoVLM-R1 Toolkit with --model_path path/to/GeoVLM_R1_grounding.
Citation
@article{fiaz2025geovlmr1,
title = {GeoVLM-R1: Reinforcement Fine-Tuning for Improved Remote Sensing Reasoning},
author = {Fiaz, Mustansar and Debary, Hiyam and Fraccaro, Paolo and Paudel, Danda and
Van Gool, Luc and Khan, Fahad and Khan, Salman},
journal = {arXiv preprint arXiv:2509.25026},
year = {2025}
}
Contact
Mustansar Fiaz mustansar.fiaz@ibm.com