Когда пользователь загружает документ в систему, сначала нужно понять, что именно он прислал. Паспорт? Договор? Полис? Заявление? От этого зависит весь дальнейший сценарий обработки: какие поля искать, какие проверки выполнять и какой OCR использовать. Ошибка на этом этапе делает бессмысленной всю дальнейшую обработку. Мы покажем, что тип документа можно определить, вообще не читая его содержимое. Для этого не нужны OCR, нейронные сети или анализ текста – достаточно использовать геометрию документа.

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

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

Мы в Smart Engines не первые, кто сталкивался с задачей типизации документа на изображении (скане). Уже существуют решения, которые опираются на статический текст документа (текст, который не изменяется от документа к документу), на анализ локальных особенностей, и, в конце концов, есть нейросетевые решения. Все они работают, но цена такого подхода довольно высока: запуск OCR, ручная разметка шаблонов, обучение моделей или существенные вычислительные затраты. Для задачи, которая должна занимать считанные миллисекунды и выполняться прямо на устройстве, это выглядит избыточным.

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

Пример проекций на координатные оси скана документа “Сведения о показаниях квартирных приборов”.

Какие могут быть проблемы с таким подходом?

Во-первых, документ может быть отсканирован под углом, а это повлияет на проекции. Ниже приведен пример проекций повернутого примерно на 10 градусов документа.

Видно, что проекции перестают описывать тип документа. Значит, перед вычислением проекций нужно определить угол наклона и нормализовать изображение. В этом нам поможет быстрое преобразование Хафа (далее БПХ).

Во-вторых, какие проекции документа мы будем считать идеальными, то есть такими, с которыми можно будет сравнить проекции входного изображения и определять тип документа? Это отлично, когда есть изображение не заполненного документа, но так происходит не всегда. Чаще всего есть примеры уже заполненных документов, значит, придется строить эталонные проекции по нескольким изображениям. С этим нам поможет алгоритм ДТВО (динамическая трансформация временной оси).

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

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

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

Наш метод состоит из двух этапов: 1) построение эталонных проекций для каждого типа документа, 2) сравнение проекций входного документа с эталонными проекциями и принятие решения о типе этого документа.

Построение эталонных проекций

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

  1. Предварительно обрабатываем каждое изображение I из набора для построения эталонных проекций:

    1. Масштабируем его так, чтобы его ширина была равна w, а высота изменилась пропорционально, получаем I'. Этот шаг нужен, чтобы ускорить вычисление проекций.

    2. Применяем к I' фильтр Гаусса Δ с фиксированной степенью размытия для снижения шума на изображении, получаем Δ(I').

    3. Вычисляем производную изображения Δ(I') по y, получаем изображение Dx.

    4. Вычисляем по Dx ее БПХ-образ по горизонтальным направлениям, получаем FHT(Dx).

    5. Вычисляем индекс строки i изображения FHT(Dx), который как раз и отвечает за проекцию вдоль горизонтальных линий документа, получаем проекцию FHT(Dx)[i] – необходимую проекцию на ось Ox после нормализации. Каким образом находится данный индекс, можно посмотреть в данной статье.

  2. Ищем пару проекций, у которых наименьшее расстояние ДТВО. Вместо этих проекций записываем их среднее с учетом ДТВО (i координате одного вектора соответствует не i координата второго вектора, а ДТВО(i) координата). И так проходимся по всем n проекциям. Получаем эталонную проекцию. Подробный алгоритм представлен на рисунке ниже.

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

Аналогично строим эталонную проекцию на ось Oy и ее вектор отклонений. Теперь у нас есть эталонные проекции на оси координат и их векторы отклонений для каждого типа документа.

Определение типа документа

Пусть у нас есть входное изображение документа.

1. Применяем пункты 1a-1e предобработки входного изображения.

2. Для каждой пары эталонных проекций типа документа вычисляем расстояние до входных проекций, добавляя весовую функцию в алгоритм ДТВО: 

Dist(0, 0) = \frac{|e_0 - s_0|}{\sqrt{\sigma_0^2 +\lambda^2}},\begin{aligned} Dist(i, j) = &\frac{|e_i - s_j|}{\sqrt{\sigma_i^2 +\lambda^2}} \\ &+ \min\{P_{del} + Dist(i-1, j), Dist(i-1, j-1), P_{ins} + Dist(i, j-1)\} \end{aligned},

где \sigma_i i-ая координата соответствующего вектора отклонений, \lambda – настраиваемый параметр, e_i  i-ая координата эталонной проекции, s_jj-ая координата проекции входного изображения, P_{del} и P_{ins}– величины штрафов за вставку в эталонную и входную проекцию соответственно.

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

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

Мы тестировали изложенный алгоритм на 8 типах документов, среди которых: листок нетрудоспособности, страховой полис и  заявление на предоставление основной банковской карты. В датасет вошло 3000 изображений, для каждого типа документа было взято по 15 случайных изображений каждого типа для построения эталонных проекций. Примеры изображений из датасета представлены ниже.

Для вручную повернутых изображений точность типизации равна 99.79%, а для изображений, которые требуют вычисления угла поворота – 99.76%.

Среднее время работы метода для типа документа зависело от среднего размера изображения в пикселях. Для наибольшего изображения 2479×3589 среднее время работы нашего метода 3.49±0.20 мс, а для наименьшего изображения с разрешением 1653×932 наш метод работает за 1.74±0.23 мс.

Все эксперименты проводились на ПК с процессором AMD Ryzen 5 5600X (6 ядер, 12 потоков) и 64 Гб оперативной памяти. Программа написана на языке С++ с компилятором GCC 12.4.1.

Заключение

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

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

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

Таким образом, геометрия документа оказывается достаточной, чтобы быстро и точно определить его тип еще до запуска OCR. Это позволяет использовать типизацию как легковесный первый этап конвейера распознавания документов.

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


  1. ToxaBes
    04.08.2026 17:05

    Красивое и элегантное инженерное решение для первичной фильтрации в пайплайне. Выделить сетку, пропорции и геометрию верстки классическим CV за 3 мс действительно здорово с точки зрения оптимизации.

    Однако хочется внести ясность:

    Во-первых, типизация не равна извлечению данных. Определить по геометрическим дескрипторам, что перед нами бланк паспорта или ID-карта, действительно можно без OCR и сетей. Но бизнес-ценность любого распознавания в содержимом (ФИО, серия, номер, даты). А для считывания текста без OCR или глубоких моделей всё равно не обойтись. То есть метод не заменяет OCR, а лишь оптимизирует выбор нужного шаблона.

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

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