{{countBasket}}
От экспертов «1С‑Рарус»: Алгоритмы и нейросети в практике распознавания паспортных данных для 1С
От экспертов «1С‑Рарус»: Алгоритмы и нейросети в практике распознавания паспортных данных для 1С

От экспертов «1С‑Рарус»: Алгоритмы и нейросети в практике распознавания паспортных данных для 1С

28.03.2025
107 мин
3059

Оглавление

  1. Зачем это нужно?
  2. Существующие решения. Что хотим улучшить и дополнить?
  3. Примеры фейковых фото паспорта, на которых будем вести работы
  4. Подготовка изображения без использования нейросетей. Алгоритмы бинаризации
  5. Как бы это сделали недавно — лет этак 10 назад
  6. Создаём своё решение для распознавания документов. Первая версия (не во всём удачная) с готовыми моделями нейросетей — YOLO и Tesseract
  7. Повышаем качество распознавания текста, усложняем нейросеть
  8. Как соединить функционал распознавания с 1С. Интерфейс в 1C и пример использования
  9. Заключение

Зачем это нужно?

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

Использование технологий распознавания позволяет:

  • ускорить ввод данных и уменьшить время обслуживания клиентов;
  • минимизировать количество ошибок;
  • повысить эффективность работы сотрудников.

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

Существующие решения. Что хотим улучшить и дополнить?

Специалисты «1С‑Рарус» изучили решения для распознавания документов: от базовых систем оптического распознавания до сложных систем с интеграцией машинного обучения и искусственного интеллекта.

Основные категории и примеры решений по распознаванию документов:

Решения на базе OCR (оптическое распознавание символов)

Решение Описание Преимущества Недостатки

Tesseract

Бесплатная и открытая библиотека OCR, разработанная Google.

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

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

ABBYY FineReader

Поддержка OCR позволяет конвертировать сканированные документы в редактируемые форматы.

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

Специализированные решения для распознавания документов

Решение Описание Преимущества Недостатки

Jumio

Идентификации и верификации личности с помощью сканирования паспортов и других идентификационных документов.

  • Быстрое распознавание, поддержка большого количества форматов документов, соответствие требованиям по безопасности (проверка и верификация данных KYC и AML).
  • Зависимость от облачных технологий, что может вызывать опасения по поводу конфиденциальности данных.

IDnow

Платформа для оптического распознавания, поддерживающая различные форматы и области применения.

  • Легкость интеграции с существующими системами.
  • Возможность проводить удаленные идентификации.
  • Возможны ограничения по функциональности в зависимости от выбранного пакета услуг.

Интегрированные решения для бизнеса

Решение Описание Преимущества Недостатки

Veriff

Платформа, предлагающая удаленные проверки удостоверений, включая паспорта и ID-карты, с помощью AI.

  • Высокая скорость обработки.
  • Возможность интеграции в мобильные приложения и веб-сайты.
  • Платные услуги.
  • Возможные ограничения по географическому покрытию.

Onfido

Решение использует AI для распознавания паспорта и проверки подлинности документов.

  • Простота интеграции.
  • Поддержка множества типов документов.
  • Аналитика и отчеты о рисках.
  • Зависимость от внешнего сервиса, что может вызвать проблемы с конфиденциальностью данных.

Microsoft Azure Cognitive Services

Платформа, предоставляющая различные API, включая OCR, для распознавания текста на изображениях.

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

Google Cloud Vision

Облачное решение, предлагающее мощные инструменты для анализа изображений, в том числе OCR.

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

Применимость существующих решений на практике

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

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

Примеры фейковых фото паспорта, на которых будем вести работы

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

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

Примеры фейковых фото паспорта.

Примеры фейковых фото паспорта.

Примеры фейковых фото паспорта.

Примеры фейковых фото паспорта.

Внимание
Все использованные в статье изображения паспортов не являются фотографиями реальных документов и не содержат персональные данные.

Из фейковых изображений можно собрать достаточный материал для тестирования.

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

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

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

Но сначала давайте немного отступим от нейросетей, и посмотрим на применяемые методы и алгоритмы века минувшего.

Подготовка изображения без использования нейросетей. Алгоритмы бинаризации

Представим, что мы вернулись в прошлое на четверть века. 25 лет срок не такой уж и большой, но за этот период как теоретическая, так и техническая часть, а именно мощность компьютеров, появление мощных GPU, кластеров, продвинулись далеко вперед, что позволило подступиться к задачам ранее считающимися невозможными. Особенно на машинное обучение повлияло появление больших объемов данных в свободном доступе — imagent, coco и пр. Но приступая к любой задаче лучше идти от простого к сложному.

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

