Детекция чужого почерка в экзаменационных бланках без эталонного образца

от автора

Один ученик писал экзаменационную работу, а кто-то чужой дописал часть за него. Как мы научили нейросеть распознавать это.

Дано: государственная аттестация, бумажные бланки, никакого онлайн-контроля. Классический способ фальсификации: ученик начинает работу сам, потом часть дописывает кто-то другой: сосед, нанятый человек, преподаватель. Проверяющий смотрит на текст, но не оценивает почерк.

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

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

Что уже было

Предыдущая версия системы работала на CNN с сиамской архитектурой (TensorFlow + scikit-learn, Python 3.6).

Пайплайн:

  • бинаризация →

  • контурный анализ через Canny →

  • сегментация строк методом локальных максимумов →

  • выделение слов через boundingbox.

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

Дополнительно: кодовая база на Python 3.6 с Keras устарела, ряд зависимостей конфликтовал при обновлении окружения. Переход на Python 3.10 и замена Keras на PyTorch — часть задачи.

После модернизации

Система переработана как микросервис. Запросы принимаются через RabbitMQ, изображения хранятся в S3, инференс — через NVIDIA Triton Inference Server. Пайплайн обработки включает пять этапов.

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

  2. Детекция рукописных областей: YOLO вместо прежнего контурного анализа. Ключевое ограничение: бланки — изображения 4000×5000 пикселей и выше, а YOLO ожидает вход 640×640. Прямой ресайз убивает мелкие рукописные слова — они сжимаются до нескольких пикселей и перестают детектироваться. Решение — SAHI (Slicing Aided Hyper Inference): изображение нарезается на перекрывающиеся срезы, каждый прогоняется через детектор отдельно, результаты объединяются через NMS.

  3. Детекция нетекстовых объектов: YOLO, обученная на разметке формул, графиков и схем. Разметка выполнялась на тестовом датасете бланков, предоставленном заказчиком. Этот детектор нужен только для того, чтобы исключить найденные области из подозрительных.

  4. Скоринг почерка. Каждая обнаруженная рукописная область приводится к 224×224 пикселям. Скоринговый алгоритм работает итеративно:

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

  • Сиамская сеть сравнивает референс со всеми остальными фрагментами, формируя вектор сходства 0–1.

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

  • Фрагменты делятся на похожие и непохожие по квантилям. LocalOutlierFactor из sklearn ищет аномальные — кандидаты на чужой почерк.

  • Цикл повторяется до трёх раз с новыми референсами из ещё не размеченных фрагментов.

На финальном этапе объединяются оценки двух скоринговых моделей с настраиваемыми весами. Итоговая вероятность списывания считается как перцентиль скоров фрагментов, отнесённых к “чужим”. Один плохо распознанный участок в таком расчёте не определяет итоговую оценку.

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

Ограничения

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

Качество сканов. Бланки поступают в потоке, сканирование массовое, оттуда полосы, пятна, неравномерная яркость . Адаптивная бинаризация снимает часть проблем, но на особо плохих сканах строки все равно сливались или разбивались неправильно.

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

Формулы с рукописными вставками. Если ученик дописывал что-то в печатный бланк формулы от руки, YOLO для нетекстовых объектов детектировала всю область как формулу и исключала из анализа. Рукописный фрагмент внутри формулы не проверялся. Это ограничение осталось.

Метрики

По тестовой выборке более 4000 бланков — 89% корректно классифицированных случаев. Цифра агрегированная: она включает и чистые случаи (нет списывания), и подтверждённые. На сложных случаях, например, плохие сканы, бланки с большим количеством формул, работы с сильной вариативностью почерка точность получилась ниже.

OCR для посимвольного сравнения показывал нестабильность на мелких элементах: символы высотой 10–12 пикселей после бинаризации теряли различимые признаки.

Итог

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

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

ссылка на оригинал статьи https://habr.com/ru/articles/1037850/