Оглавление
- Зачем это нужно?
- Существующие решения. Что хотим улучшить и дополнить?
- Примеры фейковых фото паспорта, на которых будем вести работы
- Подготовка изображения без использования нейросетей. Алгоритмы бинаризации
- Как бы это сделали недавно — лет этак 10 назад
- Создаём своё решение для распознавания документов. Первая версия (не во всём удачная) с готовыми моделями нейросетей — YOLO и Tesseract
- Регрессионная нейронная сеть для определения координат
- Датасет для дообучения модели
- Используем текстовые области для определения угла поворота паспорта
- Как найти области текста — нейросеть YOLO
- Детектируем контур документа
- Сегментирующая нейросеть
- Поиск областей с текстом и распознавание с помощью библиотеки Tesseract
- Разделение распознанного текста по смыслу
- Повышаем качество распознавания текста, усложняем нейросеть
- Как соединить функционал распознавания с 1С. Интерфейс в 1C и пример использования
- Заключение
Зачем это нужно?
Обработка паспортных данных необходима многим компаниям. Особенно это актуально в банковском, страховом и туристическом бизнесе, электронной коммерции с большим количеством клиентов и транзакций.
Использование технологий распознавания позволяет:
- ускорить ввод данных и уменьшить время обслуживания клиентов;
- минимизировать количество ошибок;
- повысить эффективность работы сотрудников.
Вместо ручного вбивания паспортных данных система распознает паспортные данные за секунды и заносит их в информационную базу. Технология уже применяется не только для паспортов, но и для других документов.
Существующие решения. Что хотим улучшить и дополнить?
Специалисты «1С‑Рарус» изучили решения для распознавания документов: от базовых систем оптического распознавания до сложных систем с интеграцией машинного обучения и искусственного интеллекта.
Основные категории и примеры решений по распознаванию документов:
Решения на базе OCR (оптическое распознавание символов)
| Решение | Описание | Преимущества | Недостатки |
|---|---|---|---|
Tesseract |
Бесплатная и открытая библиотека OCR, разработанная Google. Поддерживает множество языков и может использоваться для распознавания текста в изображениях, включая паспорта. |
|
|
ABBYY FineReader |
Поддержка OCR позволяет конвертировать сканированные документы в редактируемые форматы. |
|
|
Специализированные решения для распознавания документов
| Решение | Описание | Преимущества | Недостатки |
|---|---|---|---|
Jumio |
Идентификации и верификации личности с помощью сканирования паспортов и других идентификационных документов. |
|
|
IDnow |
Платформа для оптического распознавания, поддерживающая различные форматы и области применения. |
|
|
Интегрированные решения для бизнеса
| Решение | Описание | Преимущества | Недостатки |
|---|---|---|---|
Veriff |
Платформа, предлагающая удаленные проверки удостоверений, включая паспорта и ID-карты, с помощью AI. |
|
|
Onfido |
Решение использует AI для распознавания паспорта и проверки подлинности документов. |
|
|
Microsoft Azure Cognitive Services |
Платформа, предоставляющая различные API, включая OCR, для распознавания текста на изображениях. |
|
|
Google Cloud Vision |
Облачное решение, предлагающее мощные инструменты для анализа изображений, в том числе OCR. |
|
|
Применимость существующих решений на практике
Выбор подходящего решения зависит от потребностей бизнеса, объема обрабатываемых данных, необходимого уровня безопасности и бюджета. Нужно изучить и протестировать варианты перед выбором.Следует обратить внимание, что не все применимы для распознавания документов в Российской Федерации.
Для проведения тестирования важно иметь доступ к большим объемам качественной информации. Автор статьи столкнулся с проблемой недостатка данных, поэтому решил генерировать данные самостоятельно или использовать общедоступные источники.
Примеры фейковых фото паспорта, на которых будем вести работы
Исследуемая область достаточно чувствительна к получению данных. Паспорта относятся к конфиденциальным данным, не всегда возможно собрать достаточный материал для проведения исследований и работ.
Поэтому было принято решение скачать из интернета фейковые изображения паспортов, не имеющие конфиденциальную информацию. Например, такие:
Из фейковых изображений можно собрать достаточный материал для тестирования.
При выборе модели для решения данной задачи будем использовать нейросети.
Нейросети помогают решать различные задачи машинного обучения: классификация, прогнозирование, сегментация и генерация данных.
Наличие большого объема данных является одним из критических факторов для успешного обучения нейросетей. Это позволяет моделям обобщать, выявлять сложные зависимости, повышать качество предсказаний и обеспечивать устойчивость к варьирующимся условиям.
Но сначала давайте немного отступим от нейросетей, и посмотрим на применяемые методы и алгоритмы века минувшего.
Подготовка изображения без использования нейросетей. Алгоритмы бинаризации
Представим, что мы вернулись в прошлое на четверть века. 25 лет срок не такой уж и большой, но за этот период как теоретическая, так и техническая часть, а именно мощность компьютеров, появление мощных GPU, кластеров, продвинулись далеко вперед, что позволило подступиться к задачам ранее считающимися невозможными. Особенно на машинное обучение повлияло появление больших объемов данных в свободном доступе — imagent, coco и пр. Но приступая к любой задаче лучше идти от простого к сложному.
Простые методы часто имеют достаточно четкое математическое обоснование, что позволяет проверить ответ модели, как говориться «на кончике пера». Ответ модели можно проверить, понять почему модель приняла такое решение. Проще определять границы применимости модели и т. д. Но за простотой часто скрывается как мощь, так и слабость модели. Например, линейной регрессией не решишь сложных задач классификации на несколько классов.
Мы пройдем этим путем, и рассмотрим простой, но интересный метод, который использовали на заре нашей эры :-)
Метод бинаризации Оцу
Давайте посмотрим на наш паспорт (все эксперименты по принятым решениям будем тестировать на этом фото):
В принципе, фон достаточно однородный, буквы и фото достаточно хорошо выделяются. Попробуем применить простую бинаризацию Оцу.
Метод бинаризации Оцу является эффективным и широко используемым инструментом для преобразования изображений в бинарный формат. Он позволяет автоматизировать процесс выбора оптимального порога для разделения объекта и фона — отсюда, кстати и название бинаризация, т. е. преобразование изображения в два оттенка — 0 это фон, и 1 — это объекты интереса, обеспечивая при этом высокую точность и простоту реализации. Тем не менее, как и любой другой метод, Оцу имеет свои ограничения, которые следует учитывать при его использовании: для хорошего разделения на фон и не фон изображение должно быть бимодальным — иметь два пика на гистограмме яркости.
Гистограмму яркости получаем следующим образом — переводим цветную картинку в формат оттенков серого, т. е. просто интенсивность, где значение каждого пикселя лежит в интервале от 0 до 255. Тогда каждый пиксель уже будет не в формате RGB (красный, зеленый, голубой), где каждый канал задается значением от 0 до 255, а в одноканальном формате, где значение канала также от 0 до 255. Значение одноканального изображения можно вычислить просто как gray = (R + G + B) / 3. Ну или в более принятой форме как gray = 0,299 × R + 0,587 × G + 0,114 × B.
Коэффициенты перед красной, зеленой и голубой компонентами подобраны таким образом, чтобы учесть тот факт, что глаз человека по разному чувствителен к разным длинам волн, а значит к разным цветам светового спектра.
Человеческий глаз более чувствителен к зеленым оттенкам, чем к красным и синим. Это означает, что зеленый цвет воспринимается как наиболее «яркий». Поэтому ему назначается наибольший вес 0,587.
Менее чувствителен к синему цвету, поэтому ему назначается наименьший вес 0,114.
Красный цвет занимает среднее положение: воспринимается лучше, чем синий, но хуже, чем зеленый, поэтому ему присваивается вес 0,299.
Далее в массиве из 256 чисел считаем количество этих чисел в картинке в оттенках серого. Это и будет гистограмма яркости. Гистограмма яркости широко используется при балансировке фото по яркости. Т. к. где пик, там и максимальное количество значений яркости на фото. Если пик сдвинут вправо, то фото более светлое, иначе более темное.
Здесь приведены различные виды распределений яркости. Для бимодального распределения четко видны два «всплеска». При данном условии метод Оцу будет неплохо работать. Применим его.
Сначала построим гистограмму распределения яркости:
Что мы здесь видим? Распределение больше похоже на одномодальное распределение со смещением вправо. Почему вправо? Потому что на фото очень много светлых областей, а это как раз ближе к 250 (это самая яркая компонента или белый цвет). Если посмотрим на наше фото, то действительно, белого очень много.
Производим бинаризацию Оцу. Алгоритм позволяет разделить пиксели двух классов («полезные» и «фоновые»), рассчитывая такой порог, чтобы внутриклассовая дисперсия, или разброс относительно среднего внутри класса фон / не фон, была минимальной. А межклассовая дисперсия максимальной.
Т. е. алгоритм автоматически ищет тот порог, который оптимальным образом разделяет пиксели на изображении на фоновые и на не фоновые.
Результат так себе. Какое распределение, такой и результат бинаризации. Следовательно, данный метод не применим. Хотя, некоторые цифры выделены хорошо, но остальной контекст выделен с разрывами, что не позволит хорошо найти позиции букв и цифр.
Адаптивная бинаризация
Адаптивная бинаризация — это мощный метод для улучшения качества бинаризации изображений в условиях, когда освещение неравномерно. Он позволяет достичь более точного разделения объектов и фона по сравнению с традиционными методами, однако требует тщательной настройки и может потребовать дополнительных вычислительных ресурсов.
Основной настраиваемый параметр — это область, внутри которой вычисляется параметр сглаживания.
Для нашего алгоритма адаптивной бинаризации этот параметр имеет смысл области для вычисления среднего значения вокруг бинаризуемой точки.
Видим, что при увеличении размера блока количество шумов увеличивается. Т. е. надо будет при выборе этого метода производить постобработку и убирать шумы. Что тоже является не тривиальной задачей, хотя и решаемой в определенных пределах.
Бинаризация по порогу
Бинаризация по порогу — это простой, но эффективный метод обработки изображений, который позволяет выделить объекты из фона. Его правильное применение может существенно улучшить результаты анализа изображений и повысить эффективность различных алгоритмов компьютерного зрения. Однако стоит помнить о возможных ограничениях, связанных с выбором порога и качеством исходных данных.
Основная проблема в этом методе — правильный выбор порога отсечки.
Здесь под порогом отсечки следует понимать значение, более которого пиксели будут относиться к не фону, иначе к фону.
Видно, что метод очень чувствителен к выбору порога отсечки.
Давайте еще раз посмотрим на гистограмму распределения:
Что мы здесь видим?
У нас есть пик на 200 и на 230. И также есть длинный хвост левее 160. Скорее всего, этот хвост отвечает за черные символы — это и понятно, т. к. темные области имеют меньшую интенсивность — и значение много меньше 250, а правее 160 — за фон.
Произведем бинаризацию по коэффициенту отсечки 160:
В принципе, если правильно подобрать порог, то метод может быть рабочим. Но проблема выбора этого порога достаточно сложная, а в общем случае — нерешаемая задача. Т. к. условия освещенности всегда разные, фон паспорта может очень сильно варьироваться. Следовательно, отсюда вытекает идея — чем меньше область, тем фон в ней в среднем более постоянный, а значит и алгоритмы бинаризации будут работать лучше. Давайте попробуем найти на паспорте области, в которых предположительно есть текст.
Выделение областей
Что мы хотим? Хотим найти области, где есть текст. И далее уже работать с этими областями.
Например, найдя область текста с фамилией:
Мы можем произвести распознавание текста только внутри этой области, да и методы бинаризации будут работать более стабильно.
Как будем выделять области?
Методов много. Давайте применим простой, но достаточно эффективный метод — адаптивный метод размытия. Размывать будем там, где изображение слабо меняется, а там где сильно, размывать не будем. В результате шума на изображении после бинаризации станет меньше, а важная информация останется. К важной информации мы относим ту, которая имеет большую изменяемость на фото, например, буквы. Для фона изменяемость будет мала — это места между буквами. Еще понятие изменяемость мы ранее в статье называли умным словом дисперсия.
Будем делать так — размываем изображение Гауссовым фильтром, потом делаем выделение градиентов фильтром Собеля, производим расчет значений средней амплитуды градиентов, далее производим расчет маски, где значение 255 будет там, где амплитуда градиента больше среднего значения амплитуды градиентов, и ноль иначе. Далее на неразмытом изображении, где значение пикселей 255, оставляем изображение как есть, иначе заменяем на размытое изображение.
Гауссово размытие — это метод обработки изображений, который используется для уменьшения шума и деталей в изображениях. Он основывается на применении двумерного гауссового фильтра, который сглаживает изображение, при этом интенсивность размытия зависит от расстояния до центрального пикселя.
Гауссово размытие широко применяется в различных задачах обработки изображений, таких как:
- уменьшение шума;
- подготовка изображений для детекции границ;
- улучшение визуализации.
g(x, y) = 1 / (2 × pi × sigma ^ 2) × exp( − (x^2 + y ^2) / (2 × sigma^2))
Где:
(x, y) — координаты точек размываемого изображения;
pi — число Пи (3,14.....);
sigma — ширина области действия фильтра. Чем больше, тем больше будет учет дальних пикселей от центра.
Фильтр Собеля — это оператор, который используется в обработке изображений для определения градиента яркости в изображениях, а соответственно, и для выделения границ. Он применяется при обработке изображений для повышения контрастности границ объектов.
Где:
А — область 3 на 3 в исходном изображении.
Оператор * означает оператор свертки.
Gx, Gy — два изображения, получающиеся в результате наложения двух операторов свертки.
В каждой точке изображения приближённое значение величины градиента можно вычислить путём использования полученных приближенных значений производных:
Используя эту информацию, мы можем также вычислить направление градиента:
Фильтр Собеля основывается на применении свертки изображения с заранее заданным ядром (фильтром), который помогает вычислить производную изображения, указывающую направление и величину изменения интенсивности пикселей.
Работает это следующим образом — начинаем с левого верхнего угла изображения, отступаем по одному пикселю от краев, и для каждого пикселя накладываем эти дви матрицы — Gx и Gy. Центральный пиксель точно «ляжет» на текущий сканируемый пиксель. Умножаем значения интенсивностей вокруг пикселя на значения матриц, и запоминаем результат. И так «пробегаемся» по всему фото. А далее для каждого пикселя считаем градиент по вышеприведенной формуле
.
Фильтр Собеля — это мощный инструмент для определения границ и выделения важных деталей в изображениях. Он часто используется в задачах компьютерного зрения и может служить основой для более сложных алгоритмов обработки изображений.
Отобразим этапы обработки нашего тестового паспорта.
Результат применения Гаусового размытия:
Видим, что применение фильтра Гаусса с сигмой равной 33 × 33 делает картинку практически не читаемой, но хорошо сглаживает артефакты — шумы на изображении.
Далее применяем фильтр Собеля с размером матрицы равной 3 × 3:
Мы получили карту границ.
Рассчитываем среднюю амплитуду. У нас получилось 7,72.
Под средней амплитудой здесь понимается сумма значений градиентов по всему фото, деленное на количество пикселей, участвующих в расчете градиента. Граничные пикселя не учитываем.
Далее оставляем на фото те границы, амплитуда которых больше чем 0,7 средней амплитуды (0,7 выбрано эмпирическим путем — это настраиваемый гиперпараметр этой модели):
Вот фактически, белые области оставляем с исходного фото, а черные области сбрасываем.
Карты границ областей
Кстати, уже здесь можно попробовать искать замкнутые контуры для определения областей текста. Но контуры могут сливаться между собой. Это можно немного исправить детектором границ Канни. Но проблема все же останется.
Получаем итоговое изображение:
Что мы здесь видим? У нас обозначены области, которые не подлежат замене на фон. И есть области (черный цвет), где можно оставить только средний — размытый фон, или просто залить эти места черным цветом.
Худо-бедно, но мы смогли решить нашу главную задачу — выделение областей интереса. А далее, уже в них можно пытаться распознать буквы, строить из них предложения. Сами области интереса можно анализировать на принадлежность к более-менее правильному прямоугольнику. Например, производить расчет отношения ширины и высоты анализируемой области. Также на размер области. Чтобы области разъединить, можно применять морфологические операции наращивания и эрозии.
Но далее мы не стали продвигаться в этом направлении, т. к. применение данного математического аппарата потребует соблюдения слишком заранее оговоренных условий освещения, чистоты паспорта, условий съемки и т. д. Что не подходит к заранее заданным условиям задачи — вариации освещенности, условий съемки и пр. могут различаться в достаточно широких пределах.
Преимущества и недостатки устаревших подходов.
Преимущества:
- Метод работает быстро.
- Быстро реализуется — за вечер на коленке.
- Понятная математика. На вопрос «почему не работает», «почему работает именно так» ответ можно «прочитать» прямо с последовательных картинок.
Недостатки:
- Есть настраиваемые гиперпараметры — ширина гаусового размытия, коэффициент отсечки средней амплитуды. Их нужно подбирать. И часто эти гиперпараметры зависят от условий съемок паспорта.
Так что метод больше имеет историческую ценность. Сейчас его применяют в узко специализированных приложениях, где условия съемки можно жестко контролировать.
Как бы это сделали недавно — лет этак 10 назад
Прогресс двигается. Появляются более мощные рабочие станции. Можно уже замахнуться на более прогрессивные методы. Эти методы не то чтобы ранее не существовали, но недостаточная мощность «железа», сложность сбора данных для обучения, все же тормозили этот процесс.
Итак, первый вариант — давайте сразу же на паспорте найдем буквы. И далее из них будем строить слова. Для этого возьмём пример работы готового специализированного программного обеспечения.
OCR FineReader
ABBYY FineReader — это программа для оптического распознавания текста (OCR), которая позволяет сканировать и распознавать текст на изображениях и документах, а также преобразовывать их в редактируемые форматы, такие как Microsoft Word, PDF и другие. Этот инструмент широко используется в различных областях, включая бизнес, образование и личное использование.
Фактически, данная программа производит поиск областей интереса. В нашем случае букв. И выделяет в анализируемой области некоторые признаки. Как то — наклон элементов, их соотношения между собой и пр.
Давайте подадим наш паспорт в эту программу и получим результат:
Результат, как говорится «на лицо». Использовать можно. Но много неточностей при распознавании.
Например, код подразделения распознан не как 520-008, а как 520-0С8. Хотя качество фото и разрешение достаточно хорошее.
Конечно, путем более тщательной доработки этого алгоритма можно добиться более качественных результатов. Но разработка алгоритма может перейти в режим подгонки к лабораторным данным. Что, конечно же не допустимо.
Создаём своё решение для распознавания документов. Первая версия (не во всём удачная) с готовыми моделями нейросетей — YOLO и Tesseract
Теперь рассмотрим наш опыт и применимость в реальной жизни. Первое, с чем мы столкнёмся — нам никто не даст заранее подготовленное изображение паспорта. Пользователи могут прислать фотографию или скан, содержащие не только сам паспорт и первое, что нам нужно будет сделать, это найти фото паспорта на поданном изображении.
На приведенном примере паспорт в обложке и вокруг него большие свободные области, которые нам будут мешать производить распознавание.
Нужно алгоритмически найти сам паспорт на изображении. Плюс паспорт повернут вокруг вертикальной оси направленной в центр паспорта на неопределенный угол. Т. е. задача сводиться к нахождению границ паспорта на фото и повороте паспорта в стандартное положение, удобное для работы с ним.
К решению этой задачи можно подступиться несколькими способами.
Регрессионная нейронная сеть для определения координат
Первый, и самый очевидный, можно взять и обучить регрессионную нейронную сеть, которая сама бы нам выдавала координаты углов паспорта.
В нашем случае, мы рассмотрим зависимость значения нашего неизвестного параметра — угла поворота, которое мы хотим найти, или смоделировать его, относительно матрицы пикселей, содержащие фото паспорта.
Но нам не нужны все четыре угла, достаточно трех:
И по трем точкам мы можем уже произвести расчет угла поворота паспорта. Формула простая — школьная:
R cos (a) = dx
Отсюда a = arcos (dx / R), при условии, что R > 0.
R — длина вектора от левой точки к правой точке;
dx — расстояние по x от левой до правой точки.
Итак, составим модель:
Здесь нужно немного пояснений.
Создаем входной слой с размером h × w (высота и ширина). Использовался размер 300 × 300 с трехканальным цветом (RGB).
Далее загружалась модель efficientnetb3 с отключенным слоем классификации и с предобученными весами imagenet.
Далее нейронная сеть замораживалась, чтобы отключить режим обучения нейросети efficientnetb3 в процессе тренировки общей модели, т. к. эта нейросеть уже обучена на огромном датасете imagenet. И эта нейросеть будет работать как экстрактор признаков, т. е. как бы раскладывать наше изображения на некоторый набор чисел, кодирующих наш паспорт.
Но важно, что слои BatchNormalization обязательно замораживать на всей нейросети, т. е. делать их не активными для обучения. А также темп обучения не надо выставлять слишком большим.
Далее выходной слой нейросети efficientnetb3 делается плоским.
Накладывается 20 процентный отсев на выходные нейроны. Это поможет бороться с переобучением.
Присоединяем слой нейронов в количестве 500 штук. И применяем активацию relu.
Функция актиации relu преобразует входное значение в значение, которое при входном значении меньше нуля в ноль, иначе оставляет значение неизменным: f (x) = max (0, x).
Далее присоединяем результирующий слой с 6 нейронами без функции активации. Здесь требуется пояснение — шесть нейронов это координаты трех точек x0, y0; x1, y1; x2, y2. Функцию активации не применяем, чтобы выходные значения имели интервал 0 до 300.
Далее создаем модель, и компилируем ее с loss—функцией mae.
Почему применяем efficientnetb3 — эта модель уже предобучена на большом датасете и обучение нашей модели будет идти быстрее.
Датасет для дообучения модели
Основной вопрос в подготовке датасета для обучения модели.
Для этого был написан генератор картинок, работающий следующим образом: процедура генерации случайным образом выбирала фото фона из каталога заранее подготовленных картинок фона:
Затем генератор брал любое фото паспорта из заранее подготовленных, вращал паспорт на случайный угол, накладывал на фон и сохранял в каталог.
Т. к. координаты паспорта при автоматической генерации известны, то можно составить датасет для обучения нейросети. Это фактически координаты трех углов. Или шесть чисел. Получился очень большой датасет размером в 70 000 картинок.
После обучения мы имеем предсказанные координаты точек углов паспорта:
То есть модель предсказывает координаты углов. Правда, не всегда точно. Разница достигает в среднем до 5 пикселей. Нужен более надежный метод.
Используем текстовые области для определения угла поворота паспорта
Давайте попробуем «зайти» с другой стороны и ответим на вопрос — а что является самыми главными «фичами» паспорта? Это, конечно же, текстовые надписи. Их много, расположены они всегда как горизонтальные строки кроме двух строк с номером и серий паспорта, длина надписей больше, чем одна буква.
Давайте поступим таким образом — найдем эти текстовые области, отрисуем их как бинарные метки, т. е. черные прямоугольники на белом фоне. Потом вращаем это редуцированное фото по часовой и против часовой стрелки, производя в каждой позиции расчет высоты получившейся картинки по крайним вертикальным меткам. То значение, в котором это высота будет минимальна, и будет лучшим решением для расчета угла поворота паспорта.
Как найти области текста — нейросеть YOLO
Для этого мы взяли нейросеть YOLOv8, далее написали генератор датасета для обучения модели. Генератор работал следующим образом — брался случайный фон, на него накладывался паспорт с заранее убранными текстовыми метками:
YOLO (You Only Look Once — только один раз взглянуть) — это одна из наиболее популярных архитектур для распознавания и локализации объектов в изображениях и видео. YOLOv8 является одной из последних версий этой архитектуры (уже есть YOLO11), которая продолжает развивать ее преимущества, улучшая точность и скорость обнаружения. В этом кратком примечании мы рассмотрим, как YOLOv8 работает и как она находит объекты на фотографиях.
Принцип работы YOLOv8
- YOLOv8, как и предыдущие версии, использует единую нейронную сеть для выполнения задач детекции и классификации объектов в одном процессе. Это ключевое отличие от многих других подходов, которые могут требовать раздельного определения объектов и их классов.
- Обработка входного изображения: Сначала входное изображение изменяется до фиксированного размера (например, 640 × 640 пикселей). Это облегчает процесс обработки и позволяет сети одинаково работать с изображениями разных размеров, сохраняя соотношение сторон.
- Сетевой архитектурный подход: YOLOv8 использует архитектуру, основанную на нескольких сверточных слоях, включая нововведения, такие как использование условной нормализации и дополнительных интерпретаций, чтобы улучшить качество предсказаний.
- Грид (сетка): Изображение разбивается на сетку, где каждая ячейка сетки отвечает за предсказание объектов, если центр объекта попадает в ячейку. Это позволяет нейросети локализовать несколько объектов в одном изображении.
- Предсказание боксов и вероятностей: Для каждого якорного прямоугольника (bounding box) YOLOv8 предсказывает координаты бокса (x, y, w, h), вероятность присутствия объекта и классы объектов, находящихся в этой области. Каждая ячейка может предсказывать несколько боксов и вероятностей для них.
- Отбор предсказаний: После этапа предсказания используется пост-обработка для удаления избыточных и низкоуровневых предсказаний, таких как Non-Max Suppression (NMS), которая удаляет бокс с низкой вероятностью и оставляет боксы с наивысшим значением уверенности.
Преимущества YOLOv8
- Скорость: Одним из ключевых преимуществ YOLO является высокая скорость обработки изображений, что делает его идеальным для реального времени приложений, таких как видеонаблюдение и автономные транспортные средства.
- Точность: YOLOv8 оснащен новыми архитектурными улучшениями и методами для повышения точности, что позволяет лучше диагностировать объекты при различных условиях освещения и сложных фонах.
- Гибкость: YOLOv8 поддерживает множество классов объектов, благодаря чему модель может быть обучена для работы в различных областях, таких как безопасность, времяпрепровождение, здоровье и т.д.
- Простое внедрение: YOLOv8 доступен в популярных фреймворках машинного обучения, что упрощает интеграцию в существующие приложения и системы.
Применение YOLOv8
- Автономные транспортные средства: Используется для идентификации пешеходов, знаков и других транспортных средств.
- Безопасность и наблюдение: Идентификация подозрительных объектов и поведение людей.
- Медицинская диагностика: Анализ медицинских изображений для определения аномалий.
- Розничная торговля: Выявление и учет товара на полках магазинов.
YOLOv8 представляет собой мощный инструмент для распознавания объектов, обладающий высокой скоростью и точностью. Его способности находить и классифицировать объекты на фотографиях делают его привлекательным для широкого спектра приложений. С продолжением развития технологий и архитектур, вероятно, YOLO станет еще более эффективным инструментом в области компьютерного зрения.
И в случайных позициях наносился текст. Буквы выбирались случайным образом. Вот получился такой датасет:
Размер датасета составил порядка 80 000 картинок. Т. к. буквы наносились программным способом, то координаты областей известны. Эти координаты и были входными параметрами для обучения нейросети.
В результате после обучения нейросети мы можем достаточно точно идентифицировать координаты областей текста:
Левая картинка — результат сегментации моделью. Правая картинка — оригинал.
Из приведенного примера видно, что результат сегментации достаточно точный.
Есть иногда пропуски некоторых символов, но это не страшно. Т. к. общая масса сегментированных данных для нас достаточна.
Далее действуем по оговоренному плану — вращаем черно—белую картинку против часовой стрелке и потом по часовой стрелке до 20 градусов, ищем минимальную высоту. В этой позиции и есть наш искомый угол:
Паспорт повернули в правильное положение. Области найдены — можно ведь сразу и текст распознавать?
Детектируем контур документа
Нет. Как всегда жизнь намного сложнее. Дело в том, что сам паспорт может быть в обложке, поэтому нужна еще функция точной детекции контура паспорта без лишних деталей. Да и сами текстовые области определены бывает с разрывами и пропусками (что не помешало нам использовать эту информацию для поиска угла поворота).
Следовательно, картинку повернули, а далее ищем сам паспорт. Для этого используем еще одну YOLOv8, которая точно нам отсегментирует контур паспорта. Для этого также создадим генератор датасета, который на случайный фон накладывает в случайных позициях паспорта. И эти координаты и будут входными параметрами для обучения нейросети.
В результате нейросеть очень точно сегментирует нам положение паспорта:
Видно, что лишние области вокруг паспорта обрезаны, обложка также удалена.
Но нам не понравился этот метод поиска угла и определения контура документа. Он достаточно долгий — занимает порядка 2 секунд. И он двухэтапный — поиск угла и поиск самого паспорта после поворота. Хотелось бы ускорить выполнение данной операции.
Сегментирующая нейросеть
Раз у нас есть такая классная нейросеть как YOLOv8, то давайте ей же и выполним попиксельное сегментирование самого паспорта. В данном режиме нейросеть выдаст нам маску, которая точно повторяет область занимаемую самим объектом. Паспортом в нашем случае.
Вот стандартный режим работы сегментирующей нейросети:
Видно, что нейросеть выдала маску с разными цветами, по значению цвета можно определить что это за объект.
Источник: trainingdata.ru/markup-dark-side-ml/tpost/bxdpm7blz1-segmentatsiya-izobrazhenii.
Опять же нужен хороший датасет. Но в принципе, генератор у нас уже был — генератор поиска паспорта. Нужно было только немного сменить формат данных. Теперь мы должны подавать для обучения не координаты углов паспорта, а координаты контура паспорта.
Вот так:
Т. е. на вход модели подаем координаты вот этого красного прямоугольника в виде {(x0, y0); {x1, y1}, ..., {xn, yn}}.
Где (x0, y0) — начало контура, а (xn, yn) — координата окончания контура.
Метрика качества обученной модели. По оси X откладывается уверенность модели в качестве своего ответа. По оси Y откладывается F1.
По этому графику можно судить, что наша модель хорошо обучилась, при пороге отсечки 0.9 модель работает практически со 100% качеством.
Метрика F1 — это ключевая метрика, используемая в задачах классификации, особенно когда важно сбалансировано оценивать точность и полноту (recall) модели. Она является гармоническим средним между точностью (Precision) и полнотой (Recall).
Точность (Precision) — показывает, какой процент предсказанных положительных случаев действительно был положительным.
Полнота (Recall) — показывает, какой процент истинных положительных случаев был правильно предсказан.
Итого:
Чтобы найти углы мы сначала находим ограничивающую рамку паспорта, а далее находим четыре области, где скорость изменения цепного кода меняет свой знак. Ну или проще — там, где меняет знак разность dy = yn — yn1, или dx = xn — xn-1 в течении нескольких последовательностей итераций проверки.
Но это еще не все плюсы этого метода. Этим методом мы находим не только на какой угол нужно довернуть паспорт, чтобы он был в строго вертикальном положении, но и сразу же можем найти область занимаемую паспортом. В результате имеем следующий результат:
Итак, мы научились приводить паспорт в вертикальное положение, находить контур паспорта и обрезать все лишние «детали».
Теперь приступаем к самому интересному — а именно нахождению слов на паспорте, распознаванию текста и принятию решения, что это за текст, а именно где на паспорте «Дата выдачи паспорта», где «Фамилия», «Пол» и пр. Начнем с нахождения слов и распознавания текста.
Поиск областей с текстом и распознавание с помощью библиотеки Tesseract
Сначала мы пошли, на наш взгляд, по достаточно логичному пути — давайте найдем области занимаемые текстом и будем распознавать этот текст.
Находим области, где есть текст, например:
Вырезаем эту область, подаем на OCR, получаем набор букв, которые уже можно обрабатывать как слова.
Были рассмотрены несколько OCR и при анализе был выбран Tesseract.
Можно конечно подавать паспорт сразу на обработку Tesseract, но результаты оказались не очень хорошими.
Например, проверим как будет распознан текст нашего тестового паспорта:
Выполним следующую команду:
pytesseract.image_to_string(img, lang='rus', config='--psm 6')
Здесь мы передаем интерпретатору Tesseract само предварительно загруженное изображение, указываем, чтобы он использовал раскладку кириллицы, и параметр config = --psm 6 — представление изображения как единый текст.
Результат распознавания очень плохой. Много мусорных срабатываний, ошибки в словах. Такой прямой подход вряд ли нормально будет работать. Причина здесь кроется в том, что Tesseract хорошо работает на тех изображениях, где буквы хорошо отделяются от фона. И фон достаточно однородный. В нашем случае это далеко не так.
Но если попробовать распознать отдельно выделенной слово, то Tesseract уже срабатывает намного лучше:
pytesseract.image_to_string(img, lang='rus', config='--psm 7')
Обратите внимание, что теперь используем параметр config = --psm 7 — как отдельную строку:
Строка распознана как «Смирнов».
Отсюда была предложена идея, что сначала находим так называемые области интереса — области предложений, потом подаем на Tesseract с параметром config = --psm 7 и получаем распознанный текст.
На вопрос, почему отдельно выделенное предложение лучше отрабатывает Tesseract — ответ кроется в том, что фон для одного предложения более однороден, чем для всей области документа, и Tesseract легче выделять символы и распознавать их.
Были сразу же предположения, что данный метод не совсем будет хорошо отрабатывать, т. к. есть области содержащие несколько предложений, например, место выдачи паспорта. И на этих областях общий фон уже не такой однородный.
Например:
Перевод Tesseract:
Т. е. нужно все же выделять именно построчно.
Итак, нам нужно найти области построчно и у нас уже есть обученный сегментатор на базе YOLOv8 для выделения областей строк.
План: сначала откорректируем угол поворота паспорта, потом находим область паспорта, сегментируем паспорт на области интереса — на строки, вырезаем строки, подаем на Tesseract и получаем переведенный текст.
Вот визуализируем сам процесс поэтапно:
Или используем для поиска угла отдельную нейросеть YOLOv8 — сегментатор, и сразу находим и угол поворота, и саму область паспорта:
Итак, текст распознали. В принципе, получилось не плохо.
Теперь встает вопрос как понять где фамилия, где дата рождения, где место выдачи?
Разделение распознанного текста по смыслу
Для этого мы применим простую технику — возьмем паспорт, и в тех областях, где мы понимаем, что должна находиться интересуемая нас надпись закрасим в черный цвет. А далее будем накладывать эти маски на наш распознаваемый паспорт проверяя, в какую область попадает наш текст. Идея простая, но т. к. у нас область паспорта выделена достаточно точно — вот зачем мы занимались коррекцией угла поворота паспорта, точного определения его положения и габаритов, то попадание текста в свою область будет достаточным для принятия решения программой что это за текст.
Вот разметка:
В отдельном текстовом файле мы описываем дополнительные параметры каждой области. Как то: какой язык в области eng/rus; какие могут быть символы — любой текст, только буквы, только цифры и т. д. Эти настройки применяем для дополнительной обработки текста. Например, если для заданного текста в файле настроек задано, что там могут быть только цифры, то все буквы «О» заменяем на ноль. Т. к. ноль и буква «О» очень похожи.
В результате после прохождения всего pipe-line мы уже можем составить выходной файл для вызывающей программы по распознанным областям. Это структуированный файл с описанием каждой области — type_object, и текстовая распознанная строка.
Но все же Tesseract иногда давал ошибочное распознавание букв. Особенно это было заметно на паспортах с неравномерным фоном — разное освещение, нечеткие контуры букв. Все эти вариации начертания очень сильно влияли на качество распознавания текста. Поэтому было принято решение разработать свою собственную нейросеть для распознавания.
Повышаем качество распознавания текста, усложняем нейросеть
Итак, из качества работы предыдущей версии программы сделали выводы. Основной посыл — улучшить качество распознавания текста. Метод выбрали: обучение своей нейросети для распознавания текста.
Давайте опишем шаги по ее созданию.
Что у нас есть: уже приведенное фото к правильному положению по углу, корректно вырезанное по габаритам. Этот путь мы уже прошли.
Далее мы можем взять YOLOv8, обучить ее сегментировать фото паспорта на буквы и сразу же их распознавать. Затем написать процедуру по объединению букв в слова и предложения.
Формируем датасет
Для начала как всегда нужно создать хороший датасет.
Давайте условимся, что будем распознавать только следующий набор букв и цифр — вся кириллица, латинские буквы и числа от 0 до 9.
В результате будем использовать только следующий набор букв и чисел:
Также для генерации датасета нужно использовать разные шрифты. Были выбраны следующие предустановленные в Windows шрифты:
- couri.ttf,
- lucon.ttf,
- Calibri.ttf,
- Times New,
- Roman.ttf,
- Verdana.ttf,
- CENTURY.TTF,
- micross.ttf,
- REFSAN.TTF,
- sylfaen.ttf.
Это позволило хорошо разнообразить начертания букв в датасете.
Генератор работал следующим образом: случайно из списка заранее подготовительных фоновых картинок паспортов в количестве примерно 200 штук выбиралась картинка — фон.
Далее фоновая картинка приводилась к стандартному размеру 640 × 640, подвергалась наложению случайного шума.
Наложение случайного шума использовалось для увеличения разнообразия изображений датасета. Что позволило частично избежать проблемы переобучения.
Следующим шагом была генерация текстовых строк.
Текстовые строки генерировались разной длины с простым набором случайно выбранных из списка возможных букв/чисел. Также символы генерировались с разным размером шрифта. Но для одного предложения шрифт текста был одним.
В итоге у нас получился достаточно большой датасет — порядка 70 000 изображений.
Т. к. при генерации строк и наложения их на фоновые картинки позиции символов известны, то мы можем подготовить для нейросети корректную структуру—описание согласно формату YOLOv8.
Вот примеры сгенерированного датасета:
Обучаем нейросеть
Далее обучалась нейросеть. Нейросеть обучилась примерно за 400 эпох.
На данном графике видим, что нейросеть обучена не равномерно для разных символов.
Но при выборе коэффициента отсечки на уровне 0,4, F1 — мера, показывающая качество распознавания каждого отдельного класса символа более 0,99. Что указывает на хорошую обобщающую способность нашей нейросети.
Вот что у нас получилось:
Нейросеть корректно нашла все области символов.
Правда, есть один промах — буква О. Счас исправим, как говорится :-)
Но после общего мозгового штурма была вынесена идея о том, что это из-за слияния букв при уменьшении масштаба исходного изображения. Было принято решение переобучить нейросеть до размера входного изображения в 800 × 800. Это решило проблему пропусков букв.
И далее сами распознанные буквы:
Итак, задача распознавания букв решена. Теперь осталось написать процедуру по сбору предложений из букв.
Собираем предложения из распознанных букв
Тут мы особо ничего придумывать не стали и реализовали простенькую процедуру. На вход процедуры подается набор букв из опреденной области интереса, а на выходе отформатированная строка.
Процедура работает следующим образом: сортирует буквы по возрастанию x координаты и y координаты буквы, с учетом того, что между буквами по вертикали не должно быть расстояние более половины высоты букв в строке. Далее, если между буквами расстояние более, чем половина средней ширины букв, то это начало нового слова. Также при переходе на следующую строку добавлялся к слову перенос строки.
Этот подход позволил нам качественно улучшить результаты распознавания символов на паспорте.
Поиск фотографии
YOLOv8 — классная нейросеть. Она уже предобучена для поиска многих классов. Например, людей на фотографии. Можно воспользоваться этим, и найти фотографию на паспорте. И также выдавать вырезанную часть фото из паспорта вызывающей стороне — клиенту.
Вот так находим фото:
Это улучшает общее впечатление о работе программы. А также позволит сразу же сохранять в базу данных фото клиента.
На этом краткий обзор серверной части программы закончен и надо рассмотреть, где применена данная технология в наших решениях.
Как соединить функционал распознавания с 1С. Интерфейс в 1C и пример использования
Данное решение построено в виде клиент—серверной архитектуры. Где серверная часть — это программа, написанная на языке Python с использованием компонентной структуры, а именно numpy, pytorch, opencv-python, flask и др. Серверная часть ожидает от клиентской программы запросы на распознавание. В серверную часть по REST-API поступает POST—запрос с картинкой — паспортом в формате base64.
Серверная часть производит раскодировку фото, перевод ее из base64 в numpy—формат, производит предобработку и все этапы, которые были описаны выше. Далее вызывающей клиентской программе возвращается json—ответ с описанием всех полей, их значений, а также вырезанное фото лица человека. И уже клиенская часть позволяет манипулировать оператору с полученными данными. Фактически клиенская часть может быть написана на любой платформе. Серверная часть выступает в роли исполнителя по парсеру присланного фото.
Клиентская часть написана на платформе «1С:Предприятие 8.3». На это была веская причина, т. к. на платформе 1С очень большая клиентская база и пользователей для которых востребован данный функционал достаточно много.
Рассмотрим реализованный функционал на примере конфигураии «1С‑Рарус:Управление отелем».
Распознавание паспорта выполняется как для гостя, данные о котором уже хранятся в решении, так и для нового гостя. Для этого в справочнике Гости, на закладке «Основное», нажмем на кнопку «Распознать документ»:
Здесь представлена карточка гостя. В принципе, в стандартном решении все поля ранее заполнялись вручную. Сейчас имеется возможноть заполнять автоматически путем распознавания данных паспорта.
После нажатия на кнопку открывается интерактивное окно:
Чтобы произвести автоматическое распознавание паспорта нажмем на кнопку «Сканировать и распознать»:
Программа откроет стандартный интерфейс для сканирования документов. После чего фото паспорта автоматически отправляется на сервер для обработки и распознавания.
Добавление информации о паспорте может выполняться не только сканированием, но и загрузкой файла с изображением документа. Для такого случая нажимаем на кнопку «Загрузить изображение»:
И выбираем нужный файл для загрузки. После этого на форме появится изображение для предварительного просмотра:
После распознавания данных паспорта можно поправить возможные недочеты распознавания путем исправления в полях на форме.
Также можно визуально выделить область документа, соответствующую его определенному параметру, и наоборот.
Для этого нажмем кнопку «Обводка символов»:
И выберем нужный параметр документа. Пример показан на рисунке ниже. Здесь пользователем был выбран параметр «Паспорт выдан» — поле в документе, соответствующее данному параметру, выделяется рамкой желтого цвета. Остальные поля документа, в которых выполнялось распознавание, выделены рамками голубого цвета.
Данный механизм работает и в обратную сторону: пользователь выбирает область в документе (выделяется рамкой желтого цвета), после этого параметр, соответствующий данной области, выделяется желтым цветом.
Для сохранении выполненных изменений нажимаем кнопку:
После этого сведения о госте и его паспорте будут отображаться в карточке гостя на закладках Основное (поля ФИО, Дата рождения, Пол) и Документы.
Заключение
Хотя мы и рассматриваем в статье вполне конкретный кейс распознавания данных из документов на примере паспорта, который применяется в наших отраслевых решениях, существенная часть статьи была отведена под исторический экскурс и описание алгоритмов, использовавшихся для распознавания текстов в прошлом. Знание основ алгоритмов и математики позволяло с меньшими вычислительными ресурсами решать подобные задачи. Широкий кругозор может быть важен, когда вы берётесь за вопросы производительности и работы с большими потоками документов.
Сейчас технология машинного зрения и распознавания представляет собой мощный инструмент, способный значительно облегчить работу пользователей и улучшить качество обслуживания в различных сферах. Несмотря на необходимость в качественном оборудовании, плюсы в виде ускоренного процесса обработки, повышения точности данных и, главное, масштабируемости, делают её внедрение оправданным.
В конечном итоге, технологии распознавания документов могут значительно упростить жизнь пользователям, обеспечивая быструю, безопасную и удобную идентификацию. Механизмы платформы «1С:Предприятие» позволяют успешно интегрировать нетиповой функционал в массовые продукты, а обособленность серверной части позволяет повышать качество работы сервиса по распознаванию не мешая пользователю.
В статье упор сделан на общий ход исследований и разработки. Формульный математический аппарат практически не разбирался, чтобы не слишком загромоздить статью, которая и так получилась довольно объемной.
Статья призвана показать, что нет одного пути решения задачи. Но какой бы красивый математический аппарат не применялся, приоритет правильного ответа всегда является решающим.
Так и в области машинного обучения если модель работает корректно, то это является хорошим конечным результатом. Если нет, как мы видим из применения старых подходов в нерафинированных условиях, то требуется искать другие подходы и методы.
Спасибо за внимание!
Все упомянутые в статье наименования и бренды принадлежат их правообладателям.
От экспертов «1С-Рарус»
Читайте первыми статьи от экспертов «1С‑Рарус»
Вы можете получать оповещения по электронной почте
Или получайте уведомления в телеграм-боте