Example Evaluation on OVO-Bench

August 14, 2026 · View on GitHub

This example evaluates the released Dispider checkpoint on the current OVO-Bench edition. The helper runs one deterministic, call-balanced shard per GPU, resumes completed shards, strictly merges every prediction, and computes the official three-category macro score.

Prepare the evaluator and data

Clone the OVO-Bench evaluator and use the revision validated with this repository:

git clone https://github.com/JoeLeelyf/OVO-Bench.git ../OVO-Bench
git -C ../OVO-Bench checkout c34093f
pip install -r ../OVO-Bench/requirements.txt

Download the current annotation and pre-chunked videos from the OVO-Bench dataset. The evaluation directory should contain clips named by annotation ID:

/path/to/ovo-data/
└── chunked_videos/
    ├── 0.mp4
    ├── 1468_0.mp4
    └── ...

The source videos are not required when the pre-chunked archive is used. The script reads data/ovo_bench_new.json from the OVO-Bench checkout by default.

Run the full evaluation

From the Dispider repository, run:

python scripts/evaluate_ovobench.py \
  --ovo-root ../OVO-Bench \
  --model-path /path/to/Dispider \
  --data-root /path/to/ovo-data \
  --output-dir outputs/ovobench \
  --gpus 0,1,2,3 \
  --resume

--gpus accepts any comma-separated CUDA device list. Each GPU gets one weighted shard, so forward tasks with many clips are distributed by inference call count rather than only by annotation count. Use --dry-run to validate the inputs and inspect the shard plan without loading the model or writing files.

The command records an immutable run manifest and stores each worker in a separate directory. Re-running the same command with --resume skips a shard only when its IDs, preserved annotation fields, call count, and every response pass validation. Interrupted or null-containing shards are run again. A different annotation, checkpoint identity, evaluator/Dispider source, clip metadata, or shard count fails closed; use a new output directory for a different run.

After all workers finish, the same command writes:

outputs/ovobench/
├── logs/                         # one log per GPU worker
├── predictions.json              # canonical annotation-order predictions
├── score_report.json             # score report for this local run
├── shards/                       # deterministic worker annotations
└── run_manifest.json             # resume and provenance identity

These files are generated locally under --output-dir; they are not bundled with the repository or model checkpoint.

To validate and score existing outputs without launching CUDA workers, append --score-only and keep the same paths and GPU count.

Scoring

The current edition contains 1,640 annotation rows and 3,035 independent inference calls. The OVO-Bench average is not a sample-level micro average: it first averages tasks within each of the three categories, then averages the three category scores. The evaluator prints those metrics for the current run without comparing them with a hard-coded reference result.

The upstream OVO-Bench score.py currently does not dispatch the model name Dispider. This helper therefore implements the same task scoring rules while also checking exact current-edition coverage and rejecting duplicate, missing, or null predictions.