Instructions to use void-2024/PosterCopilot with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use void-2024/PosterCopilot with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="void-2024/PosterCopilot") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("void-2024/PosterCopilot") model = AutoModelForMultimodalLM.from_pretrained("void-2024/PosterCopilot", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=40) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use void-2024/PosterCopilot with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "void-2024/PosterCopilot" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "void-2024/PosterCopilot", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/void-2024/PosterCopilot
- SGLang
How to use void-2024/PosterCopilot with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "void-2024/PosterCopilot" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "void-2024/PosterCopilot", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "void-2024/PosterCopilot" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "void-2024/PosterCopilot", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use void-2024/PosterCopilot with Docker Model Runner:
docker model run hf.co/void-2024/PosterCopilot
# Load model directly
from transformers import AutoProcessor, AutoModelForMultimodalLM
processor = AutoProcessor.from_pretrained("void-2024/PosterCopilot")
model = AutoModelForMultimodalLM.from_pretrained("void-2024/PosterCopilot", device_map="auto")
messages = [
{
"role": "user",
"content": [
{"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"},
{"type": "text", "text": "What animal is on the candy?"}
]
},
]
inputs = processor.apply_chat_template(
messages,
add_generation_prompt=True,
tokenize=True,
return_dict=True,
return_tensors="pt",
).to(model.device)
outputs = model.generate(**inputs, max_new_tokens=40)
print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:]))PosterCopilot-7B
Layout reasoning for professional graphic design. Give the model a set of layer assets and a canvas size; it returns the poster layout as JSON โ a bounding box and stacking order for every layer.
Accepted to ECCV 2026.
๐ Paper ยท ๐ Project Page ยท ๐ป Code ยท โถ๏ธ Video
Model details
| Base model | Qwen/Qwen2.5-VL-7B-Instruct |
| Parameters | 7B (bfloat16, ~15.5 GiB) |
| Input | 2โ25 RGB layer assets + target canvas size + optional design brief |
| Output | One JSON object: canvas_size + per-layer x, y, w, h, order, category |
| Training | Perturbed SFT โ RL for visual-reality alignment โ RL from aesthetic feedback |
Usage
This checkpoint expects a specific image preprocessing pipeline โ each layer is flattened onto an auto-selected contrasting background, scaled to a 28-pixel aligned canvas, and letterboxed with grey. Use the reference implementation rather than feeding raw images:
git clone https://github.com/JiazheWei/PosterCopilot.git
cd PosterCopilot
conda env create -f environment.yml && conda activate postercopilot
python infer.py --model <path-to-this-checkpoint> \
--assets ./my_layers --width 1200 --height 1600 -o layout.json
python render.py --layout layout.json --assets ./my_layers -o poster.png
The repository also contains the renderer that composites the predicted layout and the original layers into the finished poster (PNG or editable PSD).
Prompt format
The model was trained with a fixed system prompt and this user turn:
Please process the following {N} RGB PNG layer assets and compose a single,
aesthetically pleasing poster. The canvas size is {W} x {H} (width x height).
optionally followed by Structure Requirements: {brief}. Both strings live in
postercopilot/prompts.py in the code repository; paraphrasing them moves the
input off the training distribution.
Notes
- Decoding is greedy with
repetition_penalty=1.05. Coordinates are emitted digit by digit, so a single flipped digit re-rolls the rest of the layout โ expect different-but-comparable results across GPUs, dtypes and attention kernels. Evaluate over a set of samples rather than one generation. - Requires ~20 GB of free VRAM in bfloat16.
transformers>=4.55โ the config uses the nestedtext_configschema that older releases predate.
Citation
@article{wei2025postercopilot,
title={PosterCopilot: Toward Layout Reasoning and Controllable Editing for Professional Graphic Design},
author={Wei, Jiazhe and Li, Ken and Lao, Tianyu and Wang, Haofan and Wang, Liang and Shan, Caifeng and Si, Chenyang},
journal={arXiv preprint arXiv:2512.04082},
year={2025}
}
License
Apache 2.0, inherited from the Qwen2.5-VL-7B-Instruct base model.
- Downloads last month
- -
Model tree for void-2024/PosterCopilot
Base model
Qwen/Qwen2.5-VL-7B-Instruct
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="void-2024/PosterCopilot") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)