Перейти к содержимому

Как скрывать подписи в документах: какие методы анонимизации не сработали

Полтора месяца я учился скрывать подписи в документах: какие подходы провалились

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

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

Все имена, организации и изображения в примерах вымышлены.

Сначала пришлось разделить документы на два типа

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

Для текста использовались сразу несколько механизмов:

- словарь фамилий и организаций;
- регулярные выражения для телефонов, адресов и других шаблонов;
- NER-модель Natasha;
- отдельный графический "гейт" для поиска рукописных элементов.

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

Почему простой поиск синего цвета не спасает

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

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

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

После этого появилось жёсткое правило: нельзя закрашивать область только потому, что OCR не прочитал её. Сначала объект должен быть подтверждён распознаванием или детектором.

Из готовых детекторов остался только один

Для эксперимента были проверены несколько готовых моделей обнаружения объектов. На тестовом наборе сравнивались YOLOS, YOLOv8s и YOLOv8s с обработкой изображения плитками.

Контрольный набор включал 32 документа и 1254 страницы, из которых 721 были сканами. При проверке особенно важны были ложные срабатывания: попадания на титульных листах, страницах согласования и регистрации обычно допустимы, а объект в середине обычного текста почти всегда означает испорченную страницу.

Результаты выглядели так:

| Детектор | Всего находок | Ошибочные страницы | Ошибки на страницу |
|---|---:|---:|---:|
| YOLOS | 183 | 18, или 14,1% | 1,40 |
| YOLOv8s | 109 | 1, или 0,8% | 0,13 |
| YOLOv8s с плитками | 134 | 3, или 2,3% | 1,01 |

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

Отдельный детектор печатей тоже не оправдал ожиданий. На документе, где не было ни одной печати, он нашёл четыре объекта с уверенностью от 0,82 до 0,98. Простое повышение порога не помогало: при пороге 0,9 часть настоящих печатей исчезала, а три ложных срабатывания сохранялись. Поэтому модель была исключена из конвейера.

Низкая уверенность не всегда означает плохой результат

На изображениях детектор выделял рукописные элементы с уверенностью примерно 0,52-0,71. По привычным меркам это невысокие значения. Тем не менее рабочий порог был установлен на уровне 0,05.

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

Фамилии рядом с подписями закрывались не детектором, а словарными правилами. Чтобы документ оставался читаемым, одинаковая фамилия внутри одного файла получала одну и ту же маску.

Два разных поворота, которые легко перепутать

Наиболее неприятные ошибки возникали из-за ориентации страницы. Причём существовало два независимых сценария.

Первый связан с параметром `/Rotate` внутри PDF. Библиотека могла вернуть уже повёрнутое изображение, тогда как координаты для закраски рассчитывались в исходной системе. Фамилия при этом находилась правильно, но прямоугольник применялся рядом с ней: личные данные оставались открытыми, а закрывался соседний абзац.

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

Второй сценарий - физически перевёрнутая страница. Документ могли положить в сканер боком, при этом параметра `/Rotate` в файле не было. Текст шёл снизу вверх, и ориентацию приходилось определять самостоятельно через OSD Tesseract.

OSD часто правильно определял направление, но сам OCR после поворота всё равно не справлялся: вместо текста появлялись отдельные бессмысленные фрагменты вроде `Gy`, `PoP` или `BENGE`. Для рукописной формы это закономерно - Tesseract практически не умеет читать подобные подписи.

Автоматическое определение ориентации сначала отключили, а затем при обработке всего корпуса это решение привело к новым пропускам.

Маленький датасет пришлось искусственно расширять

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

Но у такого подхода есть ограничение: синтетическая подпись не повторяет все особенности настоящего документа. В реальном скане на результат влияют:

- качество бумаги;
- тени и складки;
- размытие;
- сжатие PDF;
- фон от текста на обороте;
- шум сканера;
- печати и таблицы рядом с росчерком;
- различия в толщине линий.

Поэтому синтетические данные удобны для первичного обучения, но не заменяют реальные примеры.

Vision-модель сначала видела слишком много, а потом почти ничего

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

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

Вывод оказался практическим: универсальная модель полезна как дополнительный проверяющий слой, но плохо подходит на роль единственного детектора. Её разумнее запускать не на всех страницах, а на небольшом наборе подозрительных областей, найденных более быстрым алгоритмом.

Предобработка изображения помогает не всегда

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

Например, усиление линий помогало сделать подпись заметнее, но вместе с ней подчёркивало границы таблиц. Удаление фона иногда убирало серые артефакты, а иногда стирало тонкие элементы рукописи.

Поэтому универсальная "чистка" перед детектором не стала частью конвейера. Более надёжным оказался выбор режима обработки в зависимости от типа страницы и локальной области.

Закрашивание - это отдельная задача

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

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

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

OCR нужен не только для поиска текста

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

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

Поэтому результаты OCR нельзя использовать без визуальной проверки координат.

Что показала итоговая проверка

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

Рабочая схема в итоге стала многоступенчатой:

1. определить тип страницы и её ориентацию;
2. извлечь текстовый слой, если он есть;
3. найти печатные персональные данные словарями и регулярными выражениями;
4. обработать сканы детектором рукописных объектов;
5. проверить подозрительные области по геометрии и контексту;
6. перенести маски с учётом поворота страницы;
7. повторно прогнать OCR и автоматические проверки;
8. отправить сомнительные страницы на ручной просмотр.

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

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

Прокрутить вверх