0
stars
5
commits
1
linked in READMEs
Jul 30, 2026
updated
Fine-tune de datalab-to/surya-ocr-2
pour la transcription exacte de bulles de manga francophones recadrées.
Ce modèle transcrit une bulle à la fois ; il ne détecte pas les bulles et ne
renvoie pas de bounding boxes.
Entraînement local sur une NVIDIA RTX 3090. Le split est effectué par page : aucune page source n'est partagée entre train, validation et test.
| Split | Pages | Bulles |
|---|---|---|
| Train | 749 | 6 793 |
| Validation | 161 | 1 311 |
| Test held-out | 161 | 1 423 |
Benchmark final exhaustif sur les 1 423 bulles du test held-out :
| Métrique | Résultat |
|---|---|
| CER | 0,451 % |
| WER | 1,656 % |
| Exact match | 90,65 % |
| Levenshtein moyen | 0,1595 caractère |
| Sorties vides | 0 / 1 423 |
| Hallucinations sur références vides | 0 |
| Limite de génération atteinte | 0 / 1 423 |
Les textes très courts de 1 à 2 caractères atteignent 100 % d'exact match sur 98 exemples. Les erreurs restantes se concentrent principalement sur les onomatopées ambiguës, la casse et les répétitions de rires.
Le fichier benchmark_test.json contient les métriques,
les tranches par longueur et les prédictions de chaque échantillon.
import torch
from PIL import Image
from transformers import AutoModelForImageTextToText, AutoProcessor
model_id = "Remidesbois/surya-bubble-ocr-poneglyph"
processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)
model = AutoModelForImageTextToText.from_pretrained(
model_id,
dtype=torch.bfloat16,
device_map="cuda",
trust_remote_code=True,
).eval()
image = Image.open("bulle.png").convert("RGB")
messages = [{
"role": "user",
"content": [
{"type": "image", "image": "bulle.png"},
{
"type": "text",
"text": "Transcris exactement le texte visible dans cette bulle. Ne rajoute rien.",
},
],
}]
prompt = processor.apply_chat_template(
messages,
add_generation_prompt=True,
tokenize=False,
)
inputs = processor(text=[prompt], images=[image], return_tensors="pt").to("cuda")
with torch.inference_mode():
output_ids = model.generate(
**inputs,
max_new_tokens=256,
do_sample=False,
)
prompt_tokens = inputs["input_ids"].shape[1]
text = processor.batch_decode(
output_ids[:, prompt_tokens:],
skip_special_tokens=True,
)[0].strip()
print(text)
Le pipeline reproductible se trouve dans le dossier
docker_scripts/finetune_surya_bubble_ocr du projet Poneglyph.
openrail est héritée du modèle de base.5 commits
0
stars
5
commits
1
linked in READMEs
Jul 30, 2026
updated
Fine-tune de datalab-to/surya-ocr-2
pour la transcription exacte de bulles de manga francophones recadrées.
Ce modèle transcrit une bulle à la fois ; il ne détecte pas les bulles et ne
renvoie pas de bounding boxes.
Entraînement local sur une NVIDIA RTX 3090. Le split est effectué par page : aucune page source n'est partagée entre train, validation et test.
| Split | Pages | Bulles |
|---|---|---|
| Train | 749 | 6 793 |
| Validation | 161 | 1 311 |
| Test held-out | 161 | 1 423 |
Benchmark final exhaustif sur les 1 423 bulles du test held-out :
| Métrique | Résultat |
|---|---|
| CER | 0,451 % |
| WER | 1,656 % |
| Exact match | 90,65 % |
| Levenshtein moyen | 0,1595 caractère |
| Sorties vides | 0 / 1 423 |
| Hallucinations sur références vides | 0 |
| Limite de génération atteinte | 0 / 1 423 |
Les textes très courts de 1 à 2 caractères atteignent 100 % d'exact match sur 98 exemples. Les erreurs restantes se concentrent principalement sur les onomatopées ambiguës, la casse et les répétitions de rires.
Le fichier benchmark_test.json contient les métriques,
les tranches par longueur et les prédictions de chaque échantillon.
import torch
from PIL import Image
from transformers import AutoModelForImageTextToText, AutoProcessor
model_id = "Remidesbois/surya-bubble-ocr-poneglyph"
processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)
model = AutoModelForImageTextToText.from_pretrained(
model_id,
dtype=torch.bfloat16,
device_map="cuda",
trust_remote_code=True,
).eval()
image = Image.open("bulle.png").convert("RGB")
messages = [{
"role": "user",
"content": [
{"type": "image", "image": "bulle.png"},
{
"type": "text",
"text": "Transcris exactement le texte visible dans cette bulle. Ne rajoute rien.",
},
],
}]
prompt = processor.apply_chat_template(
messages,
add_generation_prompt=True,
tokenize=False,
)
inputs = processor(text=[prompt], images=[image], return_tensors="pt").to("cuda")
with torch.inference_mode():
output_ids = model.generate(
**inputs,
max_new_tokens=256,
do_sample=False,
)
prompt_tokens = inputs["input_ids"].shape[1]
text = processor.batch_decode(
output_ids[:, prompt_tokens:],
skip_special_tokens=True,
)[0].strip()
print(text)
Le pipeline reproductible se trouve dans le dossier
docker_scripts/finetune_surya_bubble_ocr du projet Poneglyph.
openrail est héritée du modèle de base.5 commits