SpatialThinker-30B is a 30B-parameter Mixture-of-Experts (3B active) multimodal large language model trained with reinforcement learning to integrate structured spatial grounding with multi-step reasoning. It scales the SpatialThinker method to the Qwen3-VL-30B-A3B-Instruct base, retaining the same training recipe: a four-tag scene-graph reasoning format and a dense spatial reward over format, count, accuracy, and grounding.
Model Description
Base Model: Qwen3-VL-30B-A3B-Instruct (Mixture-of-Experts; ~3B active parameters)
Training: GRPO (Group Relative Policy Optimization) with dense spatial rewards via Thinking Machines' Tinker
Training Data: STVQA-7K (7,587 spatial VQA samples)
Authors: Hunar Batra, Haoqin Tu, Hardy Chen, Yuanze Lin, Cihang Xie, Ronald Clark
Institutions: University of Oxford, UC Santa Cruz
Key Features
Structured Spatial Reasoning: Constructs question-focused scene subgraphs with objects, bounding boxes, and relations
Dense Spatial Rewards: Multi-objective reward function enforcing format, count, accuracy, and spatial grounding
9 Spatial Reasoning Categories: Relations, reach, size, orientation, instance location, depth, distance, count, and existence
MoE Efficiency: 30B total parameters with only ~3B active per token — comparable quality to dense 30B models at a fraction of the compute
Inference Template
Same four-tag format as SpatialThinker-7B:
You FIRST observe the image in <observe> </observe> tags, then visualise the relevant scene graph in <scene> </scene> tags, followed by thinking about the reasoning process as an internal monologue within <think> </think> tags and then provide the final answer. The final answer MUST BE put within <answer> </answer> tags, and only return the final choice including the correct option and answer within the answer tags, e.g., <answer> (A) cat </answer>.
Image size: {Width} x {Height}
Usage
python
1from transformers import Qwen3VLForConditionalGeneration, AutoProcessor
2from PIL import Image
34model = Qwen3VLForConditionalGeneration.from_pretrained(5"hunarbatra/SpatialThinker-30B",6 torch_dtype="auto",7 device_map="auto"8)9processor = AutoProcessor.from_pretrained("hunarbatra/SpatialThinker-30B")1011# Load image12image = Image.open("your_image.jpg")13width, height = image.size
1415# Prepare prompt with template16template =f"""You FIRST observe the image in <observe> </observe> tags, then visualise the relevant scene graph in <scene> </scene> tags, followed by thinking about the reasoning process as an internal monologue within <think> </think> tags and then provide the final answer. The final answer MUST BE put within <answer> </answer> tags, and only return the final choice including the correct option and answer within the answer tags, e.g., <answer> (A) cat </answer>.
1718Image size: {width} x {height}"""1920question ="Where is the cat relative to the couch? (A) on top of (B) in front of (C) behind (D) beside"2122messages =[23{24"role":"user",25"content":[26{"type":"image","image": image},27{"type":"text","text": template +"\n\n"+ question},28],29}30]3132text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)33inputs = processor(text=[text], images=[image], return_tensors="pt").to(model.device)3435generated_ids = model.generate(**inputs, max_new_tokens=2048)36output = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]37print(output)
Training Details
Framework: Thinking Machines' Tinker (LoRA on remote H100 cluster)
The model was trained with several rollout-side fixes that lift the Qwen3-VL-Instruct base's format-pass rate from ~78% to ~96% during training:
Forced <observe>\n assistant prefix (matches the four-tag schema the model is trained to produce)
Postprocess rewrites for <tool_call> → <think> (the Instruct base's tool-use prior occasionally leaks)
Repairs for orphan/unclosed <think> tags
Citation
bibtex
1@misc{batra2025spatialthinkerreinforcing3dreasoning,
2 title={SpatialThinker: Reinforcing 3D Reasoning in Multimodal LLMs via Spatial Rewards},
3 author={Hunar Batra and Haoqin Tu and Hardy Chen and Yuanze Lin and Cihang Xie and Ronald Clark},
4 year={2025},
5 eprint={2511.07403},
6 archivePrefix={arXiv},
7 primaryClass={cs.CV},
8 url={https://arxiv.org/abs/2511.07403},
9}