Всем привет!

На связи команда Data Science компании ITFB Group. У нашей компании есть собственная разработка ITFB EasyDoc — система распознавания и извлечения данных из любого типа документов. В современном мире автоматизация обработки документов стала неотъемлемой частью множества бизнес-процессов. Предобработка изображений документов является важным шагом для обеспечения точности и надежности дальнейшего распознавания атрибутов. В этой статье мы хотим рассказать о некоторых эффективных методах предпроцессинга документов, позволяющих увеличивать как качество OCR-систем (Optical Character Recognition), так и различные CV и NLP пайплайны. Всем, кому интересна эта тема, — добро пожаловать под кат.

Для начала давайте посмотрим на основные проблемы и вызовы, с которыми приходится сталкиваться, когда мы получаем реальные данные документов от заказчиков:

  • Шумы сканирования (соль/перец, черные полосы, искажения и др.).

  • Перевернутые изображения, как в пределах 30, так и имеющие отклонения в 90, 180, 270 градусов.

  • Фоновые шумы. При фотографировании или сканировании зачастую попадаются объекты, не участвующие в процессе распознавания. 

  • Искажения перспективы в случаях фотографирования документов. 

  • Изображения низкого качества и разрешения.

Многие методы предпроцессинга, использующие классические функции CV, скорее всего, будут вам известны, но отметить их точно стоит.

Исправление угла поворота (Deskewing)

Одним из классических методов устранения угла поворота документа в пределах ± 20 градусов является алгоритм на основе преобразования Радона — это интегральное преобразование, которое всего лишь переводит функцию f, определенную на плоскости, в функцию rf, определенную в (двумерном) пространстве линий на плоскости.

Еще одним классическим методом исправления угла поворота является следующий пайплайн:

  1. Бинаризация с адаптивным порогом с последующим инвертированием изображения.

  2. Морфологические преобразования (cv2.morphologyEx).

  3. Поиск контуров (cv2.findContours).

  4. Поиск линий с помощью преобразования Хафа.

  5. Вычисление наиболее распространенного угла среди найденных горизонтальных линий.

  6. Поворот на найденный угол.

Исправление угла в пределах 90, 180, 270 градусов

Один из классических методов, который, кстати, заложен в функцию поиска угла поворота (OSD — Orientation and Script Detection) в Тессеракте, включает несколько ключевых этапов (tesseract в данном случае применяется, как библиотека, применяемая для исправления угла поворота):

import pytesseract 
# Загрузка изображения 
image = ... 
# Получение информации об ориентации и скрипте 
osd_results = pytesseract.image_to_osd(image, output_type=pytesseract.Output.DICT) 
# Извлечение угла поворота 
rotation_angle = osd_results['rotate']
  1. Предварительная обработка изображения.

  2. Сегментация текста изображение сегментируется на блоки текста. Тессеракт пытается определить области, содержащие текст, используя различные алгоритмы, такие как Connected Component Analysis (анализ связанных компонент).

  3. Распознавание линий и символов.

  4. Анализ ориентации — на основании распознанных символов и их расположения определяется ориентация текста. Используются статистические методы для анализа углов наклона линий текста.

  5. Оценка уверенности и вывод результатов.

Более продвинутым методом является обучение, к примеру, сверточной сетки. Для базового решения (baseline) можно выбрать известные модели Resnet, MobileNet, Yolo. Тут придется собирать достаточно большое количество данных либо синтезировать их, добавляя аугментацию. В качестве примера по запросу можем поделиться одним из наших репозиториев, который мы используем для аугментации (Img2Scan).

Если говорить про метрики, то модель CNN, обученная на 15к изображений, дает точность на тесте ~ 98 %, Тессеракт же — ~ 72 %. Данные метрики актуальны для изображений плохого качества, документов со сложным фоном и т. д. Если у вас документы отличного качества, то подход, описанный нами, вероятно, будет иметь метрику, близкую к 98 %.

Исправление перспективы документа

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

