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

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

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

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

Что уже было

Предыдущая версия системы работала на 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 пикселей после бинаризации теряли различимые признаки.

Итог

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

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

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


  1. vagsin
    21.05.2026 18:08

    ну и что?? никакой аналитики просто вопрос? Куда вы катитесь!


  1. PChichagov
    21.05.2026 18:08

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


    1. Arhammon
      21.05.2026 18:08

      скоринг почерка может сравнивать почерк по различным параметрам (угол наклона, высота, связи и тп)

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


      1. PChichagov
        21.05.2026 18:08

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


        1. Arhammon
          21.05.2026 18:08

          Именно так, когда недавно надо было сделать прописной текст, текст "чтоб было"(не предполагающий, что его кто-то будет читать, а тем более понимать) нашел много удивительного, например р у меня вдруг стала r. Там не то что 2 разных человека писали, там штук 10 найти можно наверно.

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


          1. PChichagov
            21.05.2026 18:08

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


  1. 1dntfkngcare
    21.05.2026 18:08

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


  1. KonstantinTokar
    21.05.2026 18:08

    Как мне представляется, один из популярных способов исправить бланк - зачеркнуть букву или цифру и написать исправление. В реальности такие исправления пишутся не тем почерком как основная строка, да ещё и буст за близость строк. Это детектится?