Serialize structured ground truth (chart data, table rows, form fields) as special-token-delimited sequences for generative vision-language model training
Scanned 9/12/2026
Install to Claude Code
npx -y skills add wenmin-wu/ds-skills --skill structured-gt-serialization-tokens --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Structured Gt Serialization Tokens?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/wenmin-wu-structured-gt-serialization-tokens)More formats (shields.io, HTML) on the badges page.
---
name: cv-structured-gt-serialization-tokens
description: Serialize structured ground truth (chart data, table rows, form fields) as special-token-delimited sequences for generative vision-language model training
---
# Structured GT Serialization with Special Tokens
## Overview
When training a generative vision model to extract structured data from images (charts, tables, forms), encode the ground truth as a flat token sequence using custom special tokens as delimiters. Add type tokens, separator tokens, and field boundary tokens to the tokenizer, then serialize each sample's annotations into a string the decoder can learn to produce.
## Quick Start
```python
from transformers import DonutProcessor
PROMPT_TOKEN = "<|PROMPT|>"
X_START, X_END = "<x_start>", "<x_end>"
Y_START, Y_END = "<y_start>", "<y_end>"
TYPE_TOKENS = ["<line>", "<bar>", "<scatter>", "<dot>"]
processor = DonutProcessor.from_pretrained("naver-clova-ix/donut-base")
processor.tokenizer.add_tokens([PROMPT_TOKEN, X_START, X_END, Y_START, Y_END] + TYPE_TOKENS)
def serialize_gt(chart_type, x_values, y_values):
type_token = f"<{chart_type}>"
x_str = X_START + ";".join(map(str, x_values)) + X_END
y_str = Y_START + ";".join(map(str, y_values)) + Y_END
return PROMPT_TOKEN + type_token + x_str + y_str
gt_string = serialize_gt("line", ["2020", "2021", "2022"], [10.5, 15.2, 20.1])
# "<|PROMPT|><line><x_start>2020;2021;2022<x_end><y_start>10.5;15.2;20.1<y_end>"
```
## Workflow
1. Define special tokens for structure boundaries and type labels
2. Add all special tokens to the tokenizer
3. Resize model token embeddings to match: `model.decoder.resize_token_embeddings(len(tokenizer))`
4. Serialize each training sample's annotations into the token format
5. At inference, parse the generated sequence by splitting on special tokens
## Key Decisions
- **Semicolon separator**: within fields, use `;` to delimit list items — avoids ambiguity with commas in numbers
- **Type token first**: placing the type token early lets the model condition all subsequent generation on chart type
- **Resize embeddings**: must call `resize_token_embeddings` after adding tokens
- **Parsing**: at inference, split on boundary tokens and handle missing delimiters gracefully
## References
- [donut-train [benetech]](https://www.kaggle.com/code/nbroad/donut-train-benetech)
- [donut-infer (LB 0.44) [benetech]](https://www.kaggle.com/code/nbroad/donut-infer-lb-0-44-benetech)
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!