Линейная регрессия — это метод анализа данных, который предсказывает ценность неизвестных данных с помощью другого связанного и известного значения данных. Он математически моделирует неизвестную или зависимую переменную и известную или независимую переменную в виде линейного уравнения вида y = β0 + β1x, где x — независимая переменная, y — зависимая.

Мы пройдем этим путем, и рассмотрим простой, но интересный метод, который использовали на заре нашей эры :-)

Метод бинаризации Оцу

Давайте посмотрим на наш паспорт (все эксперименты по принятым решениям будем тестировать на этом фото):

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

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

Метод бинаризации Оцу является эффективным и широко используемым инструментом для преобразования изображений в бинарный формат. Он позволяет автоматизировать процесс выбора оптимального порога для разделения объекта и фона — отсюда, кстати и название бинаризация, т. е. преобразование изображения в два оттенка — 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 (это самая яркая компонента или белый цвет). Если посмотрим на наше фото, то действительно, белого очень много.

Производим бинаризацию Оцу. Алгоритм позволяет разделить пиксели двух классов («полезные» и «фоновые»), рассчитывая такой порог, чтобы внутриклассовая дисперсия, или разброс относительно среднего внутри класса фон / не фон, была минимальной. А межклассовая дисперсия максимальной.

Дисперсия — это мера, которая показывает разброс между результатами. Если все они близки к среднему, дисперсия низкая. А если результаты сильно различаются — высокая.

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

Результат бинаризации

Результат так себе. Какое распределение, такой и результат бинаризации. Следовательно, данный метод не применим. Хотя, некоторые цифры выделены хорошо, но остальной контекст выделен с разрывами, что не позволит хорошо найти позиции букв и цифр.

Адаптивная бинаризация

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

Основной настраиваемый параметр — это область, внутри которой вычисляется параметр сглаживания.

Параметр сглаживания — этот параметр может иметь разное значение и смысл для разных алгоритмов адаптивной бинаризации. В самом простом варианте это просто константный размер области (размер задается исследователем) вокруг бинаризуемой точки, относительно которой делается расчет среднего значения интенсивности. И далее если интенсивность бинаризуемой точки больше этого среднего значения, то точке присваивается признак «не фоновая», иначе признак «фоновая».

Для нашего алгоритма адаптивной бинаризации этот параметр имеет смысл области для вычисления среднего значения вокруг бинаризуемой точки.

Адаптивная бинаризация. Размер области 3 × 3 пикселя

Размер области 3 × 3 пикселя.

Адаптивная бинаризация. Размер области 11 × 11 пикселя

Размер области 11 × 11 пикселей.

Адаптивная бинаризация. Размер области 21 × 21 пикселя

Размер области 21 × 21 пиксель.

Видим, что при увеличении размера блока количество шумов увеличивается. Т. е. надо будет при выборе этого метода производить постобработку и убирать шумы. Что тоже является не тривиальной задачей, хотя и решаемой в определенных пределах.

Бинаризация по порогу

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

Основная проблема в этом методе — правильный выбор порога отсечки.

Здесь под порогом отсечки следует понимать значение, более которого пиксели будут относиться к не фону, иначе к фону.

Бинаризация по порогу. Порог = 100.

Порог = 100.

Бинаризация по порогу. Порог = 150.

Порог = 150.

Бинаризация по порогу. Порог = 200.

Порог = 200.

Видно, что метод очень чувствителен к выбору порога отсечки.

Давайте еще раз посмотрим на гистограмму распределения:

Гистограмма распределения.

Что мы здесь видим?

У нас есть пик на 200 и на 230. И также есть длинный хвост левее 160. Скорее всего, этот хвост отвечает за черные символы — это и понятно, т. к. темные области имеют меньшую интенсивность — и значение много меньше 250, а правее 160 — за фон.

Произведем бинаризацию по коэффициенту отсечки 160:

Произведем бинаризацию по коэффициенту отсечки 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:

Применяем фильтр Собеля с размером матрицы равной 3 × 3.

Мы получили карту границ.

Рассчитываем среднюю амплитуду. У нас получилось 7,72.

Под средней амплитудой здесь понимается сумма значений градиентов по всему фото, деленное на количество пикселей, участвующих в расчете градиента. Граничные пикселя не учитываем.

