Создайте собственный набор данных для обучения модели LayoutLMV3.
Извлечение объектов из документов, особенно из отсканированных документов, таких как счета-фактуры, лабораторные отчеты, юридические документы и т. д., выполняемое вручную, может оказаться сложной задачей. Но автоматизация задачи с помощью современного искусственного интеллекта также не является легкой прогулкой.
Если вы читаете это, вы уже знаете, что создание набора данных, правильного набора данных для проверки поездов и проверки с правильными аннотациями, — это кропотливый и трудоемкий процесс. Несмотря на то, что инструменты маркировки данных, такие как LabelStudio, Rubrix, Prodigy (и многие другие), в значительной степени решили проблему маркировки данных, они все еще ограничены классификацией текста/изображений, NER, проблемами обнаружения объектов, и не существует инструмента за исключением UBIAI (https://ubiai.tools/), который предоставляет готовое решение для аннотирования отсканированных документов для использования в моделях LayoutLMV2 или LayoutLMV3.
Наша проблема в первую очередь с UBIAI заключалась в том, что это платный инструмент, и у нас не было возможности загрузить наши данные в их облако, чтобы даже попытаться аннотировать некоторые примеры. Поэтому мы подумали о создании нашего собственного набора данных, выполнив некоторые jugaad.
Пожалуйста, продолжайте читать и посмотрите, как можно решить эту проблему, если она у вас есть.
Примечание. Этот процесс создания обучающих данных не предназначен для больших наборов данных размером 1000–10 000 документов. Скорее, для тех, кто хочет быстро создать прототип и PoC, чтобы проверить эффективность этой модели для своего приложения, это очень простой и эффективный способ. Для более крупного набора данных создание набора данных золотого стандарта можно выполнить с помощью опции оптического распознавания символов аннотаций в label-studio.
Шаг 1. Получите все необходимые предварительные условия
Пожалуйста, следуйте инструкциям ниже, чтобы создать новую среду Python и установить необходимые пакеты для выполнения упражнения.
ПРИМЕЧАНИЕ. Основное предположение состоит в том, что в вашей системе уже установлена программа Anaconda или Miniconda. Если нет, перейдите по ссылкам. Все приведенные здесь коды протестированы в средах Windows и Linux, за исключением маркировки, которая выполнялась в среде Windows.
Создайте среду Python-3.9 в anaconda, используя команду ниже.
conda create -n layoutlmv3 python=3.9
Установите необходимые пакеты Python для маркировки ваших данных и извлечения текста следующим образом.
pip install -r requirements.txt
После установки вышеуказанных пакетов Python установите Tesseract — инструмент оптического распознавания символов, который мы будем использовать для извлечения текста из отсканированных изображений документов. Пожалуйста, перейдите по ссылке эта, чтобы установить tesseract.
Прежде чем приступить к разметке и созданию набора данных, убедитесь, что все пакеты и тессеракт установлены правильно.
Шаг 2. Начните наклеивать этикетки с помощью label-studio (настоящая тяжелая работа)
- Преобразуйте данные в изображения
Первая задача при создании набора аннотаций данных — сохранить документы в формате изображения. Итак, если у вас есть собственный/отсканированный PDF-файл, я бы предложил сначала преобразовать его в изображения, используя ресурс ниже.
- Запустить LabelStudio
Откройте LabelStudio с помощью приведенной ниже команды в только что созданной среде Python.
label-studio
Откроется панель маркировки LabelStudio, как показано ниже:
- Завершить выделение объектов
Прежде чем мы начнем разметку, нам нужно решить, какие объекты мы планируем пометить в нашем наборе данных, и в демонстрационных целях предположим, что в этом руководстве мы пометим Номер счета, Дата, Сумма в счете. документы с тегами invoice_no, date, sum соответственно. Для этого урока я собираюсь использовать очень небольшой образец из набора данных RVL-CDIP.
- Начать разметку и экспортировать данные в JSON
Посмотрите это видео на YouTube, чтобы начать маркировать и экспортировать данные в формат JSON.
После этого шага label-studio ведет себя странно: добавляет уникальную строку для каждого изображения, загруженного в инструмент. Чтобы избежать ошибок в имени файла на следующих шагах, перейдите по указанному ниже пути и скопируйте все загруженные изображения с измененным именем файла в текущий каталог внутри папки с именем «layoutlmv3» или с любым именем папки по вашему желанию.
- Создать набор данных «текст+ограничительная рамка»
Теперь мы создадим необходимые файлы аннотаций для обучения, используя tesseract HOCR и аннотацию JSON, созданную на последнем шаге.
Шаг 3. Используйте метки tesseract и label-studio для создания обучающих файлов
Импортировать пакеты
Разбор выходных данных LabelStudio в DataFrame
Определение пользовательских функций
Прокрутите JSON LabelStudio для создания DataFrame
Определите label2id и id2label
Извлечение текста из изображений с помощью Tesseract HOCR
Разделение данных и запись окончательных данных в файлы обучения и тестирования
Файл train.txt должен выглядеть примерно так:
ПРИМЕЧАНИЕ. Чтобы сэкономить время, я аннотировал только 4 изображения и скопировал их так же, как и несколько изображений, для представления.
Еще один необходимый файл — «class_list.txt», содержащий список всех меток в формате, разделенном запятыми. Файл будет выглядеть примерно так:
Создайте правильную структуру папок для выполнения следующих шагов
На следующих шагах мы создадим правильную структуру папок для нашего кода, которую можно будет воспроизвести в Google Colab, и обучим модель в блокноте Colab.
- Создайте папку с именем «layoutlmv3» в вашем текущем рабочем каталоге.
- Скопируйте все файлы изображений, как указано выше, созданные после маркировки, в указанную выше папку.
- Скопируйте train.txt, test.txt в указанную выше папку.
- Скопируйте созданный выше файл class_list.txt в ту же папку Layoutlmv3.
Папка должна выглядеть примерно так.
Шаг 4. Создайте сценарий загрузки набора данных (второй по важности шаг после маркировки):
Пользовательские данные, аннотированные до сих пор, необходимо загрузить в формате набора данных Huggingface, чтобы их можно было использовать для последующей задачи точной настройки модели LayoutLMv3. Для этого я отредактировал скрипт загрузки данных, вдохновленный здесь. Если вы выполнили все описанные до сих пор шаги, вам не нужно ничего редактировать в этом файле. Просто скачайте/скопируйте его и используйте в текущем рабочем каталоге.
После этого рабочий каталог будет выглядеть примерно так.
Шаг 5: Загрузите набор данных как объект набора данных преобразователей:
Следующий шаг включает загрузку аннотированных данных в качестве объекта наборы данных преобразователей, который в дальнейшем можно использовать для точной настройки модели.
Создайте новый блокнот ipynb под названием invoice_dataset_loading.ipynb. Или вы можете взять его из git repo. Откройте блокнот и выполните следующие действия:
Установите необходимые библиотеки
Загрузить набор данных
Проверить загруженный набор данных
Загруженный набор данных должен выглядеть примерно так:
Осмотрите одно из изображений с аннотациями
Если до сих пор ошибок не было, это то, что вы должны увидеть в качестве вывода.
Шаг 6: Заключение (часть 2):
На этом завершается часть серии руководств по созданию набора данных. Эта часть процесса, вероятно, является самой сложной и трудоемкой частью всего конвейера.
После создания набора данных обучение и настройка гиперпараметров становятся скорее итеративным процессом. Это руководство ни в коем случае не объясняет, как улучшить производительность модели, это всего лишь руководство по настройке и обучению пользовательской модели.
Оформите заказ часть-1, чтобы узнать архитектуру модели.
Ознакомьтесь с частью 3, чтобы продолжить обучение и доработку модели LayoutLMV3.