Обнаружение строк и столбцов таблиц на изображениях с использованием трансформеров

Обнаружение строк и столбцов таблиц на изображениях с использованием трансформеров' can be condensed as Обнаружение таблиц на изображениях с помощью трансформеров

Введение

Вы когда-нибудь работали с неструктурированными данными и задумывались о способе обнаружения таблиц в вашем документе? Чтобы помочь вам быстро обрабатывать ваши документы? В этой статье мы рассмотрим не только обнаружение таблиц, но и распознавание структуры этих таблиц через изображения с использованием трансформеров. Это будет возможно благодаря двум отдельным моделям. Одна – для обнаружения таблиц в документах, а вторая – для распознавания структуры, распознающая отдельные строки и столбцы в таблице.

Цели обучения

  • Как обнаружить строки и столбцы таблиц на изображениях?
  • Обзор Table Transformers и Detection Transformer (DETR)
  • О наборе данных PubTables-1M
  • Как выполнять вывод с помощью Table Transformer

Документы, статьи и файлы PDF являются ценными источниками информации, часто содержащими таблицы, передающие важные данные. Эффективное извлечение информации из этих таблиц может быть сложным из-за сложностей различных форматирований и представлений. Копирование или повторное создание этих таблиц вручную может занимать много времени и вызывать стресс. Table transformers, обученные на наборе данных PubTables-1M, решают проблему обнаружения таблиц, распознавания структуры и функционального анализа.

Эта статья была опубликована в рамках Data Science Blogathon.

Как это было сделано?

Это стало возможным благодаря модели трансформера, известной как Table Transformer. Она использует новый подход для обнаружения документов или изображений, например, в статьях, с использованием большого аннотированного набора данных под названием PubTables-1M. Этот набор данных содержит около миллиона параметров и был реализован с использованием некоторых мер, придавая модели современный вид. Эффективность была достигнута путем решения проблем недостаточно точных аннотаций, проблем пространственного выравнивания и согласованности структуры таблицы. В исследовательской статье, опубликованной с моделью, использовалась модель Detection Transformer (DETR) для совместного моделирования распознавания структуры таблицы (TSR) и функционального анализа (FA). Таким образом, модель DETR является основой, на которой работает Table Transformer, разработанный Microsoft Research. Давайте рассмотрим DETR немного подробнее.

DEtection TRansformer (DETR)

Как уже упоминалось ранее, DETR – это сокращение от DEtection TRansformer и состоит из сверточной основы, такой как архитектура ResNet, с использованием кодировщика-декодера Transformer. Это дает ему потенциал для выполнения задач обнаружения объектов. DETR предлагает подход, не требующий сложных моделей, таких как Faster R-CNN и Mask R-CNN, которые зависят от сложных элементов, таких как предложения о регионе, не-максимальное подавление и генерация якорей. Он может быть обучен end-to-end, благодаря своей функции потерь, известной как потеря бипартитного сопоставления. Все это было использовано в экспериментах на наборе данных PubTables-1M и важности канонических данных для улучшения производительности.

Набор данных PubTables-1M

PubTables-1M является вкладом в область извлечения таблиц. Он составлен из коллекции таблиц, полученных из научных статей. Этот набор данных поддерживает форматы ввода и включает подробную информацию о заголовках и местоположении для стратегий моделирования таблиц, что делает его очень хорошим. Особенностью PubTables-1M является его фокус на устранение несогласованности истинных значений, возникающей из-за избыточной сегментации, что повышает точность аннотаций.

Источник: Smock et al. (2021)

Эксперимент по обучению Table Transformer, проведенный с использованием PubTables-1M, показал эффективность набора данных. Как уже отмечалось, модель обнаружения объектов на основе трансформера, особенно модель DETR, проявляет исключительную производительность в задачах обнаружения таблиц, распознавания структуры и функционального анализа. Результаты подчеркивают эффективность канонических данных в улучшении точности и надежности модели.

Каноникализация набора данных PubTables-1M

Ключевым аспектом PubTables-1M является инновационный процесс каноникализации. Он решает проблему избыточной сегментации в аннотациях истинных значений, которая может привести к неоднозначности. Путем делания предположений о структуре таблицы алгоритм каноникализации корректирует аннотации, выравнивая их с логической организацией таблицы. Это повышает надежность набора данных и влияет на производительность.

Реализация инференса с помощью таблицы-трансформера

Мы реализуем инференс с помощью таблицы-трансформера. Сначала мы устанавливаем библиотеку transformers из репозитория Hugging Face. Полный код для этой статьи можно найти здесь. или https://github.com/inuwamobarak/detecting-tables-in-documents

