ADR-SRV-005. Нормализация изображений (orthocover)

ADR Версия: 1.0 accepted

Кадры пакета — это фото форм ИК (под углом, с фоном, с изгибом). Для проверки и распознавания нужен вид «как со сканера». Фиксируем: нормализацию выполняет внешний ML-сервис orthocover за абстракцией IImageNormalizer; запуск — ручной (кнопка на предобработке); обработанное изображение хранится рядом с оригиналом, а кадр получает ссылку на него. Тип страницы для сервиса выводится из роли кадра.

⟨/⟩ Исходник

1. Контекст и постановка задачи

Оператор снимает форму ИК камерой рабочего места: кадр перекошен, с фоном и изгибом. Этап «Проверка файлов» показывает переключение «оригинал ↔ обработанное», а распознавание полей идёт по выровненному изображению. Значит нужен шаг нормализации: получить из фото чистое выровненное изображение «как со сканера».

Писать свой пайплайн (сегментация/выравнивание/dewarp) — отдельный ML-проект. Есть готовый внешний сервис orthocover, который это делает и попутно детектит штрихкоды. Нужно зафиксировать, как мы его подключаем, когда запускаем и где храним результат, не завязывая прикладной код на конкретный сервис.

2. Драйверы решения

  1. Не строить свой ML — переиспользовать готовый сервис нормализации.
  2. Изоляция — прикладной код не должен зависеть от конкретного сервиса (сменяемость).
  3. Без фоновой инфраструктуры — очереди/воркеров пока нет; запуск должен работать «здесь и сейчас».
  4. Предсказуемое хранение — обработанное лежит рядом с оригиналом, доступно по варианту.

3. Рассмотренные варианты

4. Решение

Выбран Вариант A.

4.1. Абстракция и клиент

4.2. Контракт сервиса (orthocover)

4.3. Тип страницы из роли кадра

Роль штрихкода → barcode (только коды, без картинки); остальные роли → text (кроп листа + dewarp).

4.4. Хранение результата

Обработанный PNG — в файловом хранилище под ключом <номер пакета>/<NN>_<роль>_norm.png (схема ключей — ADR-002). Кадр получает ссылку на обработанное, флаг качества и время обработки. Содержимое отдаётся тем же endpoint выдачи кадра с параметром variant=normalized.

4.5. Запуск — ручной

Кнопка «повторить обработку» на предобработке: пер-кадровый вызов POST /api/InputPacket/{id}/frames/{order}/normalize (есть и пакетный .../normalize). Обработка синхронная (≈2–5 с/кадр). Сбой по кадру не валит остальные — фиксируется в сводке.

4.6. Конфигурация

Orthocover:Url — в appsettings (не секрет). Orthocover:ApiKey — секрет: локально в appsettings.Local.json (вне git) или переменной окружения; на стендах — через devops-генератор конфигов (ADR-SRV-004). Пустой Url = интеграция не сконфигурирована (клиент вернёт понятную ошибку).

4.7. Что не делаем сейчас

5. Положительные следствия

6. Отрицательные следствия и компромиссы

7. Проверка

8. Открытые вопросы / отложено

Связанные артефакты

Документы