Модель считает товары: как принять результат по ошибке подсчёта
Если бизнесу нужно количество объектов, хорошая mAP ещё не завершает приёмку. Посчитаем ошибку количества по сценам и отделим систематический недосчёт от взаимного погашения ошибок.
Метрика должна доходить до итогового числа
Модель находит товары на полке, затем сервис сообщает их количество. У детектора приличная метрика локализации, но складской отчёт регулярно расходится с ручным подсчётом. Между рамкой и итоговым числом стоят фильтрация классов, порог уверенности, удаление повторов и правила зоны подсчёта. Проверять надо результат всей этой последовательности.
Определите единицу приёмки: кадр, полка, контейнер или законченный проход через линию на видео. Для статичной полки одна сцена даёт одно число. Для видео количество рамок по всем кадрам не равно количеству уникальных товаров: один предмет виден многократно. Там нужен трекинг или правило пересечения линии, после чего оцениваются уже итоговые события.
Для каждого примера сохраните истинное и предсказанное количество. Средняя абсолютная ошибка покажет, на сколько объектов обычно расходится счёт. Средняя знаковая ошибка покажет систематический недосчёт или пересчёт. Доля точных совпадений полезна для операций, в которых даже одна ошибка ведёт к ручному пересмотру.
Почему общая сумма скрывает ошибки по полкам
В примере три сцены: пустая полка и две заполненные. Система ошибается на двух из трёх, хотя сумма предсказаний совпадает с истинным итогом. Это показывает, почему сводная инвентаризация не заменяет приёмку отдельных полок.
Ошибку считаем как predicted−actual. Нулевая средняя знаковая ошибка не означает точного подсчёта: положительные и отрицательные отклонения могут взаимно сократиться. Поэтому выводим рядом MAE, смещение и число полностью верных сцен.
actual = [0, 10, 20]
predicted = [2, 8, 20]
errors = [p-y for y, p in zip(actual, predicted)]
mae = sum(abs(e) for e in errors) / len(errors)
bias = sum(errors) / len(errors)
exact = sum(e == 0 for e in errors) / len(errors)
print("total:", sum(actual), sum(predicted))
print("MAE:", round(mae, 3), "bias:", bias, "exact:", round(exact, 3))
assert sum(actual) == sum(predicted) == 30
assert mae > 0 and bias == 0 and exact == 1/3
Истинный и предсказанный итоги равны 30. MAE составляет 1,333 объекта на сцену, смещение равно нулю, точна только треть сцен. Пустая полка получила два лишних товара, следующая потеряла два. Приёмка только по сумме признала бы такой результат идеальным.
Для продолжения откройте сцены с максимальным недосчётом и пересчётом отдельно. Перекрывающиеся товары могут сливаться в одну детекцию, изображения на плакатах — давать лишние рамки, обрезанный краем кадра предмет — попадать в счёт непоследовательно. Для последнего случая нужно правило: считать видимые части или только целиком попавшие в зону объекты.
Оцените качество по плотности сцены и условиям съёмки. Ошибка в два предмета на пустой полке и в коробе со ста предметами имеет разное операционное значение. Процентную ошибку нельзя без оговорок усреднять при нулевом истинном количестве; оставьте MAE в объектах и отдельный отчёт о ложных находках на пустых сценах.
Порог и правила постобработки выбирайте на валидации, затем замораживайте перед финальным тестом. Если меняются детектор, трекер или граница зоны, заново прогоняйте полный расчёт количества. Артефакт приёмки должен содержать id сцены, две величины, ошибку и изображение результата — так спорное число можно быстро объяснить человеку.
Для следующего шага пригодится что измеряют разные варианты mAP.
В платном курсе «Computer Vision Engineer: от детекции и Doc-AI до продакшна» вы обучаете детекторы и работаете с трекингом на прикладных задачах, включая полки в рознице. Это помогает довести метрику модели до проверяемого результата подсчёта. Откройте программу курса.
Продолжить на практике
- Computer Vision Engineer: от детекции и Doc-AI до продакшна ↗
Практический курс по Computer Vision. Соберёте продакшн-сервис: датасет → обучение (YOLO/RT-DETR, SAM), трекинг, OCR/Doc-AI, веб-приложение (UI+API) и мониторинг. Экспорт в ONNX/TensorRT/OpenVINO, батчинг/квантование под CPU/GPU. Плюс профессиональные блоки: mAP/IoU/Dice и калибровка доверия, QA разметки и аугментации, p95/стоимость, дрейф данных и алерты, guardrails (NMS/правила), A/B-тесты, Triton/gRPC/FastAPI.
