OCR-конвейер для обработки документов

Сегодня я расскажу о том, как создавалась система для переноса текста из бумажных документов в электронную форму. Мы рассмотрим два основных этапа: выделение областей с текстом на сканах документов и распознавание символов в них. Кроме того, я поделюсь сложностями, с которыми пришлось столкнуться, способами их решения, а также вариантами развития системы.

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

Про OCR и цели

Оптическое распознавание символов (OCR) — перевод изображений машинописного, рукописного или печатного текста в электронные текстовые данные. Обработка данных при помощи OCR может применяться для самых различных задач:

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

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

Мы выяснили, что использование готовых продуктов для решения нашей задачи приводило бы к большим затратам и низкой производительности, вызванной ограничениями объемов обрабатываемых документов. Поэтому мы решили разработать собственную систему OCR по принципу конвейера (OCR-pipeline), в которой последовательно выполняются следующие операции:

  • загрузка скана документа;
  • извлечение слов и строк из скана;
  • распознавание символов в словах и строках;
  • формирование электронного документа.

Извлечение слов и строк

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

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

Кроме того, нейронные сети resnet имеют сложную архитектуру и применительно к данной задаче их сложнее обучить, так как они больше предназначены для классификации изображений и обнаружения небольшого количества блоков текста. Их использование значительно замедлило бы разработку конвейера и в некоторых случаях снизило бы производительность. Поэтому мы решили остановиться на методах детекции строк посредством компьютерного зрения, в частности, на методе Максимальных Стабильных Экстремальных Регионов (MSER) [1].

Пример MSER-детекции строк в документах

Примеры MSER-детекции строк в документах

В ходе MSER-детекции текст в бинаризованном изображении скана предварительно «размазывается» в пятна. На основе субпиксельных вычислений полученные пятна ограничиваются связными областями и обрамляются в прямоугольные рамки. Таким образом, происходит сжатие исходных данных — из скана с документом извлекаются изображения, ограничивающие слова и строки. Стоит отметить, что данный метод не зависит от цвета извлекаемого текста. Важно лишь только то, чтобы он был достаточно контрастен по отношению к фону.

OCR AI

Следующим этапом после MSER-извлечения изображений с текстом является распознавание символов в них. В последнее время исследования в области AI показали, что распознавание символов на изображениях успешней всего выполняется на основе глубокого машинного обучения. В частности, используются нейронные сети, содержащие много уровней (глубокие нейронные сети), которые способны самостоятельно накапливать признаки и представления в обрабатываемых данных.

Генерация данных для обучения

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

Сгенерированные строки

В качестве обучающей выборки мы использовали датасет University of Washington (UW3), состоящий из более чем 80K строк из сканированных страниц с современным деловым и научным английским языком. Однако набор геометрических и фотометрических искажений, а также количество используемых шрифтов в строках оказались недостаточными. Поэтому мы решили дополнить обучающую выборку искусственно сгенерированными строками при помощи разработанного автоматического генератора строк текста разного шрифта, цвета, фона, интерлиньяжа и т. п. Использовались 10 наиболее популярных шрифтов, встречающихся в документах: Times New Roman, Helvetica, Baskerville, Computer Modern, Arial и другие.

Дополнительной универсальности относительно шрифтов удалось достичь благодаря использованию информации из Font Map, в которой взаимное расположение шрифтов определяет их сходство — чем ближе два шрифта друг к другу, тем более они похожи. Для дообучения сети было дополнительно отобрано 10 шрифтов на карте, наиболее удалённых от тех, на которых модель уже обучена.

Карта шрифтов Font Map

Карта шрифтов Font Map fontmap.ideo.com

Архитектура сети CNN

Входные данные для обучения и распознавания сети — это части изображений сканов со строками или словами, извлеченные на этапе MSER-детекции. Выходные данные — это упорядоченные наборы символов, формирующие текст в электронном формате.

Для распознавания символов в картинках эффективно используются свёрточные нейронные сети CNN [2], формирующие представления частей изображений подобно зрительной системе человека.

Свёрточная нейронная сеть обычно представляет собой чередование свёрточных и пулинговых слоев, объединённых в свёрточные блоки (сonvolutional blocks) и полносвязных слоев на выходе (fully connected layers). В свёрточном слое веса объединяются в так называемые карты признаков (feature maps). Каждый из нейронов карты признаков связан с частью нейронов предыдущего слоя.

CNN, Convolutional Neural Network

Сети CNN базируются на математических операциях свёртки (convolutions) и последующих сокращениях размерности (pooling) с применением пороговых функций, исключающих отрицательные значения весов. Карты признаков после всех преобразований в свёрточных блоках конкатенируются в единый вектор (concatenation) на вход полносвязной сети. Рассмотрим операции свёртки и сокращения размерности подробнее.

Вычисления в свёрточной сети