!pip install -q git+https://github.com/huggingface/transformers.git

Затем мы устанавливаем ‘timm’, популярную библиотеку для моделей, процедур обучения и вспомогательных инструментов.

# Установка библиотеки 'timm' с помощью pip
!pip install -q timm

Затем мы можем загрузить изображение, на котором хотим выполнить инференс. Я добавил набор данных из моего репозитория Huggingface. Вы можете использовать его или адаптировать его под свои данные. Ниже я предоставил ссылку на репозиторий GitHub для этого кода и другие оригинальные ссылки.

# Импорт необходимых библиотек
from huggingface_hub import hf_hub_download
from PIL import Image

# Загрузка файла из указанного репозитория и местоположения Hugging Face
file_path = hf_hub_download(repo_id="inuwamobarak/random-files", repo_type="dataset", filename="Screenshot from 2023-08-16 22-30-54.png")

# Открытие загруженного изображения с использованием библиотеки PIL и преобразование его в формат RGB
image = Image.open(file_path).convert("RGB")

# Получение исходной ширины и высоты изображения
width, height = image.size

# Изменение размера изображения до 50% от его исходных размеров
resized_image = image.resize((int(width * 0.5), int(height * 0.5)))

Таким образом, мы будем обнаруживать таблицу на приведенном выше изображении и распознавать строки и столбцы.

Давайте выполним некоторые базовые задачи предобработки.

# Импорт класса DetrFeatureExtractor из библиотеки Transformers
from transformers import DetrFeatureExtractor

# Создание экземпляра класса DetrFeatureExtractor
feature_extractor = DetrFeatureExtractor()

# Использование экстрактора фичей для кодирования изображения
# 'image' должен быть объектом PIL-изображения, полученным ранее
encoding = feature_extractor(image, return_tensors="pt")

# Получение ключей из словаря encoding
keys = encoding.keys()

Теперь мы загрузим таблицу-трансформер от Microsoft на Huggingface.

# Импорт класса TableTransformerForObjectDetection из библиотеки transformers
from transformers import TableTransformerForObjectDetection

# Загрузка предобученной модели таблицы-трансформера для обнаружения объектов
model = TableTransformerForObjectDetection.from_pretrained("microsoft/table-transformer-detection")

import torch

# Отключение вычисления градиента для инференса
with torch.no_grad():
    # Пропуск закодированного изображения через модель для инференса
    # 'model' - это ранее загруженная модель TableTransformerForObjectDetection
    # 'encoding' содержит закодированные фичи изображения, полученные с помощью DetrFeatureExtractor
    outputs = model(**encoding)

Теперь мы можем построить результат.

import matplotlib.pyplot as plt

# Определение цветов для визуализации
COLORS = [[0.000, 0.447, 0.741], [0.850, 0.325, 0.098], [0.929, 0.694, 0.125],
          [0.494, 0.184, 0.556], [0.466, 0.674, 0.188], [0.301, 0.745, 0.933]]

def plot_results(pil_img, scores, labels, boxes):
    # Создание фигуры для визуализации
    plt.figure(figsize=(16, 10))
    
    # Отображение изображения PIL
    plt.imshow(pil_img)
    
    # Получение текущей оси
    ax = plt.gca()
    
    # Повторение списка COLORS несколько раз для визуализации
    colors = COLORS * 100
    
    # Итерация по оценкам, меткам, рамкам и цветам для визуализации
    for score, label, (xmin, ymin, xmax, ymax), c in zip(scores.tolist(), labels.tolist(), boxes.tolist(), colors):
        # Добавление прямоугольника на изображение для ограничивающей рамки обнаруженного объекта
        ax.add_patch(plt.Rectangle((xmin, ymin), xmax - xmin, ymax - ymin,
                                   fill=False, color=c, linewidth=3))
        
        # Подготовка текста для метки и оценки
        text = f'{model.config.id2label[label]}: {score:0.2f}'
        
        # Добавление текста метки и оценки на изображение
        ax.text(xmin, ymin, text, fontsize=15,
                bbox=dict(facecolor='yellow', alpha=0.5))
    
    # Отключение оси
    plt.axis('off')
    
    # Отображение визуализации
    plt.show()

# Получение исходной ширины и высоты изображения
width, height = image.size

# Постобработка выходных данных обнаружения объектов с использованием экстрактора фичей
results = feature_extractor.post_process_object_detection(outputs, threshold=0.7, target_sizes=[(height, width)])[0]

# Визуализация результатов
plot_results(image, results['scores'], results['labels'], results['boxes'])
Обнаруженная таблица

