Обучение и применение пользовательской модели Detectron2 для обнаружения объектов с использованием документов PDF (Часть 1 Обучение)

Обучение и применение пользовательской модели Detectron2 для обнаружения объектов в документах PDF (Часть 1 Обучение)

Обучение вашей машины уметь видеть PDF-файлы как человек

Я пытался решить деловую задачу в течение половины года, делая PDF-документы машинночитаемыми, по меньшей мере в том смысле, что заголовки/названия (текст, указывающий раздел) могут быть извлечены из документа, вместе с их содержимым, образуя некую структуру данных. В начале я приступил к этому, используя сверточную нейронную сеть (CNN), а также комбинацию сверточной нейронной сети (CNN) и рекуррентной нейронной сети (RNN), чтобы классифицировать структуру документа с использованием текста и текстовых признаков (шрифт, размер шрифта, начертание и т.д.). Подобный фреймворк был разработан Rahman & Finin и позволяет обрабатывать структуру документа, используя Long Short-Term Memory (LSTM) для семантической классификации различных разделов. Проблема, с которой я столкнулся, заключалась в том, что у меня не было времени и энергии, чтобы подготовить и аннотировать достаточное количество данных для создания точных моделей с использованием аналогичного фреймворка.

Чтобы упростить этот процесс в качестве одного человека, я обратился к компьютерному зрению! Вместо попыток извлечения текста и текстовых признаков из PDF и вывода структуры документа таким образом, я преобразую страницы PDF в изображения, выводлю структуру документа с помощью обнаружения объектов и затем провожу оптическое распознавание символов (OCR) для соответствующих выводов (например, заголовка страницы) и их содержимого (например, содержимого заголовка). В этой статье я покажу вам, как сделать то же самое с помощью Detectron2!

Detectron2 – это библиотека нового поколения Facebook AI Research, которая упрощает процесс создания приложений компьютерного зрения. В рамках различных возможных случаев использования компьютерного зрения (распознавание изображений, семантическая сегментация, обнаружение объектов и сегментация экземпляров) в этой статье будет проводиться обучение специальной модели Detectron2 для обнаружения объектов, которую легко различить по использованию ограничивающих рамок. После обучения мы также запакуем приложение в Docker и развернем его на Heroku/AWS, а также изучим другие темы, такие как управление памятью и пакетное вывод для настройки скриптов и модели под ваш случай использования.

Для чтения и выполнения этой статьи будет полезно иметь:

  • Углубленные знания Python
  • Знание Django и Docker для процесса развертывания (рассматривается в части 2)
  • Опыт работы с AWS

Установка Detectron2

Если вы пользователь Mac или Linux, у вас повезло! Процесс будет относительно простым, выполните следующую команду:

pip install torchvision && pip install "detectron2@git+https://github.com/facebookresearch/detectron2.git@v0.5#egg=detectron2"

Обратите внимание, что эта команда компилирует библиотеку, поэтому вам придется немного подождать. Если вы хотите установить Detectron2 с поддержкой GPU, ознакомьтесь с официальной инструкцией по установке Detectron2 здесь для получения подробной информации.

Однако, если вы пользователь Windows, этот процесс будет немного сложнее, но я сам смог справиться с ним на Windows.

Тщательно следуйте инструкциям, представленным здесь пакетом Layout Parser для Python (который также полезен, если вам не нужно обучать собственную модель Detectron2 для определения структуры/содержимого PDF и вы хотите полагаться на предварительно аннотированные данные! Это, конечно, экономит время, но в некоторых случаях вы можете обучить более точную и компактную модель самостоятельно, что полезно для управления памятью при развертывании, как я объясню позже). Установите pycocotools вместе с Detectron2, так как этот пакет поможет загружать, разбирать и визуализировать данные формата COCO, которые нам нужны для обучения модели Detectron2.

Локальная установка Detectron2 будет использована в части 2 этой серии статей, так как мы будем использовать экземпляр AWS EC2 позже в этой статье для обучения модели Detectron2.

Detectron2 Custom Training — Аннотация с использованием LabelMe

Для аннотации изображений нам нужно две вещи: (1) изображения, которые мы будем аннотировать, и (2) инструмент аннотации. Соберите каталог со всеми изображениями, которые вы хотите аннотировать, но если вы следуете моему примеру и хотите использовать изображения в формате PDF, соберите каталог PDF, установите пакет pdftoimage:

pip install pdf2image

А затем используйте следующий скрипт для преобразования каждой страницы PDF в изображение:

import osfrom pdf2image import convert_from_path# Назначьте input_dir как директорию PDF, например: "C://Users//user//Desktop//pdfs"input_dir = "##"# Назначьте output_dir как директорию, в которой вы хотите сохранить изображения"output_dir = "##"dir_list = os.listdir(input_dir)index = 0while index < len(dir_list):    images = convert_from_path(f"{input_dir}//" + dir_list[index])    for i in range(len(images)):        images[i].save(f'{output_dir}//doc' + str(index) +'_page'+ str(i) +'.jpg', 'JPEG')    index += 1