В свёрточном слое входное исходное изображение или карта предыдущего свёрточного блока (input data) подвергаются операции свёртки (сonvolution) при помощи матрицы небольшого размера (ядра свёртки, сonvolution kernel), которую двигают по матрице, описывающей входные данные (input data). Выходными данными (output data) является матрица, состоящая из значений суммы попарных произведений соответствующей части входных данных с ядром свёртки. На рисунке показан пример свёрточного слоя с ядром свёртки размера 3X3.

Cвёртка (convolution)

В слое пулинга уменьшается размерность выходных данных свёрточного слоя в два этапа.

  1. Применение функции активации нейронов. Наиболее используемой функцией активации в свёрточных нейронных сетях является ReLU, которая заменяет отрицательные значения в матрице нулями. В последнее время доказали свою эффективность её разновидности — Noisy ReLU, которая заменяет отрицательные значения нулями с добавлением небольшого случайного слагаемого к положительным значениям, и Leaky ReLU, которая заменяет отрицательные значения не нулями, а случайными числами.
  2. Уменьшение размерности. Полученная после активации матрица разделяется на ячейки, в которых происходит агрегирование значений. Это можно сделать разными способами, но зачастую применяется метод выбора максимального элемента (max pooling).

Pooling

На рисунке показан пример слоя пулинга с сокращением размерности в два раза с применением ReLU и max pooling. Выходные значения передаются на вход следующего свёрточного блока или вытягиваются в вектор для полносвязного слоя, если свёрточных блоков больше нет.

Архитектура сети для OCR

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

  • свёрточных блоков CNN, извлекающих представления из изображений;
  • блоков долгой кратковременной памяти LSTM [3], каждый из которых состоит из комплекса пороговых функций, позволяющих запоминать представления как на длинные, так и на короткие промежутки времени, а также предотвращать преждевременное «забывание» представлений при обучении;
  • классификатора CTC [4], способствующего сохранению последовательности выводимых символов.

Вычислительные эксперименты

В ходе обучения мы провели серию экспериментов относительно наборов строк в обучающих выборках. Выделим основные из них: на основе только сгенерированных строк (10 наиболее популярных шрифтов + 10 шрифтов из Font Map), на основе сгенерированных строк с тремя наиболее используемыми в документах шрифтами (Times New Roman, Helvetica, Computer Modern) со строками из датасета UW3 и на основе сгенерированных строк (10 + 10 шрифтов) со строками из датасета UW3.

Экспериментальные данные

Отметим, что к концу итерационного процесса максимальная точность (accuracy) на валидационной выборке практически одинакова. Точность по тестовой выборке, напротив, имеет существенное различие — добавление строк из датасета UW3 к сгенерированным строкам повышает точность распознавания. При этом увеличение количества шрифтов в искусственно сгенерированных строках также несколько увеличивает точность распознавания.

Обучение нейросети происходило по принципу «раннего останова»: через определённое количество итераций выполнялось распознавание случайно выбранного подмножества строк из обучающей (валидационной) выборки. Если в течение нескольких таких проверок максимальное значение точности не изменялось, то итерационный процесс обучения прекращался и сохранялись веса нейронной сети для распознавания строк из документов. Время обучения рассчитывалось от начала итерационного процесса до останова. Использовались графические ускорители GPU Nvidia семейства Tesla (K8 и V100).

Рассматривались документы с разрешением сканирования от 96dpi на английском языке, в том числе с присутствием цветного текста. Построенная архитектура позволила достичь точности распознавания символов до 95-99%.

Таким образом, в качестве выходных данных мы получаем символы, объединённые в слова или строки, формирующие электронные документы.

Конвейер

Значительное ускорение обработки документов было достигнуто благодаря организации нашей системы распознавания по принципу конвейера с минимизацией простоев, а также за счёт распараллеливания вычислений в CPU и GPU и рационального использования памяти. Система развёртывалась с помощью Docker и Kubernetes.

Схема организации системы OCR AI

Организация системы OCR AI распознавания по принципу конвейера.
Длина прямоугольных блоков, описывающих процедуру обработки, схематично соответствует интервалу времени. Время выполнения каждой из процедур может различаться в зависимости от количества символов в документе.
Load Scan i — загрузка скана i-го документа,
Strokes Detection i — извлечение строк из i-го документа при помощи MSER,
Load Strokes i — OpenCV-предобработка и нормализация извлеченных строк i-го документа и загрузка на вход сети,
AI Recognition i — распознавание символов в строках i-го документа на основе построенной глубокой сети.

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

Для повышения качества обучения, защиты от переобучения и последующего распознавания в нейронной сети AI мы применяли адаптивное обновление весов сети [5], dropout-прореживание [6] и батч-нормализацию [7]. Реализация нейронной сети глубокого обучения также была написана на Python c использованием фреймворка TensorFlow. Вычисления на GPU от Nvidia поддерживались благодаря внедрению технологий CUDA и cuDNN.

Дополнительного прироста производительности предполагается достичь при помощи технологии TensorRT [8], заточенной под оптимальное использование весов сети при вычислениях в GPU, производимых Nvidia (например, таких, как Tesla или k8). При этом веса обученных моделей преобразуются в более сжатый формат с плавающей точкой. Это позволяет более чем в 40 раз повысить скорость вычислений в GPU по сравнению с CPU без видимых потерь точности распознавания.

