LayoutLMv3 para extraccion de campos en documentos de negocio

LayoutLMv3ForTokenClassification afinado para extraer campos de cabecera de facturas, ordenes de compra y certificados de analisis escaneados.

Espacio de etiquetas

39 clases BIO sobre 19 entidades semanticas compartidas entre tipos de documento (DOC_NUMBER, DOC_DATE, PARTY_NAME, TOTAL_AMOUNT, LOT_NUMBER, EXPIRY_DATE, RESULT_STATUS...). El mapeo de entidad a nombre de campo depende del tipo de documento y lo resuelve el decodificador: DOC_NUMBER es invoice_number en una factura y po_number en una orden de compra.

Compartir entidades entre tipos fue deliberado: 33 campos por BIO serian 67 clases con unas decenas de ejemplos cada una.

Datos de entrenamiento

929 documentos sinteticos generados con ReportLab y Faker, con degradacion que simula escaneo (rotacion, ruido, desenfoque, artefactos JPEG, sombra). Tres familias de plantilla. Las etiquetas se derivaron alineando el ground truth del generador contra los tokens del OCR, y los documentos cuyo etiquetado quedo dudoso se excluyeron en vez de marcarse como O.

No se uso ningun documento real de ninguna empresa.

Resultados y limitacion principal

Conjunto token-F1 Field exact-match end-to-end
Plantilla vista en entrenamiento 96.5 0.920
Plantilla nueva (dev) 68.1 0.522
Plantilla nueva (test) 72.5 0.508

El modelo memoriza layout. Con tres familias de plantilla en entrenamiento, aprender la posicion de un campo en la pagina sale mas barato que aprender su relacion con la etiqueta que lo precede. Sobre una plantilla nueva queda por debajo de un extractor por reglas bien construido (0.580).

No usar en produccion sin entrenar con muchas mas variedades de layout. La cifra de 0.920 solo aplica a plantillas que el modelo ya vio.

Uso

from transformers import LayoutLMv3ForTokenClassification, LayoutLMv3Processor
from transformers import LayoutLMv3ImageProcessor, LayoutLMv3TokenizerFast

model = LayoutLMv3ForTokenClassification.from_pretrained("FranJCastilloC/layoutlmv3-docint-extraction")
processor = LayoutLMv3Processor(
    image_processor=LayoutLMv3ImageProcessor(apply_ocr=False),
    tokenizer=LayoutLMv3TokenizerFast.from_pretrained("microsoft/layoutlmv3-base"),
)

apply_ocr=False es obligatorio: el modelo espera las palabras y las cajas del OCR propio, con las cajas normalizadas al rango 0-1000.

Codigo completo: https://github.com/FranJCastilloC/Clasificaci-n-y-extracci-n-OCR-de-documentos

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