
Верификация подписи — новая полезная фича для работы с документами, которая войдет в наш кросс-платформенный продукт ContentCapture для интеллектуальной обработки информации.
Задача технологии — помогать пользователям проверять подлинность подписи на документах в автоматическом режиме, тем самым упрощая ежедневные бизнес-процессы и обеспечивая более высокий уровень безопасности.
Ниже рассказываем, как мы создавали эту технологию.
Две гипотезы
Технически задача верификации подписей свелась к созданию механизма, который для пары подписей определял бы, являются ли они одинаковыми. Вдохновившись механикой технологий из области распознавания лиц, мы подошли к решению задачи в парадигме сиамских сетей.
Решение разбивается на два этапа:
получение векторного представления (эмбеддинга) для каждой подписи в БД
сравнение эмбеддингов двух подписей для подтверждения/опровержения схожести подписей
Небольшой объем данных для обучения внес свои коррективы в итоговое решение. Отказываться от глубины и сложности сети не хотелось, поэтому основной задачей стало максимальное сокращение числа обучаемых параметров. В качестве backbone-сети было решено использовать одну из предобученных моделей, разработанных для задач классификации изображений. Выбор пал на MobileNet_v3_small, большую часть слоев которой мы заморозили для оптимизации процесса обучения.

Далее мы решили протестировать две гипотезы, чтобы определить наиболее оптимальный подход.
Первая гипотеза — для решения нашей задачи использовать стандартный для сиамских сетей подход. Иными словами, подсчитать вектора признаков для двух подписей (эталонной в БД и новой) и затем вычислить евклидово расстояние между ними. Если оно ниже установленного порога, то считаем подписи идентичными, если больше — разными.
Размерность векторов-эмбеддингов, полученных с выхода сети backbone, предварительно снижалась с добавлением одного-двух линейных слоев. Для обучения использовалась функция потерь Contrastive Loss.

Плюсом такого подхода была относительная интерпретируемость получаемых векторов-эмбеддингов: чем меньше евклидово расстояние, тем подписи визуально более схожи. Однако на практике это не сработало, поэтому решили эту гипотезу немного видоизменить.
В подходе 1.2 решили вместо евклидова расстояния использовать обучаемую функцию расстояния: сначала считаем поэлементно квадрат разности между парой полученных эмбеддингов подписей (так наша обучаемая функция расстояния будет симметрична относительно перестановки первой и второй подписи местами), затем полученный вектор преобразуем в единственную искомую степень различности подписей неглубокой полносвязной сетью, состоящей из трех слоев.
Результат получился заметно лучше по сравнению с гипотезой на базе евклидова расстояния, но ошибок все еще было много.
Во второй гипотезе мы отказались от вычисления интерпретируемого расстояния между подписями. Теперь вычисленные вектора признаков от backbone поэлементно перемножаются, а полученный результат передается в неглубокую полносвязную сеть head, которая занимается бинарной классификацией — на выходе получаем 0 для разных подписей и 1 — для одинаковых. Для обучения использовали бинарную кросс-энтропию — BCELoss.

По результатам тестов вторая гипотеза показала лучшие результаты, поэтому дальше речь пойдет только о ней.
Пользовательский сценарий
Предположительно технология по второй гипотезе будет использоваться в продукте так. В базу данных ContentCapture пользователь добавляет так называемые эталонные подписи сотрудников, которые обладают правом подписи. Это может быть гендиректор, главный бухгалтер или любой другой ответственный за процессы работник.
Как только в ContentCapture поступает новый документ, на котором необходимо верифицировать подпись, программа определяет поля ее изображения и рассчитывает feature-вектор, затем перемножает их с feature-векторами каждой эталонной подписи, и дальше нейросеть выдает заключение о ее подлинности.
Поскольку подпись одного и того же человека может незначительно или существенно изменяться при каждом написании — из-за естественной эволюции почерка, внешних факторов и других причин — целесообразно предоставить пользователю возможность регулировать соотношение Recall и Precision в работе классификатора пар подписей. Мы решили реализовать это на простом и понятном уровне: пользователь может самостоятельно настроить порог бинарного классификатора, выбрав значение в диапазоне от 0 до 1 (по умолчанию — 0,5).

Тестирование
Для тестирования технологии мы использовали 244 подписи, сравнивая каждую из них с одной эталонной (для удобства назовем автора подписи мистер Х). Тестовая выборка была сбалансирована: ровно половина подписей принадлежала мистеру Х, а вторая половина — другим людям.
Мы протестировали различные значения порога классификатора в диапазоне от 0,1 до 0,995. В результате наилучшие показатели продемонстрировал порог 0,99, обеспечивший точность (accuracy) на уровне 90%.

Что дальше
В настоящее время технология успешно обрабатывает как чистые изображения, так и изображения с шумами, сложными фонами и наложением печатей на область подписи.
В дополнение к этому мы планируем откалибровать порог уверенности так, чтобы он обеспечивал баланс между Recall и Precision на уровне 0,5. Это значение выбрано не случайно: оно интуитивно понятно и используется по умолчанию. В текущей настройке на этом уровне наблюдается нежелательный перекос, поэтому корректировка порога поможет достичь более предсказуемой работы механизма.
Комментарии (4)
ahdenchik
06.06.2025 14:33А вот эксперты изучают не изображения подписей: их интересует наклон и сила нажатия пишущего инструмента
ZEV1416
Объясните мне: зачем это уродливое слово "верифицировать"? Есть же нормальное "проверять" - оно короче (экономия времени), имеет тот же смысл, его легче произносить. Понимаю кальку с английского, если она чем-то упрощает жизнь, но это?
Margutoop
Потому что "проверять" можно только домашнюю работу (как пример). Для технологий используются другие термины, по аналогии с "идентификацией", ровно также это работает в обратную сторону. Согласись, глупо было бы говорить "верифицировать" домашнюю работу. А так, в русском языке полно англицизмов, и ничего удивительного нет в этом. Любые языки заимствуют что-то друг у друга.
alabamaa
На мой взгляд, проверять и верифицировать это все-таки не синонимы. Верификация это скорее более конкретный вид проверки: "проверка на подлинность".
Так же, как и тестировать - это тоже проверять, но более конкретно: "проверять на работоспособность".