Beyond the Seen: Bounded Distribution Estimation for Open-Vocabulary Learning

October 21, 2025 · View on GitHub

🔥NeurIPS 2025 (Poster)

authors

GitHub Stars arXiv Paper

📄 Paper

Performance Highlights (Baseline: PromptSRC)

Base-to-New:

NameBaseNewH
CLIP69.3474.2271.70
CoOp82.6963.2271.66
CoCoOp80.4771.6975.83
DePT85.1976.1780.43
TCP84.1375.3679.51
CuTCP84.2176.1079.95
DeKg84.9676.3880.44
PromptSRC84.2676.1079.97
Ours86.40 (+2.14)80.52 (+4.42)83.36 (+3.39)

Cross-dataset:

NameSourceTarget
CoOp71.5163.88
CoCoOp71.0265.74
ASPrompt71.0567.03
PromptSRC71.2765.81
Ours71.22 (-0.05)67.68 (+1.87)

🛠️ Setup

Install environment

# Create a conda environment
conda create -n beyond python=3.9.18 -y

# Activate the environment
conda activate beyond

# Install torch (requires version >= 1.8.1) and torchvision
# Please refer to https://pytorch.org/ if you need a different cuda version
pip install torch==2.1.2 torchvision==0.16.2 torchaudio==0.11.0

# Install requirements
pip install -r requirements.txt

Prepare datasets

Please follow the instructions at DATASETS.md to prepare all datasets.

Prepare models

(1) LLaVA

Refer to official repo for environment setup.

After setting up the environment, you can download checkpoints and add the model path to generate captions of seen-class data.

# sample.py
model_path = '/path/to/llava-v1.6-vicuna-13b'

(2) Doubao

Refer to official API documentation for environment setup.

After setting up the environment, you can export your own API key to generate candidate unseen classes.

Alternatively, you can implement your own API request function in sample.py.

(3) Llama

Download checkpoints and add the model path to generate captions of unseen-class data.

# sample.py
model_id = "/path/to/Llama-3.1-8B-Instruct"

(4) Stable Diffusion

Download checkpoints and add the model path to generate unseen-class data.

# sample.py
sd_model = StableDiffusionPipeline.from_pretrained(
	"/path/to/stable-diffusion-2-1", variant="fp16", torch_dtype=torch.float16
)

(5) Boosting prompt

Download the checkpoints related to the boosting prompt and add the model path.

# scripts/caspl/beyond/base2new_train_beyond_student.sh
# scripts/caspl/beyond/base2new_test_beyond_student.sh
MODEL_DIR=/path/to/teacher/...

Experiments

(0) Generate unseen-class data

Prepare the prompts used to generate unseen-class data. We’ve provided an example in prompt.py.

Add data paths and output paths.

# train_script/caspl_beyond/train_base_to_new.py
dataset_list = [ 'caltech101', ... ]

# scripts/caspl/beyond/base2new_train_beyond_student.sh
# scripts/caspl/beyond/base2new_test_beyond_student.sh
DATA=/path/to/dataset/folder
DIR=/path/to/output/...
KD.RESULT_PATH /path/to/output/...

# train.py
cfg.FUTURE.candidate_data_root = '/path/to/generated_data'

Run the script below and exit after the generate_candidate_data function.

python train_script/caspl_beyond/train_base_to_new.py

(1) Base-to-Novel Experiments

Add data paths and output paths and run the script below.

python train_script/caspl_beyond/train_base_to_new.py

(2) Cross-dataset Experiments

Add data paths and output paths and run the script below.

python train_script/caspl_beyond/train_cross_dataset.py

Acknowledgement

Thanks for their brilliant contributions to the community! Here are the codebases we built upon.

Citation

If you find our work helpful, please consider cite our paper 📝 and star us ⭐️!

@inproceedings{Fan2025beyond,
    title={Beyond the Seen: Bounded Distribution Estimation for Open-Vocabulary Learning},
    author={Xiaomeng Fan and Yuchuan Mao and Zhi Gao and Yuwei Wu and Jin Chen and Yunde Jia},
    booktitle={Advances in Neural Information Processing Systems},
    year={2025}
}