И сравнивая его производительность с LayoutLMv2

Понимание документа — это первый и самый важный шаг в обработке и извлечении документа. Это процесс извлечения информации из неструктурированного или частично структурированного документа для преобразования ее в структурированную форму. Затем это структурированное представление можно использовать для поддержки различных последующих задач, таких как поиск информации, обобщение, классификация и т. д. Существует множество различных подходов к пониманию документов, но все они преследуют одну цель: создать структурированное представление содержимого документа, которое можно использовать для дальнейшей обработки.

Для полуструктурированных документов, таких как счета, квитанции или контракты, модель layoutLM от Microsoft показала большие перспективы с разработкой LayoutLM v1 и v2. Подробное руководство см. в двух моих предыдущих статьях Точная настройка модели Transformer для распознавания счетов и Точная настройка LayoutLM v2 для распознавания счетов.

В этом руководстве мы настроим последнюю версию LayoutLM v3 от Microsoft для счетов-фактур, аналогичных моим предыдущим руководствам, и сравним ее производительность с моделью layoutLM v2.

МакетЛМ v3

Основным преимуществом LayoutLM v3 по сравнению с предшественниками является мультимодальная архитектура преобразования, которая унифицированным образом сочетает встраивание текста и изображений. Вместо того, чтобы полагаться на CNN для встраивания изображения, изображение документа представляется в виде линейных проекций фрагментов изображения, которые затем линейно встраиваются и выравниваются с текстовыми маркерами, как показано ниже. Основным преимуществом этого подхода является сокращение необходимых параметров и общий объем вычислений.

Авторы показывают, что «LayoutLMv3 обеспечивает современную производительность не только в задачах, ориентированных на текст, включая понимание форм, понимание квитанций и визуальные ответы на вопросы документа, но также и в задачах, ориентированных на изображения, таких как классификация изображений документа и макет документа. анализ".

Тонкая настройка LayoutLM v3

Как и в моей предыдущей статье, мы будем использовать тот же набор данных из 220 аннотированных счетов-фактур для точной настройки модели layoutLM v3. Для выполнения аннотаций мы использовали Инструмент текстовых аннотаций UBIAI, поскольку он поддерживает синтаксический анализ OCR, собственные аннотации PDF/изображений и экспорт в правильный формат, совместимый с моделью LayoutLM, без необходимости какой-либо постобработки. Кроме того, вы можете тонко настроить модель LayouLM прямо на платформе UBIAI и автоматически пометить ею свои данные, что может сэкономить много времени на ручную аннотацию.

Вот отличный обзор того, как использовать инструмент для комментирования PDF-файлов и изображений:

После экспорта файла аннотации из UBIAI загружаем его в папку на гугл диске. Мы будем использовать Google Colab для обучения модели и вывода.

Доступ к сценарию обучения и вывода можно получить в коллаборации Google ниже:

Обучение:



Вывод:



  • Первый шаг — открыть Google Colab, подключить Google Drive и установить пакет Transformers из Huggingface. Обратите внимание, что мы не используем пакетDetectron 2 для точной настройки модели при извлечении сущностей, в отличие от layoutLMv2. Однако для обнаружения макета (за рамками этой статьи) понадобится пакетдетекторn 2:
from google.colab import drive
drive.mount('/content/drive')
!pip install -q git+https://github.com/huggingface/transformers.git
! pip install -q git+https://github.com/huggingface/datasets.git "dill<0.3.5" seqeval
  • Затем запустите скрипт preprocess.py для обработки ZIP-файла, экспортированного из UBIAI:
! rm -r layoutlmv3FineTuning
! git clone -b main https://github.com/UBIAI/layoutlmv3FineTuning.git
#!/bin/bash
IOB_DATA_PATH = "/content/drive/MyDrive/LayoutLM_data/Invoice_Project_mkWSi4Z.zip"
! cd /content/
! rm -r data
! mkdir data
! cp "$IOB_DATA_PATH" data/dataset.zip
! cd data && unzip -q dataset && rm dataset.zip
! cd ..
  • Запустите скрипт предварительной обработки:
