YELY_AI_Module / train /prepare_doctr_dataset.py
danielxdata's picture
Module IA YELY - CRNN fine-tune, API FastAPI, interface demo
b510add
Raw
History Blame Contribute Delete
2.95 kB
"""
prepare_doctr_dataset.py
-------------------------
Convertit dataset_lines/ vers le format doctr :
dataset_doctr/
train/images/ + labels.json
val/images/ + labels.json
Copie de référence pour la reproductibilité (documentation technique) —
attend l'arborescence annotator/ du dépôt d'origine, non incluse ici.
Doit être lancé depuis le dossier train/ du dépôt d'origine :
cd train/
python prepare_doctr_dataset.py
"""
import os
import json
import shutil
from pathlib import Path
# Chemins depuis train/ → annotator/
SOURCE_DIR = os.path.join("..", "annotator", "dataset_lines")
TARGET_DIR = os.path.join("..", "annotator", "dataset_doctr")
def convert_split(split: str) -> int:
src_images = os.path.join(SOURCE_DIR, split, "images")
src_labels = os.path.join(SOURCE_DIR, split, "labels")
dst_images = os.path.join(TARGET_DIR, split, "images")
os.makedirs(dst_images, exist_ok=True)
if not os.path.isdir(src_images):
print(f" ⚠️ Introuvable : {src_images}")
return 0
labels_dict = {}
n_ok = n_skip = 0
for img_file in sorted(os.listdir(src_images)):
if not img_file.lower().endswith((".jpg", ".jpeg", ".png")):
continue
stem = Path(img_file).stem
lbl_f = os.path.join(src_labels, f"{stem}.txt")
if not os.path.exists(lbl_f):
n_skip += 1
continue
text = open(lbl_f, encoding="utf-8").read().strip()
if not text:
n_skip += 1
continue
shutil.copy2(os.path.join(src_images, img_file),
os.path.join(dst_images, img_file))
labels_dict[img_file] = text
n_ok += 1
out = os.path.join(TARGET_DIR, split, "labels.json")
with open(out, "w", encoding="utf-8") as f:
json.dump(labels_dict, f, indent=2, ensure_ascii=False)
print(f" {split:6s} : {n_ok} images, {n_skip} ignorées → {out}")
return n_ok
def show_vocab():
chars = set()
for split in ("train", "val"):
p = os.path.join(TARGET_DIR, split, "labels.json")
if os.path.exists(p):
for txt in json.load(open(p)).values():
chars.update(txt)
print(f"\n Vocabulaire ({len(chars)} chars) : {''.join(sorted(chars))}")
print(f" → Le vocab doctr 'french' couvre tous ces caractères ✅")
if __name__ == "__main__":
if not os.path.isdir(SOURCE_DIR):
print(f"❌ Introuvable : {SOURCE_DIR}")
print(f" Lance d'abord depuis annotator/ : python split_lines.py")
raise SystemExit(1)
print(f"🔄 Conversion {SOURCE_DIR} → {TARGET_DIR}\n")
n_train = convert_split("train")
n_val = convert_split("val")
show_vocab()
print(f"\n✅ {n_train} train + {n_val} val prêts pour le fine-tuning")
print(f"\n👉 Prochaine étape :")
print(f" pip install python-doctr[torch]")
print(f" python finetune_doctr.py")