
Всем привет! Меня зовут Андрей Иванов, я NLP-исследователь в R&D red_mad_robot. Мы разрабатываем систему Guardrails для защиты персональных данных (PII) и фильтрации небезопасного контента.
В этой статье расскажу, как мы решали задачу точечного маскирования PII на картинках без обучения специальных визуальных детекторов. Разберём связку оптического распознавания символов (OCR) с NER-моделью, покажем метрики на реальных данных, раскроем ограничения подхода и наши решения для их преодоления.
Гипотеза: связка оптического распознавания и NER
Раньше мы боролись с утечками через бинарную классификацию — просто определяли наличие документа на фото.
Это решало вопрос безопасности, но портило пользовательский опыт. К тому же PII встречаются не только в документах, но и, например, на скриншотах почты, в переписках или соцсетях, где блокировка всего изображения избыточна.
Чтобы пользователю не приходилось вручную редактировать фото, нам потребовалась точечная детекция чувствительных зон.
Обучать визуальные детекторы под каждый тип данных — долго и дорого. Основной массив PII (ФИО, адреса, телефоны, реквизиты) на фото представлен текстом, а для него у нас уже есть готовая NER-модель. И тут нам пришла идея: зачем изобретать велосипед, если можно скрестить её с OCR-движком?
Логика решения такая:
-
Находим текст на картинке и определяем координаты полигонов.
-
Распознаём текст внутри полигонов.
-
Передаём текст в NER-модель.
-
Если модель находит PII-сущности, маскируем соответствующий полигон.
Мы начали тестировать OCR-движки.
Проверка легковесных OCR-движков
Сначала мы посмотрели на быстрые решения вроде PaddlePaddle и docTR. Их главный минус — плохая работа с кириллицей. Большинство русских слов они заменяют визуально похожими латинскими символами. Например, слово «Уважаемый» превращается в «ybaxaembi??».
Поэтому мы перешли к EasyOCR — лёгкой библиотеке, которая поддерживает русский язык из коробки. Для проверки гипотезы собрали и разметили датасет из 40 качественных изображений: скриншоты переписок, почты и банковских приложений. И запустили наш пайплайн. В результате на этом тесте у нас получилось:
-
успешно замаскировать 90% персональных данных;
-
ложно замаскировать 14% полигонов текста.
Однако при переходе к реальным фотографиям (документы в руках, визуальный шум, плохое освещение, пикселизация, нестандартный шрифт) качество работы EasyOCR упало.
Классические архитектуры CRAFT (для детекции) и CRNN (для распознавания) не справлялись: модель либо не детектировала текст, либо распознавала нечитаемый мусор.
Стало ясно, что нужна тяжёлая артиллерия.
Переход на Vision Transformer
Мы заменили движок на SuryaOCR — модель на базе архитектуры Vision Transformer.
Важное уточнение: SuryaOCR распространяется под лицензией GPL-3.0, что накладывает ограничения на её использование в коммерческих закрытых продуктах. Однако для нашего R&D-исследования и проверки гипотез в рамках экспериментов она подошла идеально.
На идеальных изображениях она предсказуемо обошла EasyOCR (успешно замаскировали 96,2%), но её главным преимуществом стала устойчивая работа с реальными фотографиями.
Для стресс-теста мы собрали 15 фотографий документов в сложных условиях: в руках, под углом, на зашумлённом фоне. Разница оказалась колоссальной: SuryaOCR уверенно находила и считывала текст там, где EasyOCR пасовал.
В результате на этом тесте:
-
успешно замаскировали 90% персональных данных;
-
ложно замаскировали 15% полигонов текста.
Мы получили пайплайн, который хорошо скрывает персональные данные. Но вскрылась новая проблема — картинки с текстом под углом.
Решение проблемы повёрнутого текста
Что делать, если пользователь прислал перевёрнутую фотографию или фото под углом? SuryaOCR отлично детектирует полигоны повёрнутого текста, но этап распознавания на них ломается. Даже при небольших углах наклона модель выдаёт бессмысленный набор букв.
Мы разделили SuryaOCR на две независимые модели: детектор полигонов и распознаватель текста. Это позволило нам применить инженерный трюк:
-
Детектор находит полигон текста.
-
По координатам точек вычисляем угол наклона относительно горизонтальной оси.
-
Вырезаем полигон и программно поворачиваем его до горизонтального состояния.
-
Отправляем выровненный фрагмент в распознаватель.
Здесь возникает нюанс: выровняв полигон горизонтально, мы не знаем, где у него верх, а где низ. Текст может оказаться перевёрнутым на 180°. Решение «в лоб» — перевернуть полигоны в обе стороны, прогнать через распознаватель оба варианта и выбрать тот, у которого вероятность выше. Это удваивает вычислительную нагрузку на этапе распознавания, но неплохо решает проблему с ориентацией фото.
После выравнивания текст распознается отлично. Алгоритм стабилен, хотя детектор из-за наклона изредка может пропускать блоки текста.
Выводы
Наш подход полностью подтвердил изначальную гипотезу: комбинацию OCR и PII-NER можно использовать для точечного маскирования чувствительных зон на фотографиях.
Однако решение получилось громоздким. Итоговый результат мультипликативно зависит от качества сразу трёх тяжёлых моделей: детектор, распознаватель и NER. Сложная логика с поворотами и кропами добавляет системе лишние степени свободы, которые неизбежно ведут к ошибкам при масштабировании.
Эксперименты помогли нам нащупать границы OCR-подхода. В итоге мы пришли к более элегантному и автономному решению для маскирования, о котором надеемся рассказать в ближайшем будущем.
Над материалом работали
Текст — Андрей Иванов
Редактура — Игорь Решетников
Иллюстрации — Саша Буяк
Это блог red_mad_robot. Мы запускаем цифровые бизнесы и помогаем компаниям внедрять AI. Здесь команда разработки делится опытом на реальных кейсах, а аналитики разбирают, куда движется индустрия. Мы бы подписались.
Наш Telegram-канал — t.me/redmadnews — анонсы, события и всё, что происходит вокруг.
И отдельный канал практики R&D — t.me/rmr_rnd — исследования, эксперименты и разработки.
Автор: andrivasg