Итак, мы успешно обнаружили таблицы, но не распознали строки и столбцы. Давайте сделаем это сейчас. Мы загрузим другое изображение для этой цели.

# Импортируем необходимые библиотеки
from huggingface_hub import hf_hub_download
from PIL import Image

# Загружаем файл изображения из указанного репозитория Hugging Face и местоположения
# Используйте одну из предоставленных строк 'repo_id' в зависимости от вашего случая использования
file_path = hf_hub_download(repo_id="nielsr/example-pdf", repo_type="dataset", filename="example_table.png")
# file_path = hf_hub_download(repo_id="inuwamobarak/random-files", repo_type="dataset", filename="Screenshot from 2023-08-16 22-40-10.png")

# Открываем загруженное изображение с помощью библиотеки PIL и преобразуем его в формат RGB
image = Image.open(file_path).convert("RGB")

# Получаем исходную ширину и высоту изображения
width, height = image.size

# Масштабируем изображение до 90% от его исходных размеров
resized_image = image.resize((int(width * 0.9), int(height * 0.9)))
Образец таблицы для распознавания

Теперь давайте все же подготовим указанное выше изображение.

# Используем feature extractor для кодирования измененного изображения
encoding = feature_extractor(image, return_tensors="pt")

# Получаем ключи словаря encoding
keys = encoding.keys()

Затем мы все же можем загрузить модель Transformer, как мы делали ранее.

# Импортируем класс TableTransformerForObjectDetection из библиотеки transformers
from transformers import TableTransformerForObjectDetection

# Загружаем предварительно обученную модель Table Transformer для распознавания структуры таблицы
model = TableTransformerForObjectDetection.from_pretrained("microsoft/table-transformer-structure-recognition")

with torch.no_grad():
  outputs = model(**encoding)

Теперь мы можем визуализировать наши результаты.

# Создаем список целевых размеров для постобработки
# 'image.size[::-1]' меняет местами ширину и высоту, чтобы соответствовать формату целевого размера (высота, ширина)
target_sizes = [image.size[::-1]]

# Постобрабатываем выходы обнаружения объектов с использованием feature extractor
# Используем порог 0.6 для уверенности
results = feature_extractor.post_process_object_detection(outputs, threshold=0.6, target_sizes=target_sizes)[0]

# Визуализируем результаты
plot_results(image, results['scores'], results['labels'], results['boxes'])
Распознанные строки и столбцы

Вот и все. Попробуйте работать с вашими таблицами и посмотрите, как это будет. Пожалуйста, подпишитесь на меня в GitHub и в социальных сетях, чтобы получать больше интересных учебников с использованием Transformers. Также оставьте комментарий ниже, если вам это помогло.

Заключение

Возможности для извлечения информации из неструктурированных данных стали ярче, чем когда-либо. Одним из главных успехов обнаружения таблиц является представление набора данных PubTables-1M и концепция канонизации. Мы видели извлечение таблиц и инновационные решения, которые переформировали эту область. Рассмотрение канонизации как нового подхода к обеспечению согласованных аннотаций исходных данных, которые решают проблему пересегментации. Выравнивание аннотаций с структурой таблиц повышает надежность и точность набора данных, открывая путь к надежной производительности модели.

Основные выводы

  • Набор данных PubTables-1M революционизирует извлечение таблиц, предоставляя множество аннотированных таблиц из научных статей.
  • Инновационная концепция канонизации решает проблему несогласованности исходных данных.
  • Модели обнаружения объектов на основе Transformer, в частности Detection Transformer (DETR), отлично справляются с обнаружением таблиц, распознаванием структуры и функциональным анализом.

Часто задаваемые вопросы

Ссылки

  • Репозиторий GitHub: https://github.com/inuwamobarak/detecting-tables-in-documents
  • Smock, B., Pesala, R., & Abraham, R. (2021). PubTables-1M: Направленность на полное извлечение таблиц из неструктурированных документов. ArXiv. /abs/2110.00061
  • https://arxiv.org/abs/2110.00061
  • Carion, N., Massa, F., Synnaeve, G., Usunier, N., Kirillov, A., & Zagoruyko, S. (2020). Обнаружение объектов с использованием механизмов трансформации. ArXiv. /abs/2005.12872
  • https://huggingface.co/docs/transformers/model_doc/detr
  • https://huggingface.co/docs/transformers/model_doc/table-transformer
  • https://huggingface.co/microsoft/table-transformer-detection
  • https://huggingface.co/microsoft/table-transformer-structure-recognition

Медиа, показанное в этой статье, не принадлежит Analytics Vidhya и используется по усмотрению автора.