Далее оставляем на фото те границы, амплитуда которых больше чем 0,7 средней амплитуды (0,7 выбрано эмпирическим путем — это настраиваемый гиперпараметр этой модели):

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

Вот фактически, белые области оставляем с исходного фото, а черные области сбрасываем.

Белые области изображения сохранены в исходном виде, черные — исключены.

Карты границ областей

Кстати, уже здесь можно попробовать искать замкнутые контуры для определения областей текста. Но контуры могут сливаться между собой. Это можно немного исправить детектором границ Канни. Но проблема все же останется.

Детектор границ Канни: Был разработан в 1986 году Джоном Кэнни (англ. John F. Canny) и использует многоступенчатый алгоритм для обнаружения широкого спектра границ в изображениях.

Получаем итоговое изображение:

Итоговое изображение.

Что мы здесь видим? У нас обозначены области, которые не подлежат замене на фон. И есть области (черный цвет), где можно оставить только средний — размытый фон, или просто залить эти места черным цветом.

Выделение областей интереса.

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

Морфологическое расширение и эрозия — расширение добавляет пиксели в контуры объектов в изображении, в то время как эрозия удаляет пиксели на границах объекта. Количество пикселей, добавленных или удаленных из объектов в изображении, зависит от размера и формы элемента структурирования.

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

Преимущества и недостатки устаревших подходов.

Преимущества:

  • Метод работает быстро.
  • Быстро реализуется — за вечер на коленке.
  • Понятная математика. На вопрос «почему не работает», «почему работает именно так» ответ можно «прочитать» прямо с последовательных картинок.

Недостатки:

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

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

Как бы это сделали недавно — лет этак 10 назад

Прогресс двигается. Появляются более мощные рабочие станции. Можно уже замахнуться на более прогрессивные методы. Эти методы не то чтобы ранее не существовали, но недостаточная мощность «железа», сложность сбора данных для обучения, все же тормозили этот процесс.

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

OCR FineReader

ABBYY FineReader — это программа для оптического распознавания текста (OCR), которая позволяет сканировать и распознавать текст на изображениях и документах, а также преобразовывать их в редактируемые форматы, такие как Microsoft Word, PDF и другие. Этот инструмент широко используется в различных областях, включая бизнес, образование и личное использование.

Фактически, данная программа производит поиск областей интереса. В нашем случае букв. И выделяет в анализируемой области некоторые признаки. Как то — наклон элементов, их соотношения между собой и пр.

Давайте подадим наш паспорт в эту программу и получим результат:

ABBYY FineReader — программа для оптического распознавания текста (OCR).

Результат, как говорится «на лицо». Использовать можно. Но много неточностей при распознавании.

Например, код подразделения распознан не как 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. И эта нейросеть будет работать как экстрактор признаков, т. е. как бы раскладывать наше изображения на некоторый набор чисел, кодирующих наш паспорт.

Еще лучшие результаты можно получить, если замораживать не все слои, а только, скажем 80% верхних. Тогда нейросеть будет учиться выхватывать признаки, которые относятся именно к документам.

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

batch-normalization — пакетная нормализация — метод, который позволяет повысить производительность и стабилизировать работу искусственных нейронных сетей.

Далее выходной слой нейросети efficientnetb3 делается плоским.

Накладывается 20 процентный отсев на выходные нейроны. Это поможет бороться с переобучением.

Присоединяем слой нейронов в количестве 500 штук. И применяем активацию relu.

Функция актиации relu.

Функция актиации relu преобразует входное значение в значение, которое при входном значении меньше нуля в ноль, иначе оставляет значение неизменным: f (x) = max (0, x).

Далее присоединяем результирующий слой с 6 нейронами без функции активации. Здесь требуется пояснение — шесть нейронов это координаты трех точек x0, y0; x1, y1; x2, y2. Функцию активации не применяем, чтобы выходные значения имели интервал 0 до 300.

300 — это размер картинок, на которых обучен efficientnetb3. Следовательно, координаты x, y могут меняться в интервалах от 0 до 300.

Далее создаем модель, и компилируем ее с loss—функцией mae.

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

Почему применяем efficientnetb3 — эта модель уже предобучена на большом датасете и обучение нашей модели будет идти быстрее.

Датасет для дообучения модели

Основной вопрос в подготовке датасета для обучения модели.

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

Датасет для дообучения модели. Процедура генерации.

Затем генератор брал любое фото паспорта из заранее подготовленных, вращал паспорт на случайный угол, накладывал на фон и сохранял в каталог.

