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

По этой причине очень важно собрать как можно больше данных. Однако это может быть особенно сложно для отраслей, где они полагаются в основном на бумажные отчеты, такие как финансовые квитанции или даже брошюры с аналитическими данными в табличной форме. В этой статье мы покажем, как использовать предварительно обученную модель глубокого обучения RetinaNet для идентификации таблиц из PDF-файлов, а затем использовать пакет Python Tabula для извлечения ее в CSV.

Вступление

Все это было бы невозможно без потрясающей готовой модели RetinaNet от Fizyr на GitHub. Мы также использовали отличный репозиторий PDFTableExtract от ferrygun.

Мы начали с загрузки открытых наборов данных PDF и преобразовали их в файлы изображений (формат JPEG), а затем вручную аннотировали нужные таблицы из более 800 изображений. Затем мы обучили предварительно обученные веса модели Fizyr на наших данных, в результате чего была получена наша табличная модель обнаружения. Наконец, использование конечной модели для определения координат таблицы, чтобы предоставить пределы области для извлечения с помощью Tabula - пакета Python.

Для аннотирования изображений мы использовали labelImg, который можно скачать здесь.

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

Настраивать

Поскольку модель требует больших вычислений, для запуска модели на собственных данных настоятельно рекомендуется запускать ее в системе с поддержкой графического процессора. Не бойтесь, если ваш компьютер имеет только процессорную мощность. Google Colab позволяет вам писать и запускать Python в вашем браузере с помощью

  • Требуется нулевая конфигурация
  • Бесплатный доступ к графическим процессорам
  • Легко делиться

Наш сценарий написан в блокноте Google Colab. Код можно реплицировать в различных облачных средах или даже локально, но обратите внимание, что для некоторых пакетов потребуется пониженная версия, чтобы разместить пакет Tensorflow в предварительно обученной модели. (Дополнительную информацию см. В git Fizyer)

И последнее, прежде чем мы перейдем к коду, упомянем, что такое RetinaNet?

Это тип модели глубокого обучения, который использует сверточные нейронные сети (CNN) для идентификации классов объектов на изображениях. Для более глубокого понимания этого Пракаш Джей объясняет интуицию, лежащую в основе RetinaNet в этой статье.

Я свяжу здесь репозиторий GitHub, содержащий код, которому вы будете следовать по ходу дела.



Подготовка данных

После сбора ваших файлов PDF вам нужно будет преобразовать файлы в набор изображений.

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

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

Ура! Теперь у вас есть набор изображений, которые нужно аннотировать с помощью labelImg. После аннотирования изображений ваши данные должны состоять из папки для файлов изображений и папки для файлов XML.

Модель нуждается в двух текстовых файлах «train.txt» и «test.txt», чтобы можно было создать необходимые файлы ниже. Это простые текстовые файлы, содержащие имя изображения без расширения файла. Например, файл поезда будет содержать «Image1», «Image 2» и т. Д. без расширения «.jpg». То же самое и с test.txt. Ниже приведен пример кода для записи имен изображений из папки изображений в файл train.txt, а затем замены train.txt на test.txt для создания файла test.txt:

Установка

Теперь мы готовы перейти к самому интересному. Клонируйте репозиторий Fizyr keras-retinanet и установите setup.py

Загрузите изображения в папку «/ content / keras-retinanet / images /», а аннотации - в папку «/ content / keras-retinanet / annotations /». После этого вы запустите следующее, что приведет к появлению трех новых CSV-файлов: train file- 'retinanet-train.csv', test file- 'retinanet-test. csv ', и файл классов ' retinanet-classes.csv '. Мы рекомендуем вам сохранить файлы CSV, чтобы избежать их повторного создания каждый раз, чтобы вы могли повторно использовать их, если вы используете те же данные.

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

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

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

После завершения работы модели ее необходимо преобразовать в модель вывода. Нам нужно это сделать, чтобы выполнять обнаружение объектов на изображениях.

Теперь мы готовы протестировать модель на наших тестовых файлах. Код можно найти на GitHub выше.

Результаты теста должны выглядеть так:

Извлечение таблиц в формат CSV с помощью Tabula

Теперь, когда мы можем определять координаты таблицы по изображениям, мы можем передать их в пакет Python Tabula, чтобы упростить извлечение.

Следует отметить, что Tabula извлекает таблицы не из изображений, а из текстовых файлов PDF. Поэтому, несмотря на то, что мы нашли координаты таблицы, мы должны преобразовать их в единицы, которые может прочитать Tabula. Мы обнаружили, что параметр «area» в Табуле читается в пунктах PDF. Если вы хотите проверить или найти точные точки вашей таблицы PDF, вы можете использовать инструмент измерения, доступный в Adobe Acrobat Reader.

Итак, поскольку наши координаты в пикселях, нам нужно преобразовать их в точки. Формула преобразования пикселя в точку:

  • точки = пиксели * 72 / DPI

DPI - это сокращение от Dots per Inch. Вы можете узнать разрешение вашего изображения с помощью функции img_page.info [‘dpi’] из пакета pdf2image. В нашем случае DPI было 200. Пиксели - это координаты x1, y1, x2, y2, полученные из модели. Табула не соответствует условию x1, y1, x2, y2, а параметр области вводится как такая область (y1, x1, y2, x2). Поскольку наш DPI был 200, наша функция табуляции выглядит следующим образом:

output_tabula = read_pdf(PDF_PATH, pages=str(pg), guess = True, area =(x[1]*72/200, x[0]*72/200, x[3]*72/200, x[2]*72/200))

Затем у нас есть наши таблицы out, и теперь нам просто нужно экспортировать их в файл csv.

db.to_excel(pdf_file[:-4]+"-"+str(pg)+"-table-"+str(i)+".xlsx", header = False, index = False)

Пожалуйста, обратитесь к GitHub, чтобы получить полный код для работы с вашими файлами. Результирующий файл CSV:

И вот он, еще один отличный вариант использования для обнаружения объектов глубокого обучения! Надеюсь, ИИ сделал вашу жизнь немного проще. Спасибо за ваше время!

Хлопайте и делитесь, если вам нравится этот пост. Пожалуйста, оставьте комментарий ниже, если у вас возникнут какие-либо вопросы или отзывы.

Примечание: этот пост и код были созданы в сотрудничестве с Ekta Tomar.