В прошлой статье я кратко описал методы и подходы, которые мы используем в inDriver при распознавании фото документов. Во второй части подробно опишу архитектуру CRAFT и CRNN, а также варианты их использования. Прошу под кат!
![](https://habrastorage.org/getpro/habr/upload_files/42f/a05/b02/42fa05b02aefef75a81e1003d237212c.png)
Содержание
CRAFT
CRAFT Scene Text Detection — это задача для обнаружения текстовых областей на сложном фоне и маркировки их ограничивающими рамками. Модель CRAFT была предложена в 2019 году, ее основная цель — локализовать отдельные области символов и связать обнаруженные символы с экземпляром текста.
CRAFT использует fully convolutional network архитектуру, основанную на VGG-16 c batch normalization в качестве backbone (базовой сети). Модель VGG16 используется для извлечения признаков и нужна для кодирования входных данных сети в определенное представление признаков. Модель имеет skip connections (пропускные соединения) в части декодирования, которая похожа на UNet в том, что агрегирует низкоуровневые функции через UpConv.
![Архитектура CRAFT Архитектура CRAFT](https://habrastorage.org/getpro/habr/upload_files/7e9/b03/137/7e9b03137aae9ef83eb78d5cdf9776f5.png)
CRAFT на выходе дает 2 оценки для каждого символа:
character region score (оценка области символа).
affinity score (оценка близости символа). Здесь определяется, можно ли символы объединить в одно слово.
Иными словами, region score используется для локализации отдельных символов на изображении, а affinity score — для группировки каждого символа в одно слово.
Процесс обучения
Чтобы компенсировать отсутствие аннотаций на уровне символов, используется weakly-supervised learning framework (слабо контролируемая система обучения). Она оценивает ground truths (эталонные данные) на уровне символов в существующих наборах данных на уровне реальных слов.
![Визуализация работы CRAFT для текстов различной формы. (a) — тепловые карты, (b) — результаты обнаружения текстов различной формы Визуализация работы CRAFT для текстов различной формы. (a) — тепловые карты, (b) — результаты обнаружения текстов различной формы](https://habrastorage.org/getpro/habr/upload_files/996/65a/96c/99665a96c3edbc6e0daa47ae8eadc362.png)
Главная цель — точно локализовать каждый отдельный символ на естественных изображениях. С этой целью нейронная сеть обучается предсказывать область символов и близость между ними. Так как общедоступного набора данных на уровне символов нет, модель обучается со слабым контролем (weakly-supervised manner).
Ground Truth Label Generation
Для каждого тренировочного изображения мы генерируем ground truth label для region score и affinity score с bounding boxes на уровне символа. Region score представляет собой вероятность того, что данный пиксель является центром символа, affinity score — вероятность пробела между соседними символами.
В отличие от бинарной карты сегментации, которая помечает каждый пиксель дискретно, мы кодируем вероятность центра символа с помощью гауссовой карты интенсивности (Gaussian heatmap). Мы используем представление тепловой карты для оценки как region score, так и affinity score.
![Gaussian heatmap Gaussian heatmap](https://habrastorage.org/getpro/habr/upload_files/9fe/ecb/470/9feecb47049674848cff824caeaa0241.png)
![Процедура генерации эталонных данных. Создаются ground truth labels на основе синтетического изображения с аннотациями на уровне символов Процедура генерации эталонных данных. Создаются ground truth labels на основе синтетического изображения с аннотациями на уровне символов](https://habrastorage.org/getpro/habr/upload_files/62d/8cf/352/62d8cf3528537f77902cf773442cb3c0.png)
Вычисление значения распределения Гаусса непосредственно для каждого пикселя в bounding box занимает очень много времени. Поскольку bounding box символов на изображении обычно искажаются из-за перспективных проекций, используются следующие шаги для аппроксимации и генерации ground truth как для region score, так и для affinity score:
Подготавливается двумерная изотропная гауссова карта.
Вычисляется перспективное преобразование между областью гауссовой карты и каждым блоком символов.
Происходит деформация (warp) карты Гаусса в область прямоугольника (box area).
Для ground truth affinity score аффинные блоки определяются с использованием смежных блоков символов. Рисуя диагональные линии для соединения противоположных углов каждого блока символов, мы можем сгенерировать 2 треугольника, которые назовем верхним и нижним символьным треугольником. Затем для каждой смежной пары создается поле сходства (affinity box), устанавливая центры верхнего и нижнего треугольников в качестве углов поля.
Предлагаемое определение ground truth позволяет модели обнаруживать большие или длинные текстовые экземпляры, несмотря на использование небольших воспринимающих полей. Обнаружение на уровне символа позволяет сверточным фильтрам фокусироваться только на внутрисимвольных и межсимвольных полях, а не на всем экземпляре текста.
Weakly-Supervised Learning
В отличие от синтетических наборов данных, реальные изображения обычно имеют аннотации на уровне слов. Здесь мы генерируем символьные боксы из каждой аннотации на уровне слов в слабо контролируемой манере (weakly-supervised manner).
Когда предоставляется реальное изображение с аннотациями на уровне слов, изученная промежуточная модель предсказывает оценку области символов обрезанного изображения слов для создания ограничивающих рамок.
Чтобы отразить надежность прогноза промежуточной модели, значение карты достоверности (confidence map) для каждого блока слов вычисляется пропорционально количеству обнаруженных символов, деленному на количество основных символов истинности.
![Обучение проводится с использованием как реальных, так и синтетических изображений под слабым контролем (weakly-supervised fashion) Обучение проводится с использованием как реальных, так и синтетических изображений под слабым контролем (weakly-supervised fashion)](https://habrastorage.org/getpro/habr/upload_files/04f/b48/227/04fb48227043b4e3bcba3da0b14c79e0.png)
![Процесс разделения символов Процесс разделения символов](https://habrastorage.org/getpro/habr/upload_files/aa8/091/3c5/aa80913c56d9e62f0ba288413dd850f7.png)
Сначала изображения на уровне слов обрезаются из исходного изображения (word box), потом модель делает оценку region score. А далее алгоритм watershed labeling разделяет области символов, чтобы построить bounding box вокруг каждого символа. После координаты символьных полей преобразуются обратно в исходные координаты изображения с помощью обратного преобразования из croping.
Когда модель обучается с использованием слабого контроля (weak-supervision), мы вынуждены тренироваться с неполными pseudo-GTs (pseudo-ground truths). Если модель обучена с неточными region score, выходные данные могут быть размыты в области символа. Чтобы предотвратить это, мы измеряем качество каждой pseudo-GTs сгенерированной моделью.
К счастью, в текстовой аннотации есть очень сильная подсказка — длина слова. В большинстве наборов данных предоставляется транскрипция слов, и длина слов может использоваться для оценки достоверности pseudo-GTs.
Для аннотированной выборки на уровне слова (word-level) обучающих данных пусть
и
будут bounding box и длиной слова выборки
соответственно. Посредством процесса разделения символов мы можем получить оценочные ограничивающие прямоугольники символов и соответствующую им длину символов
. Затем оценка достоверности (confidence score)
для выборки
вычисляется как:
Оценка достоверности по пикселямдля изображения вычисляется как:
обозначает пиксель в области
. Объект
(Loss Function) определяется как:
и
обозначают pseudo-ground truth region score и affinity map, соответственно. А
— прогнозируемую region score и affinity score. При обучении с использованием синтетических данных мы можем получить реальную достоверную информацию, поэтому для
установлено значение 1. По мере выполнения обучения модель CRAFT может предсказывать символы более точно, а оценки достоверности
постепенно увеличиваются.
![Карта region score-символов в процессе обучения Карта region score-символов в процессе обучения](https://habrastorage.org/getpro/habr/upload_files/e77/bff/b30/e77bffb302add81ec5769512425ff03d.png)
На начальных этапах обучения region scores относительно низкие для незнакомого текста в естественных изображениях. Модель изучает внешний вид новых текстов и синтезированные тексты, которые имеют другое распределение данных по сравнению с набором данных SynthText.
Если показатель достоверности ниже 0,5, предполагаемыми bounding box символами следует пренебречь, поскольку они имеют неблагоприятные эффекты при обучении модели. В этом случае мы предполагаем, что ширина отдельного символа постоянна, и вычисляем предсказания на уровне символа, просто разделив область слова
на количество символов
. Затем
устанавливается на 0,5 для изучения невидимого внешнего вида текстов.
![Обучение на синтетических данных Обучение на синтетических данных](https://habrastorage.org/getpro/habr/upload_files/c98/f8b/c8e/c98f8bc8e7c2db606fb5d86478c5d83f.png)
![Обучение на реальных данных Обучение на реальных данных](https://habrastorage.org/getpro/habr/upload_files/deb/745/b71/deb745b71c37d11531d2195cba3aadde.png)
Inference
На этапе логического вывода окончательный результат может быть представлен в различных формах. Например, в текстовых блоках или блоках символов, а также в других многоугольниках.
Для наборов данных, таких как ICDAR, протокол оценки представляет собой пересечение над объединением на уровне слов (). Поэтому здесь мы описываем, как сделать QuadBox ограничивающими прямоугольниками на уровне слов с помощью простого, но эффективного шага постобработки.
Постобработка для поиска ограничивающих рамок резюмируется следующим образом. Сначала двоичная карта M, покрывающая изображение, инициализируется значением 0.устанавливается в
, если
или
, где
— region threshold,
— affinity threshold. Затем выполняется Connected Component Labeling (CCL) на M. Наконец, QuadBox получается путем нахождения повернутого прямоугольника с минимальной площадью, охватывающей соединенные компоненты, соответствующие каждой из меток. Для этой цели могут применяться функции connectedComponents и minAreaRect, предоставляемые OpenCV.
Преимущество CRAFT в том, что ему не нужны дополнительные методы постобработки, такие как Non-Maximum Suppression (NMS). Поскольку у нас есть капли изображений областей слов, разделенных CCL, bounding box для слова просто определяется одним охватывающим прямоугольником. С другой стороны, наш процесс связывания символов выполняется на уровне пикселей, которые явно полагаются на поиск отношений между текстовыми компонентами.
Кроме того, мы можем создать многоугольник вокруг всей области символов, чтобы эффективно работать с изогнутыми текстами.
![Генерация полигонов для текстов произвольной формы Генерация полигонов для текстов произвольной формы](https://habrastorage.org/getpro/habr/upload_files/a40/ec2/218/a40ec22186d9864e35118e843dd98f44.png)
Первый шаг — найти линию локальных максимумов областей символов вдоль направления сканирования (как показано на рисунке синими стрелками). Длины линий локальных максимумов одинаково установлены как максимальная длина среди них, чтобы конечный результат многоугольника не стал неровным. Линия, соединяющая все центральные точки локальных максимумов, называется центральной линией и показана желтым. Затем линии локальных максимумов поворачиваются так, чтобы они были перпендикулярны центральной линии и отразили угол наклона символов, как показано красными стрелками.
Конечные точки линий локальных максимумов являются кандидатами в контрольные точки текстового многоугольника. Чтобы полностью покрыть текстовую область, мы перемещаем 2 крайние наклонные линии локальных максимумов наружу вдоль центральной линии локальных максимумов, создавая окончательные контрольные точки (зеленого цвета).
![Результаты для всего набора текстовых данных Результаты для всего набора текстовых данных](https://habrastorage.org/getpro/habr/upload_files/5a7/a8a/9e1/5a7a8a9e158df7654aa460e2a3e6202a.png)
Первая строка изображения выше: в каждом столбце показано входное изображение (вверху) с соответствующей картой оценки региона (внизу слева) и картой сходства (внизу справа). Вторая строка: в каждом столбце отображается только входное изображение (слева) и карта оценки региона (справа).
Training Strategy
Процедура обучения включает в себя 2 шага:
Используем набор данных SynthText для обучения сети для 50 тысяч итераций.
Каждый набор тестов принимается для точной настройки модели.
Некоторые текстовые области «DO NOT CARE» в наборах данных ICDAR 2015 и ICDAR 2017 игнорируются при обучении, если для s_{conf} (w) установлено значение 0. Рекомендую использовать оптимизатор ADAM во всех процессах обучения.
Для обучения без учителя требуются 2 типа данных: четырехугольные аннотации для обрезки изображений слов и транскрипции для расчета длины слова. Этим условиям соответствуют наборы IC13, IC15 и IC17.
В общем доступе можно найти предобученную модель CRAFT только на наборах данных ICDAR и протестированную на других без тонкой настройки. 2 разные модели обучаются с наборами данных ICDAR. Первая модель обучается на IC15 только для оценки IC15. Вторая модель обучается как на IC13, так и на IC17 вместе, что используется для оценки других 5 наборов данных. Никакие дополнительные изображения для обучения не используются. Количество итераций для точной настройки установлено равным 25k.
В случае набора данных CTW-1500 сосуществуют 2 сложные характеристики: аннотации, которые предоставляются на уровне строк и имеют произвольные полигоны. Чтобы исправить это, добавляется еще одна нейронная сеть — LinkRefiner.
LinkRefiner
Входные данные LinkRefiner представляют собой объединение region score, affinity score и промежуточной карты объектов CRAFT. Выходные данные — уточненную affinity score, скорректированную для длинных текстов. Для объединения символов вместо исходной affinity score используется уточненная affinity score, затем генерация полигонов выполняется так же, как и для TotalText. Только LinkRefiner обучен на наборе данных CTW-1500 все то время, пока CRAFT заморожен.
![Архитектура LinkRefiner Архитектура LinkRefiner](https://habrastorage.org/getpro/habr/upload_files/fe6/6f8/036/fe66f80363a6db97a185f713dd4d8970.png)
Набор данных CTW-1500 предоставляет аннотации только для полигонов без текстовых транскрипций. Кроме того, аннотации CTW-1500 предоставляются на уровне строк и не рассматривают пробелы в качестве разделительных сигналов. Это далеко от нашего предположения о близости (affinity), которое заключается в том, что оценка близости равна нулю для символов с пробелом между ними.
Чтобы получить один длинный полигон из обнаруженных символов, мы используем мелкую сеть для уточнения ссылок — LinkRefiner. Входные данные LinkRefiner представляют собой объединение оценки региона (region score), оценки сходства (affinity score) и промежуточной карты объектов из сети, которая является результатом Stage4 Block исходной модели CRAFT.
Для ground truth LinkRefiner-линии просто рисуются между центрами парных контрольных точек аннотированных полигонов, что аналогично генерации текстовых строк. Ширина каждой линии пропорциональна расстоянию между парными контрольными точками. Выходные данные модели называются оценкой связи.
![Ground truth generation for the LinkRefiner Ground truth generation for the LinkRefiner](https://habrastorage.org/getpro/habr/upload_files/26c/804/f68/26c804f6826f7afadf3741a51a69a4e0.png)
После обучения у нас есть результаты, полученные моделью, которые представляют собой оценку региона (region score), оценку сходства (affinity score) и оценку связи (link score). Здесь оценка связи (link score) используется вместо исходной оценки сходства (affinity score), и текстовый полигон получается полностью с помощью того же процесса, что и в TotalText. Модель CRAFT локализует отдельные символы, а модель LinkRefiner объединяет символы и слова, разделенные пробелами, которые требуются для оценки CTW-1500.
![Результаты по набору данных CTW-1500 Результаты по набору данных CTW-1500](https://habrastorage.org/getpro/habr/upload_files/2af/a88/0b0/2afa880b0600eb050f3c0ed277ed1a8d.png)
Предложенным методом успешно обнаруживаются очень сложные образцы изображений с длинными и изогнутыми текстами. Более того, с помощью полигонального представления изогнутые изображения могут быть преобразованы в прямые текстовые изображения.
В конце рассказа о CRAFT поделюсь рядом полезных материалов:
Сейчас SoTA в области детекции текста является TextFuseNet (он точнее CRAFT, но медленнее).
Пример на датасете ICDAR 2015:
recall | precision | |
TextFuseNet | 88.9 | 91.3 |
CRAFT | 84.3 | 89.8 |
Для классификации символов изображений были обучены модели efficientnet и семислойная CNN. На тестах лучше себя показала более простая модель CNN.
Для масок, где не получалось выделить символы в силу потертости и измятости бумаги (особенно актуально для матричных шрифтов), хорошо показала себя модель CRNN. Единственная проблема — нужен большой набор размеченных данных.
CRNN
Модель CRNN представляет собой комбинацию сверточной нейронной сети backbone CNN и рекуррентной нейронной сети RNN. RNN способны улавливать в скрытом состоянии временные и пространственные особенности в последовательности входных данных. Поэтому они подходят для таких задач, как распознавание рукописного ввода и речи.
![Архитектура CRNN Архитектура CRNN](https://habrastorage.org/getpro/habr/upload_files/4f0/d84/a54/4f0d84a5421a14c7882e55b4d5bc1907.png)
![Пример модели CRNN, где k — kernel size, s — stride, p — padding size Пример модели CRNN, где k — kernel size, s — stride, p — padding size](https://habrastorage.org/getpro/habr/upload_files/11a/a5b/8a4/11aa5b8a4cf3ffffac63855582a44654.png)
В CRNN в конце fully-connected layers (полносвязные слои) не используются, вместо этого выходные данные сверточных слоев (карт признаков) преобразуются в последовательность векторов признаков.
![Представление преобразования карт признаков в последовательность векторов признаков Представление преобразования карт признаков в последовательность векторов признаков](https://habrastorage.org/getpro/habr/upload_files/664/640/abe/664640abe3cba4f900db793d580b50b8.png)
Затем эти векторы передаются в некоторый тип двунаправленной RNN (в нашем случае LSTM). Эта часть модели производит распределение вероятностей для каждого вектора признаков и каждой метки.
В качестве loss-функции используется CTC (Connectionist Temporal Classification) loss. На вход подается одноканальное изображение, а также символы классификации с учетом пробела (обычно он имеет индекс=0). В качестве CTC decoder мы используем greedy_decoder (к сожалению, в pytorch его еще не добавили).
Вариантов CRNN может быть много. Вместо LSTM можно использовать GRU, которая проще и требует меньше ресурсов при обучении. В качестве backbone-сети вместо CNN в примере можно взять другие сети: например, densenet, resnet, mobilenet и т.д. Также CRNN может быть использована для задачи классификации аудио по спектрограммам.
Общий подход к распознаванию документов
Сегментируем нужные области в документе, желательно без лишней информации (рамок, ненужных надписей), чтобы в дальнейшем упростить препроцессинг.
Пробуем с помощью CRAFT получить координаты бокса каждого символа, далее сортируем их по порядку (по оси X). Если удается разделить все символы, переходим к пункту 3, если нет — к пункту 4.
Запускаем модель классификации по символам. Если точность не устраивает — дообучаем модель, добавляя новые экземпляры символов.
Размечаем датасет, добавляем синтетические данные и обучаем модель CRNN.
Также для ускорения работы моделей можно перевести их в TensorRT. Если PyTorch — с помощью библиотеки Torch-TensorRT или через конвертацию весов в формат ONNX.
Спасибо, что дочитали статью до конца. Если у вас остались вопросы, буду рад ответить на них в комментариях.