После того, как у вас появится каталог изображений, мы собираемся использовать инструмент LabelMe, получите инструкции по установке здесь. После установки просто запустите команду labelme из командной строки или терминала. Это откроет окно со следующим макетом:

Нажмите пункт “Открыть папку” на левой стороне и откройте папку, где сохранены ваши изображения (давайте также назовем эту папку “train”). LabelMe откроет первое изображение в папке и позволит вам проаннотировать каждое изображение. Щелкните правой кнопкой мыши изображение, чтобы найти различные варианты аннотаций, такие как создание полигона для каждой точки полигона вокруг объекта на изображении или создание прямоугольника для захвата объекта с углами в 90 градусов.

После размещения рамки/полигона LabelMe запросит метку. В приведенном ниже примере я предоставил заголовок метки для каждого заголовка, найденного на странице. Вы можете использовать несколько меток, определяя различные объекты на изображении (для примера с PDF-файлом это могут быть заголовок/шапка, таблицы, параграфы, списки и т. д.), но для моей цели я буду только идентифицировать заголовки и затем ассоциировать каждый заголовок соответствующим содержимым после применения модели (см. часть 2).

После аннотации нажмите кнопку “Сохранить” и затем кнопку “Следующее изображение”, чтобы аннотировать следующее изображение в указанной папке. Detectron2 отлично работает при детектировании с минимальными данными, поэтому не стесняйтесь аннотировать до 100 изображений для начального обучения и тестирования, а затем продолжайте аннотировать и обучать для увеличения точности модели (имейте в виду, что обучение модели на более чем одной категории меток немного снизит точность и потребуется больший набор данных для улучшения точности).

После того, как каждое изображение в папке train будет аннотировано, давайте возьмем примерно 20% из этих пар изображение/аннотация и переместим их в отдельную папку с названием test.

Если вы знакомы с машинным обучением, простое правило гласит, что необходимо сделать разделение на тестовую/обучающую/проверочную выборки (60-80% данных для обучения, 10-20% данных для проверки и 10-20% данных для тестирования). В данном случае мы просто разделим выборку на обучающую и тестовую, где 20% изображений будут тестовыми, а 80% – обучающими.

Detectron2 Custom Training — Формат COCO

Теперь, когда у нас есть папки с аннотациями, нам нужно преобразовать аннотации в формате LabelMe в формат COCO. Вы можете сделать это просто с помощью файла labelme2coco.py в репозитории, который я предоставляю здесь. Я переделал этот скрипт от Tony607, который конвертирует как полигональные аннотации, так и прямоугольные аннотации (поскольку первоначальный скрипт неправильно конвертировал прямоугольные аннотации в формат COCO).

После загрузки файла labelme2coco.py запустите его в терминале с помощью команды:

python labelme2coco.py путь/к/папке/с/тренировочными/фотографиями

и он создаст файл train.json. Выполните команду второй раз для папки с тестовыми фотографиями и отредактируйте строку 172 в файле labelme2coco.py, заменив имя выводного файла на test.json (иначе он перезапишет файл train.json).

Обучение настраиваемой модели Detectron2 — EC2

Теперь, когда нудный процесс разметки окончен, мы можем перейти к интересной части – обучению!

Если ваш компьютер не обладает возможностями Nvidia GPU, нам потребуется создать экземпляр EC2 с использованием AWS. Модель Detectron2 может обучаться на CPU, но если вы попробуете это, вы заметите, что это займет очень много времени, в то время как использование Nvidia CUDA на экземпляре с GPU обучит модель за считанные минуты.

Для начала войдите в консоль AWS. После входа в систему введите EC2 в поисковую строку, чтобы перейти на панель управления EC2. Отсюда выберите “Instances” на левой стороне экрана, а затем нажмите кнопку “Launch Instances”.

Минимальный набор информации, который вам потребуется указать для экземпляра, включает:

  • Имя
  • Amazon Machine Image (AMI) – это конфигурация программного обеспечения. Убедитесь, что выбрана AMI, содержащая GPU и возможности PyTorch, так как в ней будут установлены необходимые пакеты для CUDA и дополнительные зависимости для Detectron2, такие как Torch. Для выполнения данного обучающего пособия также используйте Ubuntu AMI. Я использовал AMI – Deep Learning AMI GPU PyTorch 2.1.0 (Ubuntu 20.04).
  • Тип экземпляра – это конфигурация аппаратного обеспечения. Ознакомьтесь с руководством по выбору подходящего типа экземпляра. Мы хотим использовать экземпляр, оптимизированный для производительности, такой как экземпляры семейства P или G. Я использовал p3.2xlarge, который обеспечивает необходимую вычислительную мощность и, конкретно, возможности GPU.