Классические методы исправления перспективы основываются на следующем алгоритме:

  1. Преобразование картинки в градации серого, блюринг, а потом применение алгоритма Canny (о самом операторе можно почитать тут.).

  2. Поиск контура области интереса на изображении.

  3. Определение координат четырех углов контура (вершины прямоугольника).

  4. Построение матрицы перспективного преобразования (cv2. getPerspectiveTransform). 

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

Следующий подход — поиск контура (области интереса) с помощью CV задачи Instance Segmentation.

Тут за хороший baseline можно взять какую-нибудь быструю и не тяжеловесную сетку от ultralytics Yolov8seg (также подходящие нейросети можно найти в фреймворках paddle, openMMlab и другие).

Опять же, как и любая другая CV-задача, данный подход требует тщательной подготовки данных, так как хорошо подготовленный датасет — это примерно 70 % успеха, а иногда и больше. Поэтому стоит уделить особое внимание сбору, разметке, аугментации и синтезированию данных.

Когда мы нашли маску документа, определяем ее края и вводим ограничения — искажение должно иметь вид четырехугольника. Далее по стандарту: построение матрицы перспективного преобразования и корректировка искажения.

Возможно, кто-то из читателей успешно решает данную задачу с помощью Keypoint Detection. Будем признательны, если вы поделитесь в комментариях результатами, а мы хотели бы рассказать еще об одном методе, который успешно применяется в нашем продукте. Метод основан на предсказании координат так называемых контрольных точек (Attention-Enhanced Control Point Prediction), что само по себе не является новинкой. Такой подход был предложен еще в статье Dewarping with control points, но ее авторы предложили использовать два этапа (1-й этап — грубое исправление, 2-й этап — доуточнение результата), также они представили модифицированную архитектуру модели (добавили в нее слои внимания) и сгенерировали для обучения датасет на основе Doc3D, в котором добавили вариативность искажений документов.

Генерация тренировочных данных

Очевидно, что сделать датасет, в котором были бы вручную размечены контрольные точки на фотографиях реальных документов не представляется возможным, поэтому приходится генерировать синтетические данные и стараться делать так, чтобы они были максимально похожими на реальные. В качестве первой итерации мы попытались использовать доступные скрипты для генерации датасета из статьи Dewarping with contol points, но столкнулись с тем, что на генерацию одного примера уходило около минуты (то есть на генерацию 50K картинок ушло бы 34 дня). Поэтому мы оптимизировали работу скриптов и получили датасет из 50K примеров чуть больше чем за сутки. В качестве переднего плана использовали идеально выровненные сканы известных нам документов (2-НДФЛ, закладные, разрешения на ввод в эксплуатацию, бухгалтерский баланс и т. д.), в качестве заднего плана — загруженные из интернета текстуры дерева, домашнего и офисного интерьеров, текстуры бумаги и тканей.

Примеры сгенерированных синтетических данных с наложенными поверх контрольными точками:

Данный метод генерации синтетических данных имеет один недостаток — получающиеся примеры зачастую мало похожи на реальные искажения (как минимум из-за отсутствия теней), поскольку реальные искажения происходят в трехмерном пространстве, а синтетические искажения генерируются в двумерном. Чтобы преодолеть этот недостаток, мы использовали датасет Doc3D, в котором примеры генерируются с помощью рендеринга искаженной 3D страницы с наложением текстуры и реалистичным освещением. Минус датасета состоит в том, что картинки имеют низкое разрешение (448x448 px).

Примеры из датасета Doc3D с наложенными поверх контрольными точками:

Результаты

Мы провели серию экспериментов и остановились на том, где использовался датасет из 50 000 примеров, полученных с помощью генерации искажений в 2D пространстве. Гиперпараметры выставили на основе статьи Dewarping with control points, так как в статье DocReal про гиперпараметры авторы уточнить забыли ?, а может быть просто не захотели)

В заключение

Наша команда много экспериментирует и всегда находится в поисках интересных алгоритмов и подходов к решению различных задач. Помимо приведенных методов, мы активно применяем алгоритмы по удалению линий и многоточий, апскейлинг, VAE + GAN для денойзинга (но об этом в следующий раз). Будем рады любым комментариям и дополнениям.

Комментарии (0)