Т. к. координаты паспорта при автоматической генерации известны, то можно составить датасет для обучения нейросети. Это фактически координаты трех углов. Или шесть чисел. Получился очень большой датасет размером в 70 000 картинок.

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

Датасет для дообучения модели. Получение координат углов.

То есть модель предсказывает координаты углов. Правда, не всегда точно. Разница достигает в среднем до 5 пикселей. Нужен более надежный метод.

Используем текстовые области для определения угла поворота паспорта

Давайте попробуем «зайти» с другой стороны и ответим на вопрос — а что является самыми главными «фичами» паспорта? Это, конечно же, текстовые надписи. Их много, расположены они всегда как горизонтальные строки кроме двух строк с номером и серий паспорта, длина надписей больше, чем одна буква.

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

Как найти области текста — нейросеть YOLO

Для этого мы взяли нейросеть YOLOv8, далее написали генератор датасета для обучения модели. Генератор работал следующим образом — брался случайный фон, на него накладывался паспорт с заранее убранными текстовыми метками:

Нейросеть YOLO. Нахождение области текста.

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 станет еще более эффективным инструментом в области компьютерного зрения.

И в случайных позициях наносился текст. Буквы выбирались случайным образом. Вот получился такой датасет:

Нейросеть YOLO. Нахождение области текста.

В датасете были не только паспорта в вертикальном положении, но и повернутые на случайный угол.

Размер датасета составил порядка 80 000 картинок. Т. к. буквы наносились программным способом, то координаты областей известны. Эти координаты и были входными параметрами для обучения нейросети.

В результате после обучения нейросети мы можем достаточно точно идентифицировать координаты областей текста:

Нейросеть YOLO. Нахождение области текста.

Левая картинка — результат сегментации моделью. Правая картинка — оригинал.

Из приведенного примера видно, что результат сегментации достаточно точный.

Есть иногда пропуски некоторых символов, но это не страшно. Т. к. общая масса сегментированных данных для нас достаточна.

Далее действуем по оговоренному плану — вращаем черно—белую картинку против часовой стрелке и потом по часовой стрелке до 20 градусов, ищем минимальную высоту. В этой позиции и есть наш искомый угол:

Нейросеть YOLO. Нахождение области текста.

Паспорт повернули в правильное положение. Области найдены — можно ведь сразу и текст распознавать?

Детектируем контур документа

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

Следовательно, картинку повернули, а далее ищем сам паспорт. Для этого используем еще одну 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

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

Находим области, где есть текст, например:

Поиск областей с текстом и распознавание с помощью библиотеки Tesseract.

Вырезаем эту область, подаем на OCR, получаем набор букв, которые уже можно обрабатывать как слова.

Были рассмотрены несколько OCR и при анализе был выбран Tesseract.

Оптическое распознавание символов (OCR) — это процесс преобразования изображения текста в машиночитаемый текстовый формат.
Tesseract OCR — один из самых популярных и мощных инструментов OCR с открытым исходным кодом, доступных сегодня. Первоначально он был разработан Hewlett-Packard (HP) между 1985 и 1995 годами, но активно не поддерживался в течение нескольких лет, пока не был открыт в 2005 году.

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

Например, проверим как будет распознан текст нашего тестового паспорта:

Выполним следующую команду:

pytesseract.image_to_string(img, lang='rus', config='--psm 6')

Здесь мы передаем интерпретатору Tesseract само предварительно загруженное изображение, указываем, чтобы он использовал раскладку кириллицы, и параметр config = --psm 6 — представление изображения как единый текст.

Поиск областей с текстом и распознавание с помощью библиотеки Tesseract.

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

Но если попробовать распознать отдельно выделенной слово, то Tesseract уже срабатывает намного лучше:

pytesseract.image_to_string(img, lang='rus', config='--psm 7')

Обратите внимание, что теперь используем параметр config = --psm 7 — как отдельную строку:

Поиск областей с текстом и распознавание с помощью библиотеки Tesseract

Строка распознана как «Смирнов».

Строка распознана как «Смирнов».

Отсюда была предложена идея, что сначала находим так называемые области интереса — области предложений, потом подаем на Tesseract с параметром config = --psmи получаем распознанный текст.

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

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

Например:

Поиск областей с текстом и распознавание с помощью библиотеки Tesseract.

Перевод Tesseract:

Перевод Tesseract.

Т. е. нужно все же выделять именно построчно.

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

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