#!/bin/bash
#preprocessing args
TEST_SIZE = 0.33
DATA_OUTPUT_PATH = "/content/"
! python3 layoutlmv3FineTuning/preprocess.py --valid_size $TEST_SIZE --output_path $DATA_OUTPUT_PATH
  • Загрузите постобработку набора данных:
from datasets import load_metric
from transformers import TrainingArguments, Trainer
from transformers import LayoutLMv3ForTokenClassification,AutoProcessor
from transformers.data.data_collator import default_data_collator
import torch
# load datasets
from datasets import load_from_disk
train_dataset = load_from_disk(f'/content/train_split')
eval_dataset = load_from_disk(f'/content/eval_split')
label_list = train_dataset.features["labels"].feature.names
num_labels = len(label_list)
label2id, id2label = dict(), dict()
for i, label in enumerate(label_list):
    label2id[label] = i
    id2label[i] = label
  • Определите несколько показателей для оценки:
metric = load_metric("seqeval")
import numpy as np
return_entity_level_metrics = False
def compute_metrics(p):
    predictions, labels = p
    predictions = np.argmax(predictions, axis=2)
# Remove ignored index (special tokens)
    true_predictions = [
        [label_list[p] for (p, l) in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels)
    ]
    true_labels = [
        [label_list[l] for (p, l) in zip(prediction, label) if l != -100]
        for prediction, label in zip(predictions, labels)
    ]
results = metric.compute(predictions=true_predictions, references=true_labels,zero_division='0')
    if return_entity_level_metrics:
        # Unpack nested dictionaries
        final_results = {}
        for key, value in results.items():
            if isinstance(value, dict):
                for n, v in value.items():
                    final_results[f"{key}_{n}"] = v
            else:
                final_results[key] = value
        return final_results
    else:
        return {
            "precision": results["overall_precision"],
            "recall": results["overall_recall"],
            "f1": results["overall_f1"],
            "accuracy": results["overall_accuracy"],
        }
  • Загрузите, обучите и оцените модель:
model = LayoutLMv3ForTokenClassification.from_pretrained("microsoft/layoutlmv3-base",
                                                         id2label=id2label,
                                                         label2id=label2id)
processor = AutoProcessor.from_pretrained("microsoft/layoutlmv3-base", apply_ocr=False)
NUM_TRAIN_EPOCHS = 50
PER_DEVICE_TRAIN_BATCH_SIZE = 1
PER_DEVICE_EVAL_BATCH_SIZE = 1
LEARNING_RATE = 4e-5
training_args = TrainingArguments(output_dir="test",
                                  # max_steps=1500,
                                  num_train_epochs=NUM_TRAIN_EPOCHS,
                                  logging_strategy="epoch",
                                  save_total_limit=1,
                                  per_device_train_batch_size=PER_DEVICE_TRAIN_BATCH_SIZE,
                                  per_device_eval_batch_size=PER_DEVICE_EVAL_BATCH_SIZE,
                                  learning_rate=LEARNING_RATE,
                                  evaluation_strategy="epoch",
                                  save_strategy="epoch",
                                  # eval_steps=100,
                                  load_best_model_at_end=True,
                                  metric_for_best_model="f1")
# Initialize our Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    tokenizer=processor,
    data_collator=default_data_collator,
    compute_metrics=compute_metrics,
)
trainer.train()
trainer.evaluate()

После завершения обучения выполняется оценка тестового набора данных. Ниже приведена оценка модели после оценки:

{'epoch': 50.0,
 'eval_accuracy': 0.9521988527724665,
 'eval_f1': 0.6913439635535308,
 'eval_loss': 0.41490793228149414,
 'eval_precision': 0.6362683438155137,
 'eval_recall': 0.756857855361596,
 'eval_runtime': 9.7501,
 'eval_samples_per_second': 9.846,
 'eval_steps_per_second': 9.846}

Модель смогла получить оценку F1 0,69, отзыв 0,75 и точность 0,63.

Давайте запустим модель на новом счете-фактуре, который не является частью обучающего набора данных.

Вывод с использованием LayoutLM v3

