[ECCV2026] OmniCoT: A Benchmark for Global and Multi-Step Panoramic Reasoning
Python
25
19 commits
updated Jun 28, 2026
Haocong He1*, Chenfei Liao2*†, Zichen Wen1,7, Zihao Dongfang2, Xu Zheng2, Bin Ren3, Chang Su4, Zixin Zhang2, Harold H. Chen2, Hongfei Zhang2, Weijia Li5, Kailun Yang6, Conghui He7, Xuming Hu2, Nicu Sebe8, Linfeng Zhang1‡
1SJTU, 2HKUST(GZ), 3MBZUAI, 4JLU, 5THU, 6HNU, 7Shanghai AI Lab, 8UniTrento
*Equal contribution †Project lead ‡Corresponding author
Official repository for the paper: OmniCoT: A Benchmark for Global and Multi-Step Panoramic Reasoning.
Multimodal Large Language Models (MLLMs) have demonstrated promising spatial reasoning capabilities, while these abilities remain underexplored in the emerging visual modality of panoramic imagery. The full 360° × 180° field of view of panoramas essentially supports complex global multi-step reasoning, which is also the fundamental advantage of panoramas in applications such as embodied intelligence. In this paper, we introduce OmniCoT, a panoramic spatial reasoning suite designed to enable MLLMs to use global evidence and perform multi-step inference across viewpoints.
This repository contains:
Omni-COT/: the OmniCoT QA and CoT generation pipeline.lmms-eval/: a vendored lmms-eval copy with local OmniCoT task configs under lmms_eval/tasks/omnicot/.git clone https://github.com/Chenfei-Liao/OmniCoT.git
cd OmniCoT
cd Omni-COT
python -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
pip install -r requirements.txt
The default config reads credentials and model names from environment variables:
export OPENAI_API_KEY="your_api_key"
export OPENAI_BASE_URL="https://api.openai.com/v1"
export OMNICOT_REASONING_MODEL="your_reasoning_model"
export OMNICOT_TEXT_MODEL="your_text_model"
export OMNICOT_VISION_MODEL="your_vision_model"
If you use one model for every stage, set all three OMNICOT_*_MODEL variables to the same model name.
Prepare a dataset root where each scene is stored in its own folder and includes scene_data.json, then run:
python run.py \
--data-root path/to/osr_scenes \
--output data/outputs/simplified_batch_output.json \
--config config/api_config.yaml \
--batch-config config/batch_config.yaml \
--question-batches 2 \
--target-qa-per-type 1 \
--max-workers 5
Runtime caches are stored under data/cache/, so rerunning the same command can resume from previous stages.
python src/stage_cache.py \
--cache-dir data/cache/stage_cache \
--export data/outputs/exported_qa.json
The repository includes a bundled smoke-test subset with six real OmniCoT cases and the corresponding ERP panoramic image:
lmms-eval/lmms_eval/tasks/omnicot/sample_data/OmniCoT_sample.json
lmms-eval/lmms_eval/tasks/omnicot/sample_data/image/
Install the local lmms-eval copy:
cd ../lmms-eval
python -m pip install --upgrade pip
pip install -e .
Run the bundled OmniCoT smoke test:
python -m lmms_eval \
--model qwen2_5_vl \
--model_args pretrained=Qwen/Qwen2.5-VL-7B-Instruct \
--tasks omnicot_no_desc \
--batch_size 1 \
--limit 8 \
--output_path results/omnicot_smoke
Available local tasks:
omnicot_no_desc: visual input plus question.omnicot_with_desc: visual input plus structured scene description plus question.omnicot_text_only: text-only ablation.omnicot_no_thinking: direct-answer ablation.For full benchmark evaluation, place the complete OmniCoT JSON and image folder
in a reproducible data location, update
lmms_eval/tasks/omnicot/_default_template.yaml, and set OMNICOT_DATA_DIR /
OMNICOT_IMAGE_DIR if your image paths are stored outside the JSON directory.
The answer-evaluation run writes a model submission file to:
lmms-eval/results/omnicot_smoke/submissions/omnicot_submission.json
After answer evaluation, run the CoT-quality judge on the generated submission:
export OPENAI_API_KEY="your_judge_api_key"
export OPENAI_BASE_URL="https://api.openai.com/v1"
export JUDGE_MODEL="your_judge_model"
python tools/omnicot_cot_quality_eval.py \
--input-file results/omnicot_smoke/submissions/omnicot_submission.json \
--output-dir results/omnicot_smoke/cot_quality \
--mode all \
--num-threads 4
The script supports three modes:
simple: CoT precision, recall, and F1 against the reference CoT.spatial: viewpoint consistency, spatial evidence sufficiency, and reasoning feasibility.all: runs both groups of metrics.simple uses two judge calls per sample, spatial uses three, and all uses
five. Use --max-samples for a small-cost smoke test before full evaluation.
You can download the dataset directly from our Hugging Face repository:
huggingface-cli download --repo-type dataset Eustia1/OmniCoT --local-dir /path/to/OmniCoT
The dataset follows the "See-Locate-Move" taxonomy, evaluating multi-hop viewpoint transformation, inter-object spatial relationship, and interactive multi-step planning.
OmniCoT is released as an ImageFolder dataset with one metadata.jsonl
file per split:
train/
images/
metadata.jsonl
validation/
images/
metadata.jsonl
test/
images/
metadata.jsonl
real/
images/
metadata.jsonl
Each line in metadata.jsonl is one QA sample. Multiple QA samples may
reference the same panoramic image through file_name.
Split statistics:
| Split | QA samples | Unique images |
|---|---|---|
train | 14,385 | 2,800 |
validation | 3,060 | 600 |
test | 3,115 | 600 |
real | 1,073 | 200 referenced real-world images |
Images are disjoint across splits to avoid leakage.
Fields:
| Field | Description |
|---|---|
image | Panoramic image generated by the ImageFolder loader. |
file_name | Relative image path within the split folder, for example images/xxx.png. |
scene_id | Scene identifier. |
qa_id | Unique QA sample id. |
type | Question type, for example viewpoint_transform_identify. |
subtype | Subtype label, for example A1. |
question | Question text. |
answer | Answer text. |
cot | Chain-of-thought steps as a list of strings; may be empty for real-world samples. |
random_objects | Optional list of objects used for randomization. |
If you find our work helpful, please cite:
@article{omnicot2026,
title = {OmniCoT: A Benchmark for Global and Multi-Step Panoramic Reasoning},
author = {He, Haocong and Liao, Chenfei and Wen, Zichen and Dongfang, Zihao and Zheng, Xu and Ren, Bin and Su, Chang and Zhang, Zixin and Chen, Harold Haodong and Zhang, Hongfei and Li, Weijia and Yang, Kailun and He, Conghui and Hu, Xuming and Sebe, Nicu and Zhang, Linfeng},
journal = {arXiv preprint},
year = {2026}
}
67 followers · starred Jul 2026
Python
98.0%
TypeScript
1.0%
[ECCV2026] OmniCoT: A Benchmark for Global and Multi-Step Panoramic Reasoning
Python
25
19 commits
updated Jun 28, 2026
Haocong He1*, Chenfei Liao2*†, Zichen Wen1,7, Zihao Dongfang2, Xu Zheng2, Bin Ren3, Chang Su4, Zixin Zhang2, Harold H. Chen2, Hongfei Zhang2, Weijia Li5, Kailun Yang6, Conghui He7, Xuming Hu2, Nicu Sebe8, Linfeng Zhang1‡
1SJTU, 2HKUST(GZ), 3MBZUAI, 4JLU, 5THU, 6HNU, 7Shanghai AI Lab, 8UniTrento
*Equal contribution †Project lead ‡Corresponding author
Official repository for the paper: OmniCoT: A Benchmark for Global and Multi-Step Panoramic Reasoning.
Multimodal Large Language Models (MLLMs) have demonstrated promising spatial reasoning capabilities, while these abilities remain underexplored in the emerging visual modality of panoramic imagery. The full 360° × 180° field of view of panoramas essentially supports complex global multi-step reasoning, which is also the fundamental advantage of panoramas in applications such as embodied intelligence. In this paper, we introduce OmniCoT, a panoramic spatial reasoning suite designed to enable MLLMs to use global evidence and perform multi-step inference across viewpoints.
This repository contains:
Omni-COT/: the OmniCoT QA and CoT generation pipeline.lmms-eval/: a vendored lmms-eval copy with local OmniCoT task configs under lmms_eval/tasks/omnicot/.git clone https://github.com/Chenfei-Liao/OmniCoT.git
cd OmniCoT
cd Omni-COT
python -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
pip install -r requirements.txt
The default config reads credentials and model names from environment variables:
export OPENAI_API_KEY="your_api_key"
export OPENAI_BASE_URL="https://api.openai.com/v1"
export OMNICOT_REASONING_MODEL="your_reasoning_model"
export OMNICOT_TEXT_MODEL="your_text_model"
export OMNICOT_VISION_MODEL="your_vision_model"
If you use one model for every stage, set all three OMNICOT_*_MODEL variables to the same model name.
Prepare a dataset root where each scene is stored in its own folder and includes scene_data.json, then run:
python run.py \
--data-root path/to/osr_scenes \
--output data/outputs/simplified_batch_output.json \
--config config/api_config.yaml \
--batch-config config/batch_config.yaml \
--question-batches 2 \
--target-qa-per-type 1 \
--max-workers 5
Runtime caches are stored under data/cache/, so rerunning the same command can resume from previous stages.
python src/stage_cache.py \
--cache-dir data/cache/stage_cache \
--export data/outputs/exported_qa.json
The repository includes a bundled smoke-test subset with six real OmniCoT cases and the corresponding ERP panoramic image:
lmms-eval/lmms_eval/tasks/omnicot/sample_data/OmniCoT_sample.json
lmms-eval/lmms_eval/tasks/omnicot/sample_data/image/
Install the local lmms-eval copy:
cd ../lmms-eval
python -m pip install --upgrade pip
pip install -e .
Run the bundled OmniCoT smoke test:
python -m lmms_eval \
--model qwen2_5_vl \
--model_args pretrained=Qwen/Qwen2.5-VL-7B-Instruct \
--tasks omnicot_no_desc \
--batch_size 1 \
--limit 8 \
--output_path results/omnicot_smoke
Available local tasks:
omnicot_no_desc: visual input plus question.omnicot_with_desc: visual input plus structured scene description plus question.omnicot_text_only: text-only ablation.omnicot_no_thinking: direct-answer ablation.For full benchmark evaluation, place the complete OmniCoT JSON and image folder
in a reproducible data location, update
lmms_eval/tasks/omnicot/_default_template.yaml, and set OMNICOT_DATA_DIR /
OMNICOT_IMAGE_DIR if your image paths are stored outside the JSON directory.
The answer-evaluation run writes a model submission file to:
lmms-eval/results/omnicot_smoke/submissions/omnicot_submission.json
After answer evaluation, run the CoT-quality judge on the generated submission:
export OPENAI_API_KEY="your_judge_api_key"
export OPENAI_BASE_URL="https://api.openai.com/v1"
export JUDGE_MODEL="your_judge_model"
python tools/omnicot_cot_quality_eval.py \
--input-file results/omnicot_smoke/submissions/omnicot_submission.json \
--output-dir results/omnicot_smoke/cot_quality \
--mode all \
--num-threads 4
The script supports three modes:
simple: CoT precision, recall, and F1 against the reference CoT.spatial: viewpoint consistency, spatial evidence sufficiency, and reasoning feasibility.all: runs both groups of metrics.simple uses two judge calls per sample, spatial uses three, and all uses
five. Use --max-samples for a small-cost smoke test before full evaluation.
You can download the dataset directly from our Hugging Face repository:
huggingface-cli download --repo-type dataset Eustia1/OmniCoT --local-dir /path/to/OmniCoT
The dataset follows the "See-Locate-Move" taxonomy, evaluating multi-hop viewpoint transformation, inter-object spatial relationship, and interactive multi-step planning.
OmniCoT is released as an ImageFolder dataset with one metadata.jsonl
file per split:
train/
images/
metadata.jsonl
validation/
images/
metadata.jsonl
test/
images/
metadata.jsonl
real/
images/
metadata.jsonl
Each line in metadata.jsonl is one QA sample. Multiple QA samples may
reference the same panoramic image through file_name.
Split statistics:
| Split | QA samples | Unique images |
|---|---|---|
train | 14,385 | 2,800 |
validation | 3,060 | 600 |
test | 3,115 | 600 |
real | 1,073 | 200 referenced real-world images |
Images are disjoint across splits to avoid leakage.
Fields:
| Field | Description |
|---|---|
image | Panoramic image generated by the ImageFolder loader. |
file_name | Relative image path within the split folder, for example images/xxx.png. |
scene_id | Scene identifier. |
qa_id | Unique QA sample id. |
type | Question type, for example viewpoint_transform_identify. |
subtype | Subtype label, for example A1. |
question | Question text. |
answer | Answer text. |
cot | Chain-of-thought steps as a list of strings; may be empty for real-world samples. |
random_objects | Optional list of objects used for randomization. |
If you find our work helpful, please cite:
@article{omnicot2026,
title = {OmniCoT: A Benchmark for Global and Multi-Step Panoramic Reasoning},
author = {He, Haocong and Liao, Chenfei and Wen, Zichen and Dongfang, Zihao and Zheng, Xu and Ren, Bin and Su, Chang and Zhang, Zixin and Chen, Harold Haodong and Zhang, Hongfei and Li, Weijia and Yang, Kailun and He, Conghui and Hu, Xuming and Sebe, Nicu and Zhang, Linfeng},
journal = {arXiv preprint},
year = {2026}
}
67 followers · starred Jul 2026
Python
98.0%
TypeScript
1.0%