- BrainTools - https://www.braintools.ru -

Всем привет! Меня зовут Андрей Иванов, я NLP-исследователь в R&D red_mad_robot. Мы разрабатываем систему Guardrails для защиты персональных данных (PII) и фильтрации небезопасного контента.
В этой статье расскажу, как мы решали задачу точечного маскирования PII на картинках без обучения [1] специальных визуальных детекторов. Разберём связку оптического распознавания символов (OCR) с NER-моделью, покажем метрики на реальных данных, раскроем ограничения подхода и наши решения для их преодоления.
Раньше мы боролись с утечками через бинарную классификацию — просто определяли наличие документа на фото.
Это решало вопрос безопасности, но портило пользовательский опыт [2]. К тому же PII встречаются не только в документах, но и, например, на скриншотах почты, в переписках или соцсетях, где блокировка всего изображения избыточна.
Чтобы пользователю не приходилось вручную редактировать фото, нам потребовалась точечная детекция чувствительных зон.
Обучать визуальные детекторы под каждый тип данных — долго и дорого. Основной массив PII (ФИО, адреса, телефоны, реквизиты) на фото представлен текстом, а для него у нас уже есть готовая NER-модель. И тут нам пришла идея: зачем изобретать велосипед, если можно скрестить её с OCR-движком?
Логика [3] решения такая:
Находим текст на картинке и определяем координаты полигонов.
Распознаём текст внутри полигонов.
Передаём текст в NER-модель.
Если модель находит PII-сущности, маскируем соответствующий полигон.
Мы начали тестировать OCR-движки.
Сначала мы посмотрели на быстрые решения вроде PaddlePaddle [4] и docTR [5]. Их главный минус — плохая работа с кириллицей. Большинство русских слов они заменяют визуально похожими латинскими символами. Например, слово «Уважаемый» превращается в «ybaxaembi??».
Поэтому мы перешли к EasyOCR [6] — лёгкой библиотеке, которая поддерживает русский язык из коробки. Для проверки гипотезы собрали и разметили датасет из 40 качественных изображений: скриншоты переписок, почты и банковских приложений. И запустили наш пайплайн. В результате на этом тесте у нас получилось:
успешно замаскировать 90% персональных данных;
ложно замаскировать 14% полигонов текста.
Однако при переходе к реальным фотографиям (документы в руках, визуальный шум, плохое освещение, пикселизация, нестандартный шрифт) качество работы EasyOCR упало.
Классические архитектуры CRAFT [7] (для детекции) и CRNN [8] (для распознавания) не справлялись: модель либо не детектировала текст, либо распознавала нечитаемый мусор.
Стало ясно, что нужна тяжёлая артиллерия.
Мы заменили движок на SuryaOCR [9] — модель на базе архитектуры 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 [10] — анонсы, события и всё, что происходит вокруг.
И отдельный канал практики R&D — t.me/rmr_rnd [11] — исследования, эксперименты и разработки.
Автор: andrivasg
Источник [12]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/27281
URLs in this post:
[1] обучения: http://www.braintools.ru/article/5125
[2] опыт: http://www.braintools.ru/article/6952
[3] Логика: http://www.braintools.ru/article/7640
[4] PaddlePaddle: https://github.com/PaddlePaddle/Paddle
[5] docTR: https://github.com/mindee/doctr
[6] EasyOCR: https://github.com/JaidedAI/EasyOCR
[7] CRAFT: https://github.com/clovaai/CRAFT-pytorch
[8] CRNN: https://github.com/GitYCC/crnn-pytorch
[9] SuryaOCR: https://github.com/datalab-to/surya
[10] t.me/redmadnews: https://t.me/redmadnews
[11] t.me/rmr_rnd: https://t.me/rmr_rnd
[12] Источник: https://habr.com/ru/companies/redmadrobot/articles/1011450/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1011450
Нажмите здесь для печати.