Один ученик писал экзаменационную работу, а кто-то чужой дописал часть за него. Как мы научили нейросеть распознавать это.
Дано: государственная аттестация, бумажные бланки, никакого онлайн-контроля. Классический способ фальсификации: ученик начинает работу сам, потом часть дописывает кто-то другой: сосед, нанятый человек, преподаватель. Проверяющий смотрит на текст, но не оценивает почерк.
Задача ИИ: поймать фальсификацию почерка без эталона: система не знает заранее, как пишет конкретный ученик. Единственное, от чего можно отталкиваться – начало бланка, мы предполагаем, что первые строки написал сам экзаменуемый.
Цель: определить, написан ли весь бланк экзаменационной работы одним человеком. На входе – скан бланка, порой низкого качества. На выходе — координаты подозрительных фрагментов для ручной проверки. Все это в режиме потоковой обработки. Основной вызов: экзаменационный бланк — это смешанный документ. Рукописный текст соседствует с формулами, графиками, схемами, печатной подложкой бланка.

Что уже было
Предыдущая версия системы работала на CNN с сиамской архитектурой (TensorFlow + scikit-learn, Python 3.6).
Пайплайн:
-
бинаризация →
-
контурный анализ через Canny →
-
сегментация строк методом локальных максимумов →
-
выделение слов через boundingbox.
На выходе получали отмеченные абзацы для оператора. Алгоритм знал только одну категорию объектов — рукописный текст. Всё, что не распознавалось как текст, шло в подозрительное. Формула с символами ∫ и σ, нарисованный график, схемы — всё это вызывало ложное срабатывание. По ряду предметов почти весь бланк состоял из таких объектов, и оператор получал отмеченным весь документ целиком.
Дополнительно: кодовая база на Python 3.6 с Keras устарела, ряд зависимостей конфликтовал при обновлении окружения. Переход на Python 3.10 и замена Keras на PyTorch — часть задачи.
После модернизации
Система переработана как микросервис. Запросы принимаются через RabbitMQ, изображения хранятся в S3, инференс — через NVIDIA Triton Inference Server. Пайплайн обработки включает пять этапов.
-
Предобработка. Использовали адаптивную бинаризацию вместо глобального порога. Сканы приходили с неравномерной подсветкой и пятнами, поэтому единый порог давал нестабильную маску: мелкие элементы частично уходили в фон, а шумные участки попадали в дальнейшую детекцию.
-
Детекция рукописных областей: YOLO вместо прежнего контурного анализа. Ключевое ограничение: бланки — изображения 4000×5000 пикселей и выше, а YOLO ожидает вход 640×640. Прямой ресайз убивает мелкие рукописные слова — они сжимаются до нескольких пикселей и перестают детектироваться. Решение — SAHI (Slicing Aided Hyper Inference): изображение нарезается на перекрывающиеся срезы, каждый прогоняется через детектор отдельно, результаты объединяются через NMS.
-
Детекция нетекстовых объектов: YOLO, обученная на разметке формул, графиков и схем. Разметка выполнялась на тестовом датасете бланков, предоставленном заказчиком. Этот детектор нужен только для того, чтобы исключить найденные области из подозрительных.
-
Скоринг почерка. Каждая обнаруженная рукописная область приводится к 224×224 пикселям. Скоринговый алгоритм работает итеративно:
-
Выбирается референсный фрагмент (по умолчанию: с первой страницы бланка: предположение, что начало работы написано самим учеником с высокой вероятностью).
-
Сиамская сеть сравнивает референс со всеми остальными фрагментами, формируя вектор сходства 0–1.
-
Применяется гауссова модуляция по позиции: соседние строки получают буст сходства, потому что они скорее всего написаны тем же человеком.
-
Фрагменты делятся на похожие и непохожие по квантилям. LocalOutlierFactor из sklearn ищет аномальные — кандидаты на чужой почерк.
-
Цикл повторяется до трёх раз с новыми референсами из ещё не размеченных фрагментов.
На финальном этапе объединяются оценки двух скоринговых моделей с настраиваемыми весами. Итоговая вероятность списывания считается как перцентиль скоров фрагментов, отнесённых к “чужим”. Один плохо распознанный участок в таком расчёте не определяет итоговую оценку.
Тепловые карты. Документ дополнительно проходил через скользящее окно. Для каждого участка считалась матрица сходства с референсными фрагментами. Участки делились на три типа: чистый рукописный текст, текст с формулами и смешанные области. Для каждого типа задавались отдельные правила выбора референса. Финальный скоринг учитывал распределение оценок сходства, кластеры похожих фрагментов и соотношение участков с высоким и низким сходством.
Ограничения
Посимвольная разметка. ТЗ требовало сравнения одних и тех же символов из разных источников — детекция и идентификация каждого рукописного символа в составе формул и текста. Разметка должна была включать координаты символа, его идентификатор и привязку к автору. На практике это потребовало отдельного цикла разметки датасета, где один и тот же символ в формуле и в рукописном тексте должен быть связан. Для редких символов (специфические математические обозначения, нестандартные схемы) датасет оказался недостаточным — детектор давал нестабильный результат.
Качество сканов. Бланки поступают в потоке, сканирование массовое, оттуда полосы, пятна, неравномерная яркость . Адаптивная бинаризация снимает часть проблем, но на особо плохих сканах строки все равно сливались или разбивались неправильно.
Внутриклассовая вариативность. Почерк одного человека деградирует по ходу экзамена. К концу двухчасового испытания он заметно отличается от первого листа. Гауссова модуляция по позиции частично компенсирует это, но на длинных работах скоринг иногда помечает конец работы как подозрительный из-за деградации почерка.
Формулы с рукописными вставками. Если ученик дописывал что-то в печатный бланк формулы от руки, YOLO для нетекстовых объектов детектировала всю область как формулу и исключала из анализа. Рукописный фрагмент внутри формулы не проверялся. Это ограничение осталось.

Метрики
По тестовой выборке более 4000 бланков — 89% корректно классифицированных случаев. Цифра агрегированная: она включает и чистые случаи (нет списывания), и подтверждённые. На сложных случаях, например, плохие сканы, бланки с большим количеством формул, работы с сильной вариативностью почерка точность получилась ниже.
OCR для посимвольного сравнения показывал нестабильность на мелких элементах: символы высотой 10–12 пикселей после бинаризации теряли различимые признаки.
Итог
ИИ-модуль снимает с операторов ручной просмотр типовых бланков по предметам с чистым рукописным текстом: русский язык, история, обществознание. По этим предметам система выдаёт координаты подозрительных областей, оператор проверяет только их. По предметам с формулами и схемами ситуация стала лучше по сравнению с предыдущей версией: ложных срабатываний на нетекстовых областях нет. Но полного автоматического решения там нет, и сложные сканы, нестандартные сечения в схемах, смешанный контент с плотными рукописными вставками в формулы — это по-прежнему требует ручной проверки и глаз человека.
Интересно обсудить подобные задачи, если работали с анализом почерка или верификацией авторства на документах. Как решали проблему вариативности почерка у одного автора?
Автор: NeuroKirKorov


