|
|
import sys |
|
|
import os |
|
|
|
|
|
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) |
|
|
|
|
|
import torch |
|
|
from src.data_loader import load_unified_dataset |
|
|
from transformers import LayoutLMv3ForTokenClassification, LayoutLMv3Processor, DataCollatorForTokenClassification |
|
|
from torch.utils.data import DataLoader |
|
|
from seqeval.metrics import classification_report |
|
|
from tqdm import tqdm |
|
|
from train_combined import UnifiedDataset, label2id, id2label, LABEL_LIST |
|
|
|
|
|
|
|
|
model_path = "./models/layoutlmv3-generalized" |
|
|
model = LayoutLMv3ForTokenClassification.from_pretrained(model_path) |
|
|
processor = LayoutLMv3Processor.from_pretrained(model_path, apply_ocr=False) |
|
|
device = torch.device("cuda") |
|
|
model.to(device) |
|
|
|
|
|
|
|
|
|
|
|
print("Loading new dataset validation split...") |
|
|
val_data = load_unified_dataset(split="valid", sample_size=None) |
|
|
dataset = UnifiedDataset(val_data, processor, label2id) |
|
|
loader = DataLoader(dataset, batch_size=4, collate_fn=DataCollatorForTokenClassification(processor.tokenizer, padding=True, return_tensors="pt")) |
|
|
|
|
|
print("Running evaluation...") |
|
|
model.eval() |
|
|
preds, labs = [], [] |
|
|
|
|
|
for batch in tqdm(loader): |
|
|
batch = {k: v.to(device) for k, v in batch.items()} |
|
|
with torch.no_grad(): |
|
|
outputs = model(**batch) |
|
|
|
|
|
predictions = outputs.logits.argmax(dim=-1) |
|
|
labels = batch['labels'] |
|
|
|
|
|
for i in range(len(labels)): |
|
|
p = [id2label[p.item()] for p, l in zip(predictions[i], labels[i]) if l.item() != -100] |
|
|
l = [id2label[l.item()] for l in labels[i] if l.item() != -100] |
|
|
preds.append(p) |
|
|
labs.append(l) |
|
|
|
|
|
print("\nClassification Report:") |
|
|
print(classification_report(labs, preds)) |