И сравнивая его производительность с 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 или подпишитесь здесь!