layoutlmv3-cord-v2

microsoft/layoutlmv3-base yang di-fine-tune untuk token classification (BIO) pada CORD-v2 — ekstraksi informasi kunci dari struk belanja (nama item, qty, harga satuan, subtotal, pajak, diskon, total, dll).

Dipakai oleh layanan Klissh/managemymoney-scan-struk untuk fitur scan struk + split per item pada aplikasi managemymoney.

Ringkas

Arsitektur LayoutLMv3ForTokenClassification
Base microsoft/layoutlmv3-base
Dataset CORD-v2 (train 800 / val 100 / test 100)
Jumlah label 55 (skema BIO, termasuk O)
Bahasa Inggris (dataset) + dipakai untuk struk Indonesia
OCR saat inferensi EasyOCR (apply_ocr=False — bbox & teks dari luar)

Metodologi (untuk laporan)

  • Test split disisihkan total — hanya dipakai satu kali di akhir untuk angka resmi. Validasi hanya untuk load_best_model_at_end (metric_for_best_model="f1").
  • Kosakata label dibangun dari gabungan train + validation + test.
  • Deduplikasi image-hash lintas ketiga split (duplikat dibuang dari split non-train).
  • Metrik entity-level BIO (precision/recall/F1 span), implementasi manual tanpa seqeval.
  • learning_rate=1e-5, epochs=10, batch=2, fp16, seed=42.

Isi angka F1/precision/recall test-split di sini dari test_results.json setelah training (mis. F1 test = 0.xx).

Catatan keterbatasan

Seluruh data CORD-v2 berasal dari valid_line yang teranotasi sebagai entitas, sehingga tidak ada contoh training murni untuk kelas O (bukan-entitas). Pada struk nyata, teks non-entitas (footer, NPWP, nomor telepon) berpotensi salah label. Ini keterbatasan sumber data, bukan pipeline.

Pemakaian

from transformers import LayoutLMv3ForTokenClassification, LayoutLMv3Processor
from PIL import Image

model = LayoutLMv3ForTokenClassification.from_pretrained("Klissh/layoutlmv3-cord-v2")
processor = LayoutLMv3Processor.from_pretrained("Klissh/layoutlmv3-cord-v2", apply_ocr=False)

image = Image.open("struk.jpg").convert("RGB")
words = ["Indomie", "Goreng", "3", "10.500"]           # dari EasyOCR
boxes = [[70, 120, 210, 140], [215, 120, 330, 140],    # dinormalisasi 0..1000
         [800, 120, 830, 140], [880, 120, 960, 140]]

enc = processor(image, words, boxes=boxes, return_tensors="pt",
                truncation=True, padding="max_length", max_length=512)
pred = model(**enc).logits.argmax(-1)[0].tolist()

Model dilatih di Kaggle; notebook lengkap ada di repo aplikasi (notebooks/layoutlmv3-cord-v2-finetuning.ipynb).

Downloads last month
-
Safetensors
Model size
0.1B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for Klissh/layoutlmv3-cord-v2

Finetuned
(310)
this model

Dataset used to train Klissh/layoutlmv3-cord-v2