Вот визуализируем сам процесс поэтапно:

Наш исходный паспорт.

Наш исходный паспорт.

Крутим–вертим, ищем угол поворота.

Крутим–вертим, ищем угол поворота.

Крутим—вертим, ищем угол поворота.

И поворачиваем.

И поворачиваем.

Или используем для поиска угла отдельную нейросеть YOLOv8 — сегментатор, и сразу находим и угол поворота, и саму область паспорта:

Нашли области интереса.

Нашли области интереса.

Переводим Tesseract для каждой области интереса.

Переводим Tesseract для каждой области интереса.
Для определения вертикальный надписей можно повернуть паспорт на 90 градусов, найти опять области и дораспознать их.

Итак, текст распознали. В принципе, получилось не плохо.

Теперь встает вопрос как понять где фамилия, где дата рождения, где место выдачи?

Разделение распознанного текста по смыслу

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

Вот разметка:

Разделение распознанного текста по смыслу.

В отдельном текстовом файле мы описываем дополнительные параметры каждой области. Как то: какой язык в области eng/rus; какие могут быть символы — любой текст, только буквы, только цифры и т. д. Эти настройки применяем для дополнительной обработки текста. Например, если для заданного текста в файле настроек задано, что там могут быть только цифры, то все буквы «О» заменяем на ноль. Т. к. ноль и буква «О» очень похожи.

Пример файла описания для текстовых областей.

Пример файла описания для текстовых областей.

В результате после прохождения всего pipe-line мы уже можем составить выходной файл для вызывающей программы по распознанным областям. Это структуированный файл с описанием каждой области — type_object, и текстовая распознанная строка.

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

Повышаем качество распознавания текста, усложняем нейросеть

Итак, из качества работы предыдущей версии программы сделали выводы. Основной посыл — улучшить качество распознавания текста. Метод выбрали: обучение своей нейросети для распознавания текста.

Давайте опишем шаги по ее созданию.

Что у нас есть: уже приведенное фото к правильному положению по углу, корректно вырезанное по габаритам. Этот путь мы уже прошли.

Далее мы можем взять YOLOv8, обучить ее сегментировать фото паспорта на буквы и сразу же их распознавать. Затем написать процедуру по объединению букв в слова и предложения.

Формируем датасет

Для начала как всегда нужно создать хороший датасет.

Вообще для удачного обучения нейросети очень важен хороший датасет. Что значит хороший? — хороший в том смысле, что что датасет должен быть достаточно представительным, но в то же время и нести в себе, если так можно выразиться «главную мысль» которую мы хотим закодировать в нейросеть.

Давайте условимся, что будем распознавать только следующий набор букв и цифр — вся кириллица, латинские буквы и числа от 0 до 9.

В латинице и кириллице есть похожие по начертанию буквы. Например А и А, B и В и т. п. Похожие по начертанию не дублируем. Было принято решение для букв Й и И оставить только И. Для 3 (три) и З (зет русская) оставить только 3 (три). Также 0 (ноль) и О (русская О) — оставляем 0. Также для букв Щ и Ш. Далее по тексту можно сделать предобработку.

В результате будем использовать только следующий набор букв и чисел:

0123456789ЦУКЕНГШХФЫВАПРЛДЖЭЯЧСМИТЬБЮQWRYUISDFGJLZV

Также для генерации датасета нужно использовать разные шрифты. Были выбраны следующие предустановленные в 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 эпох.

Обучаем нейросеть.

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

Тут надо сделать небольшое пояснение по выбору коэффициента отсечки. Чем больше F1, тем лучше. Тем более уверенно наша модель разделяет и не путает между собой символы. В идеале, F1 = 1. Т. е. модель не перепутает букву А с буквой Д. Это как раз интервал confidence от 0,4 до 0,6. Внутри этого интервала модель уверенно работает на нашей валидационной выборке. Если выбирать confidence больше 0,6, то модель начинает путать символы между собой и средняя F1 начинает падать.

Но при выборе коэффициента отсечки на уровне 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С‑Рарус»

Вы можете получать оповещения по электронной почте

Поле является обязательным

Или получайте уведомления в телеграм-боте

Есть вопросы по статье? Задайте их нам!

Рассылка «Новости компании»

Узнавайте первыми о новых статьях, мероприятиях и спецпредложениях.

Посмотреть все рассылки «1С‑Рарус»

Заинтересованы в сотрудничестве?
Нужна консультация?
Свяжитесь с нами!