# [CVPR 2026] ViStoryBench: A Comprehensive Benchmark Suite for Story Visualization

ViStoryBench introduces a comprehensive and diverse benchmark for story visualization, enabling thorough evaluation of models across narrative complexity, character consistency, and visual style.
https://github.com/user-attachments/assets/19b17deb-416a-400a-b071-df21ba58f4b7 ## π© Latest Updates - [ ] **[now]** π Ongoing leaderboard maintenance and evaluation of new story visualization methods. - [x] **[2026/02/21]** π₯ CVPR 2026 accepted! See you in Denver! - [x] **[2025.12.19]** π arXiv v4 is now available, more recent models are evaluated, including NanoBanana-Pro. - [x] **[2025.08.19]** π οΈ Major code v1 update: Full benchmark implementation released. - [x] **[2025.08.12]** π arXiv v3 is now available. - [x] **[2025.06.25]** π arXiv v2 has been published. - [x] **[2025.05.30]** π Technical report v1 released on arXiv. - [x] **[2025.05.21]** π Initial project launch and code release. ## ποΈ Architecture & Contribution ViStoryBench is designed with a modular and extensible architecture. The core of our evaluation pipeline is the `BaseEvaluator` abstract class, which allows for easy integration of new evaluation metrics. **Adding a New Evaluator:** 1. Create a new class that inherits from `vistorybench.bench.base_evaluator.BaseEvaluator`. 2. Implement the required methods (`__init__`, `evaluate`). 3. Register your new evaluator in `vistorybench/bench_run.py`. We welcome contributions from the community! If you have a new metric or an improvement, please feel free to submit a pull request. ## π οΈ Setup ### Download ```bash git clone --recursive https://github.com/ViStoryBench/vistorybench.git cd vistorybench ``` ### Environment ```bash conda create -n vistorybench python=3.11 conda activate vistorybench # for cuda 12.4 conda install pytorch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 pytorch-cuda=12.4 -c pytorch -c nvidia # for cuda 12.1 pip install torch==2.2.1 torchvision==0.17.1 torchaudio==2.2.1 --index-url https://download.pytorch.org/whl/cu121 # for cuda 11.8 pip install torch==2.2.1 torchvision==0.17.1 torchaudio==2.2.1 --index-url https://download.pytorch.org/whl/cu118 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn ``` Choose the torch version that suits you on this website: https://pytorch.org/get-started/previous-versions/ ## π Usage ## 1. Dataset Preparationπ» ### 1.1. About ViStory Dataset  > **80** stories and **344** characters, both *Chinese* and *English*, > >Each story included **Plot Correspondence**, **Setting Description**, **Shot Perspective Design**, **On-Stage Characters** and **Static Shot Description** > >Each character included at least one **inference image** and corresponding **prompt description**. ### 1.2. Dataset Downloading... We provide an automated dataset download script that allows you to download full ViStory Dataset with a single command: ```bash cd ViStoryBench sh download_dataset.sh ``` Alternatively, you can download it by following these steps: π₯ Download our [ViStory Datasets](https://huggingface.co/datasets/ViStoryBench/ViStoryBench) (π€huggingface) and save it in `data/dataset`. * If you use a custom path, please full `dataset_path` in `vistorybench/config.yaml`. After the download is complete, please rename the `ββViStoryBenchβ`β folder to ββ`ViStoryβ`β. Folder structure of **ViStory Datasets**: ``` data/dataset/ βββ ViStory/ # rename βββViStoryBenchβββ to βββViStoryββ β βββ 01/ β β βββ image/ β β β βββ Big Brown Rabbit/ β β β βββ 00.jpg β β β βββ ... β β βββ story.json β βββ 02/ β βββ ... βββ ... ``` ## 2. Inference on ViStory Dataset ### 2.1. Dataset Loading Use our standardized loading script `dataset_load.py` or your own data loader. Run this command to verify successful dataset loading: ```bash python vistorybench/dataset_loader/dataset_load.py ``` ### 2.2. Dataset Adapting > Aligning the dataset format with the specified method's input requirements. Pre-built dataset conversion scripts are available for several pre-defined methods, all located in `vistorybench/dataset_loader`. `adapt_base.py` is a template script for dataset conversion. All pre-built dataset conversion scripts are created based on this template. - `adapt_base.py` - `adapt2animdirector.py` - `adapt2seedstory.py`, - `adapt2storyadapter.py`, - `adapt2storydiffusion.py`, - `adapt2storygen.py`, - `adapt2uno.py`, - `adapt2vlogger.py`, **Example of UNO:** ```bash python vistorybench/dataset_loader/adapt2uno.py \ --language 'en' # choice=['en','ch'] ``` You can create a script to convert the ViStory/ViStory-lite dataset into your method's required input format (Based on template script `adapt_base.py`). * The converted dataset will be saved to `data/dataset_processed`. * If you use a custom path, please full `processed_dataset_path` in `vistorybench/config.yaml` ### 2.3. Inference custom Pre-modify inference scripts of several pre-defined methods are available for reference, all located in `vistorybench/data_process/inference_custom`. - `movieagent/run_custom.py` - `seedstory/vis_custom_sink.py` - `storyadapter/run_custom.py` - `storydiffusion/gradio_app_sdxl_specific_id_low_vram_custom.py` - `storygen/inference_custom_mix.py` - `storygen/inference_custom.py` - `uno/inference_custom.py` - `vlogger/vlog_read_script_sample_custom.py` You can modify your method's story visualization inference scripts according to the specified requirements. * We suggest saving generated results to `data/outputs`. * If you use a custom path, please full `outputs_path` in `vistorybench/config.yaml` > **SD Embed**. Our ViStory Dataset contains extensive complex text descriptions. However, not all models support long-text inputs. To overcome the 77-token prompt limitation in Stable Diffusion, we utilize [sd_embed](https://github.com/xhinker/sd_embed) to generate long-weighted prompt embeddings for lengthy text. ## 3. Generated-Results Reading ### 3.1 Output Structure Make sure your generated results are organized according to the following folder structure: ``` data/outputs/ βββ method_name/ β βββ mode_name/ β βββ language_name/ β βββ timestamp/ β βββ shots/ β βββ story_id/ β β βββ shot_XX.png β β βββ ... β βββ 02/ β βββ ... βββ method_2/ βββ ... ``` - `method_name`: The model used (e.g., StoryDiffusion, UNO, GPT4o, etc.) - `mode_name`: The mode used of method(e.g., base, SD3, etc.) - `language_name`: The language used (e.g., en, ch) - `timestamp`: Generation run timestamp (YYYYMMDD_HHMMSS) (e.g., 20250000_111111) - `story_id`: The story identifier (e.g., 01, 02, etc.) - `shot_XX.jpg`: Generated image for the shot **Example of UNO:** ``` data/outputs/ βββ uno/ β βββ base/ β βββ en/ β βββ 20250000-111111/ β βββ shots/ β βββ 01/ β β βββ 00.png β β βββ ... β βββ 02/ β βββ ... βββ method_2/ βββ ... ``` **Example of your method:** ``` data/outputs/ βββ method_1/ β βββ mode_1/ β βββ language_1/ β βββ 20250000-111111/ β βββ 01/ β β βββ shots β β βββ 00.png β β βββ ... β βββ 02/ β βββ ... βββ method_2/ βββ ... ``` ### 3.2 Automated Reading When you run the evaluation code, it will automatically perform data reading (ensure both the ViStoryBench dataset and the generated results conform to the standard directory structure specified above). The generated-results reading code has been uniformly integrated into the following file: `vistorybench/dataset_loader/read_outputs.py` ## 4. Evaluation & Analysis πΊ ### 4.1 Download Weights We provide an automated pretrain-weight download script that allows you to download all the following weights with a single command. ```bash sh download_weights.sh ``` * All of them will be saved in `data/pretrain`. * If you use a custom path, please full `pretrain_path` in `vistorybench/config.yaml`. Alternatively, you can download them separately by following these steps: --- #### For `CIDS Score` and `Prompt Align Score`: * **a. GroundingDINO weights**. Download `groundingdino_swint_ogc.pth` weights from [here](https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth). Save it in the `data/pretrain/groundingdino/weights` folder (Please create it in advance). * **b. InsightFace antelopev2**. Download `antelopev2.zip` from [here](https://github.com/deepinsight/insightface/releases/tag/v0.7). Unzip it and save them in the `data/pretrain/insightface/models/antelopev2` folder (Please create it in advance). * **c. SigLIP weights**. Download [siglip-so400m-patch14-384](https://huggingface.co/google/siglip-so400m-patch14-384) π€ weights. Save them in the `/data/pretrain/google/siglip-so400m-patch14-384` folder (Please create it in advance). * **d. BERT weights**. Download [bert-base-uncased](https://huggingface.co/google-bert/bert-base-uncased) π€ weights. Save them in the `data/pretrain/google-bert/bert-base-uncased` folder (Please create it in advance). * **e. AdaFace weights**. Download `adaface_ir101_webface12m.ckpt` weights from [here](https://drive.google.com/file/d/1dswnavflETcnAuplZj1IOKKP0eM8ITgT/view). Save it in the `/data/pretrain/adaface` folder (Please create it in advance). * **f. Facenet vggface2**. Download `vggface2` automatically during initial execution. * **g. Facexlib weights**. Download `detection_Resnet50_Final.pth` from [here](https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth) to `.../facexlib/weights/detection_Resnet50_Final.pth` and `parsing_parsenet.pth` from [here](https://github.com/xinntao/facexlib/releases/download/v0.2.2/parsing_parsenet.pth) to `.../facexlib/weights/parsing_parsenet.pth` automatically during initial execution. --- #### For `CSD Score`: * **CSD weights**. Download `csd_vit-large.pth` weights from [here](https://drive.google.com/file/d/1SETgjkj6oUIbjgwxgtXw2I2t4quRzG-3/view?usp=drive_link). Save it in the `/data/pretrain/csd` folder (Please create it in advance). --- #### For `Aesthetic Score`: * **Aesthetic predictor weights**. Download `aesthetic_predictor_v2_5.pth` weights from [here](https://github.com/discus0434/aesthetic-predictor-v2-5/raw/main/models/aesthetic_predictor_v2_5.pth). Save it in the `/data/pretrain/aesthetic_predictor` folder (Please create it in advance). --- #### For `Inception Score` * **Inception weights**. Download `inception_v3_google-0cc3c7bd.pth` automatically during initial execution. --- ### 4.2. Running Evaluation Navigate to the source code directory: ```bash cd vistorybench ``` **Example Command:** ```bash # Run all available metrics for the 'uno' method in English python bench_run.py --method uno --language en # Run only the CIDS and CSD metrics for 'uno' python bench_run.py --method uno --metrics cids csd --language en # Run all metrics for a specific timestamp python bench_run.py --method uno --language en --timestamp 20250824_141800 ``` #### βοΈ Key Parameters: - `--method` (Required): Specify the method (model) to evaluate (e.g., `uno`, `storydiffusion`). - `--metrics` (Optional): A space-separated list of metrics to run (e.g., `cids`, `csd`, `aesthetic`). If omitted, all registered evaluators will be executed. - `--language` (Required): The language of the dataset to evaluate (`en` or `ch`). - `--timestamp` (Optional): Specify a particular generation run to evaluate. If omitted, the latest run will be used. - `--mode` (Optional): Mode name for the method (e.g., `base`). Used to locate outputs under `outputs/