Чтобы запустить вывод, мы будем распознавать счет с помощью Tesseract и передавать информацию в нашу обученную модель для выполнения прогнозов. Чтобы упростить этот процесс, мы создали собственный сценарий с несколькими строками кода, который позволяет вам принимать выходные данные OCR и выполнять прогнозы с использованием модели.

  • Первый шаг, давайте импортируем несколько важных библиотек и загружаем модель:
#drive mount
from google.colab import drive
drive.mount('/content/drive')
## install Hugging face Transformers library to load Layoutlmv3 Preprocessor
!pip install -q git+https://github.com/huggingface/transformers.git
## install tesseract OCR Engine
! sudo apt install tesseract-ocr
! sudo apt install libtesseract-dev
## install pytesseract , please click restart runtime button in the cell output and move forward in the notebook
! pip install pytesseract
# ! rm -r layoutlmv3FineTuning
! git clone https://github.com/salmenhsairi/layoutlmv3FineTuning.git
import os
import torch
import warnings
from PIL import Image
warnings.filterwarnings('ignore')
# move all inference images from /content to 'images' folder
os.makedirs('/content/images',exist_ok=True)
for image in os.listdir():
  try:
    img = Image.open(f'{os.curdir}/{image}')
    os.system(f'mv "{image}" "images/{image}"')
  except:
    pass
# defining inference parameters
model_path = "/content/drive/MyDrive/LayoutLM_data/layoutlmv3.pth" # path to Layoutlmv3 model
imag_path = "/content/images" # images folder
# if inference model is pth then convert it to pre-trained format
if model_path.endswith('.pth'):
  layoutlmv3_model = torch.load(model_path)
  model_path = '/content/pre_trained_layoutlmv3'
  layoutlmv3_model.save_pretrained(model_path)
  • Теперь мы готовы запускать прогнозы с использованием модели.
# Call inference module
! python3 /content/layoutlmv3FineTuning/run_inference.py --model_path "$model_path" --images_path $imag_path

С 220 аннотированными счетами-фактурами модель смогла правильно предсказать имя продавца, даты, номер счета-фактуры и общую цену (TTC)!

Если мы посмотрим внимательно, мы заметим, что он допустил ошибку, считая общую стоимость ноутбука общей стоимостью счета. Учитывая оценку модели, это неудивительно и намекает на то, что требуется больше обучающих данных.

Сравнение LayoutLM v2 и LayoutLM v3

Помимо того, что он менее требователен к вычислительным ресурсам, обеспечивает ли layoutLM V3 прирост производительности по сравнению с аналогом v2? Чтобы ответить на этот вопрос, мы сравним выходные данные обеих моделей одного и того же счета-фактуры. Вот вывод layoutLM v2, как показано в моей предыдущей статье:

Мы наблюдаем несколько различий:

  • Модель v3 смогла правильно определить большинство ключей, тогда как v2 не смогла предсказать invoice_ID, Invoice number_ID и Total_ID.
  • Модель v2 неправильно пометила общую цену 1 445,00 долл. США как MONTANT_HT (означает общую цену до налогообложения на французском языке), тогда как v3 правильно предсказала общую цену.
  • Обе модели ошиблись, указав цену ноутбука как Total.

Основываясь на этом единственном примере, layoutLM V3 в целом показывает лучшую производительность, но нам нужно протестировать больший набор данных, чтобы подтвердить это наблюдение.

Заключение

Используя модели layoutLM с открытым исходным кодом, Microsoft лидирует на пути цифровой трансформации многих предприятий, включая цепочки поставок, здравоохранение, финансы, банковское дело и т. д.

В этом пошаговом руководстве мы показали, как точно настроить layoutLM V3 для конкретного варианта использования — извлечения данных счетов. Затем мы сравнили его производительность с layoutLM V2 и обнаружили небольшой прирост производительности, который все еще необходимо проверить на большом наборе данных.

Основываясь как на производительности, так и на вычислительных преимуществах, я настоятельно рекомендую использовать новую версию layoutLM v3.

Если вы заинтересованы в создании собственного обучающего набора данных наиболее эффективным и оптимизированным способом, не стесняйтесь попробовать функцию аннотации UBIAI OCR здесь бесплатно.

Следите за нами в Твиттере @UBIAI5 или подпишитесь здесь!