ПРИМЕЧАНИЕ: для использования экземпляров семейства P вам понадобится запросить увеличение квоты у службы поддержки AWS (поскольку базовым пользователям не предоставляется немедленный доступ к более производительным экземплярам из-за связанных с ними затрат). Если вы используете экземпляр p3.2xlarge, вам потребуется запросить увеличение квоты до 8 vCPU.

  • Укажите ключевую пару (для входа в систему). Создайте ее, если у вас ее еще нет, и назовите ее p3key, как я.

  • Наконец, сконфигурируйте хранилище. Если вы использовали ту же AMI и тип экземпляра, что и я, то увидите, что исходный объем хранилища составляет 45 ГБ. Пожалуйста, увеличьте его до около 60 ГБ или больше, в зависимости от размера ваших обучающих данных, чтобы убедиться, что экземпляр имеет достаточно места для фотографий.

Запустите экземпляр и нажмите на гиперссылку с идентификатором экземпляра, чтобы просмотреть информацию на панели управления EC2. Когда экземпляр запущен, откройте окно командной строки и выполните следующую команду для подключения к экземпляру EC2 по SSH (убедитесь, что заменили жирный текст на (1) путь к вашей .pem ключевой паре и (2) адрес вашего экземпляра EC2):

ssh -L 8000:localhost:8888 -i C:\путь\к\p3key.pem ubuntu@example-ec2-id.compute.amazonaws.com

Поскольку это новый хост, ответьте “yes” на следующее сообщение:

А затем Ubuntu будет запускать предустановленную виртуальную среду под названием PyTorch (из AWS AMI). Активируйте venv и запустите предустановленную заметку jupyter, используя следующие две команды:

Это вернет вам URL-адреса для копирования и вставки в ваш браузер. Скопируйте тот, который содержит localhost, и измените 8888 на 8000. Это перенесет вас на Jupyter Notebook, похожий на этот:

С моего репозитория на github загрузите файл Detectron2_Tutorial.ipynb в блокнот. Затем запустите строки в разделе Installation, чтобы полностью установить Detectron2. Затем перезапустите среду выполнения, чтобы убедиться, что установка вступила в силу.

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

  • Файл utils.py из репозитория github. Он предоставляет файлы .ipynb с деталями конфигурации для Detectron2 (смотрите здесь документацию для ознакомления, если вас интересуют конкретные настройки). В этом файле также содержится функция plot_samples, на которую ссылается .ipynb файл, но она закомментирована. Вы можете раскомментировать и использовать ее, чтобы отображать данные обучения, если хотите видеть визуальное представление выборок во время процесса. Обратите внимание, что для использования функции plot_samples необходимо установить дополнительно cv2.
  • Файлы train.json и test.json, созданные с помощью скрипта labelme2coco.py.
  • ZIP-файлов как Каталог Train images, так и Каталог Test images (сжатие каталогов позволяет загрузить только один элемент в блокнот; вы можете оставить файлы аннотаций Labelme в каталоге, это не повлияет на обучение). После загрузки обоих ZIP-файлов откройте терминал в блокноте, нажав (1) Новый, а затем (2) Терминал в верхнем правом углу блокнота, и используйте следующие команды, чтобы разархивировать каждый из файлов и создать отдельный каталог Train и Test изображений в блокноте:
! разархивировать ~/train.zip -d ~/! разархивировать ~/test.zip -d ~/

Наконец, запустите ячейки блокнота в разделе Training в файле .ipynb. Последняя ячейка будет выводить ответы, подобные следующим:

Это покажет количество изображений, используемых для обучения, а также количество экземпляров, которые вы выделяли в обучающем наборе данных (здесь было обнаружено 470 экземпляров категории “title” перед обучением). Detectron2 затем сериализует данные и загружает их порциями, как указано в конфигурации (utils.py).

При начале обучения вы увидите, как Detectron2 печатает события:

Это дает вам информацию, такую как: оценка оставшегося времени обучения, количество итераций, выполненных Detectron2, и, самое главное, для контроля точности – total_loss, который является индексом других расчетов потерь и показывает, насколько плохо модель предсказывает один пример. Если предсказание модели идеально, потери равны нулю, в противном случае они больше. Не беспокойтесь, если модель не идеальна! Мы всегда можем добавить больше аннотированных данных, чтобы повысить точность модели, или использовать окончательные выводы обученной модели с высоким показателем (показывающим, насколько уверена модель, что вывод является точным) в нашем приложении.

После завершения в блокноте будет создан каталог с подкаталогом с названием output, который содержит файлы, связанные с событиями и метриками обучения, файл, который сохраняет чекпоинт модели, и, наконец, файл .pth с названием model_final.pth. Это сохраненная и обученная модель Detectron2, которую теперь можно использовать для выводов в развернутом приложении! Убедитесь, что вы ее скачаете перед выключением или завершением экземпляра AWS EC2.

Теперь, когда у нас есть model_final.pth, следуйте за нами в статье Часть 2: Развертывание, которая расскажет о процессе развертывания приложения, использующего машинное обучение, и даст некоторые ключевые советы о том, как сделать этот процесс эффективным.

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