Что дальше?

Выделим несколько направлений развития нашей системы.

  1. Сканирование может производиться разными способами и под разным углом. Следовательно, систему можно дополнить блоком предобработки скана с детектором границ и углов документа, а также с интеллектуальной фильтрацией для улучшения качества скана.
  2. Мы анализировали данные на английском языке. Следовательно, система распознавания может дополняться аналогичными моделями для поддержки нескольких языков.
  3. Данный конвейер можно применять и для обработки рукописного текста. Стоит отметить, что в этом случае для генерации обучающих выборок целесообразно применять нейронные сети GAN [9], позволяющие генерировать весьма реалистичные данные.
  4. Большие объемы текстовых данных часто требуют постобработки с использованием natural language processing. Например, машинный перевод или разделение документов по тематикам с применением латентного размещения Дирихле (LDA) [10].

Дополнительно

[1]
wiki: en.wikipedia.org/wiki/Maximally_stable_extremal_regions
paper: J. Matas, O. Chum, M. Urban, and T. Pajdla. «Robust wide baseline stereo from maximally stable extremal regions.» Proc. of British Machine Vision Conference, pages 384-396, 2002. cmp.felk.cvut.cz/~matas/papers/matas-bmvc02.pdf

[2]
wiki: en.wikipedia.org/wiki/Convolutional_neural_network
paper: LeCun, Yann; Léon Bottou; Yoshua Bengio; Patrick Haffner (1998). «Gradient-based learning applied to document recognition» (PDF). Proceedings of the IEEE. 86 (11): 2278–2324 yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf

[3]
wiki: en.wikipedia.org/wiki/Long_short-term_memory
paper: Sepp Hochreiter; Jürgen Schmidhuber (1997). «Long short-term memory». Neural Computation. 9 (8): 1735–1780. www.bioinf.jku.at/publications/older/2604.pdf

[4]
wiki: en.wikipedia.org/wiki/Connectionist_temporal_classification
paper: Graves, Alex; Fernández, Santiago; Gomez, Faustino (2006). «Connectionist temporal classification: Labelling unsegmented sequence data with recurrent neural networks». In Proceedings of the International Conference on Machine Learning, ICML 2006: 369–376. www.cs.toronto.edu/~graves/icml_2006.pdf

[5]
wiki: en.wikipedia.org/wiki/Stochastic_gradient_descent
paper: Diederik, Kingma; Ba, Jimmy (2014). «Adam: A method for stochastic optimization». arxiv.org/pdf/1412.6980.pdf

[6]
wiki: en.wikipedia.org/wiki/Dropout_(neural_networks)
paper:  Nitish Srivastava, Geoffrey Hinton, Alex Krizhevsky, Ilya Sutskever and Ruslan Salakhutdinov. «Dropout: A Simple Way to Prevent Neural Networks from Overfitting». Jmlr.org. Retrieved July 26, 2015. jmlr.org/papers/volume15/srivastava14a/srivastava14a.pdf

[7]
wiki: en.wikipedia.org/wiki/Batch_normalization
paper: Ioffe, Sergey; Szegedy, Christian (2015). «Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift» arxiv.org/pdf/1502.03167.pdf

[8]
site: developer.nvidia.com/tensorrt

[9]
wiki: en.wikipedia.org/wiki/Generative_adversarial_network
paper: Goodfellow, Ian; Pouget-Abadie, Jean; Mirza, Mehdi; Xu, Bing; Warde-Farley, David; Ozair, Sherjil; Courville, Aaron; Bengio, Yoshua (2014). Generative Adversarial Networks (PDF). Proceedings of the International Conference on Neural Information Processing Systems (NIPS 2014). pp. 2672–2680. papers.nips.cc/paper/5423-generative-adversarial-nets.pdf

[10]
wiki: en.wikipedia.org/wiki/Latent_Dirichlet_allocation
paper: Blei, David M.; Ng, Andrew Y.; Jordan, Michael I (January 2003). Lafferty, John (ed.). «Latent Dirichlet Allocation». Journal of Machine Learning Research. 3 (4–5): pp. 993–1022. www.jmlr.org/papers/volume3/blei03a/blei03a.pdf

Вам также может понравиться:

Блог Доступный дизайн компонентов на примерах
15 ноября, 2021
Статья об основных руководствах по доступности и о ключевых моментах, на которые стоит обратить внимание, а именно: о порядке фокуса, о клавиатурном взаимодействии и об ARIA-атрибутах.
Блог Разработка системы тестирования SQL запросов. Часть 2
29 сентября, 2021
Продолжение истории о фреймворке, разработанном с целью автоматизации и упрощения процесса тестирования сложных SQL-запросов на крупном проекте.
Блог Техники обработки отказов сервиса в микросервисных архитектурах
07 сентября, 2021
Эта статья может быть полезна для тех, кто пострадал от нестабильной работы внешних API: какие бывают стратегии обработки отказов и какой путь избрали мы.