Как собирать сложные отрицательные примеры для детектора
Повторяющиеся ложные срабатывания можно превратить в полезную обучающую выборку. Покажем отбор сложного фона по типам сцен и проверку, которая не растворит проблему в общей mAP.
Сначала найдём повторяющийся источник ошибки
Детектор упаковок принимает рисунок на плакате за товар. На обычных полках качество хорошее, но возле рекламного стенда система постоянно завышает остаток. Такие кадры полезны как сложные отрицательные примеры: в них есть визуальные признаки, похожие на целевой объект, но самого объекта нет.
Начните с журнала ложных срабатываний. Сохраните кадр, источник, время, версию модели, класс и score. Затем человек должен проверить, что срабатывание действительно ложное: часть «ошибок» может оказаться пропуском в разметке. Предсказание модели не становится истинной отрицательной меткой автоматически.
Сгруппируйте подтверждённые ошибки по сцене и причине: плакат, отражение, фон соседней полки, мусор на полу. Для видео не нужны сотни одинаковых соседних кадров. Они раздувают набор и создают перекос. Лучше выбрать разнообразные эпизоды, а полный фрагмент сохранить для дальнейшей диагностики.
Подберём кандидатов без тысячи одинаковых кадров
Ниже входом служат проверенные ложные срабатывания. У каждого есть id, тип сцены и уверенность модели. Ограничим число кадров из одного типа двумя, выбрав самые уверенные ошибки. Это простой способ не отдать весь бюджет разметки одному плакату; для настоящего видео добавьте группировку по эпизоду и камере.
Такой отбор предназначен для пополнения обучающей части. Независимую проверку нужно собрать из других эпизодов, чтобы видеть, научилась ли модель общему различию. Если один и тот же фон окажется и в обучении, и в тесте, результат может отражать запоминание сцены.
candidates = [
("p1", "poster", .98), ("p2", "poster", .97), ("p3", "poster", .96),
("r1", "reflection", .92), ("r2", "reflection", .85),
("s1", "shelf_edge", .90),
]
selected, counts = [], {}
for row in sorted(candidates, key=lambda x: (-x[2], x[0])):
scene = row[1]
if counts.get(scene, 0) < 2:
selected.append(row[0])
counts[scene] = counts.get(scene, 0) + 1
print("selected:", selected)
print("by scene:", counts)
assert "p3" not in selected and len(selected) == 5
assert max(counts.values()) <= 2
Выбраны пять кадров: по два плаката и отражения, один край полки. В рабочем наборе добавьте реальные целевые объекты рядом с такими фонами. Иначе детектор может научиться избегать всей сцены и начать пропускать настоящие упаковки у рекламного стенда.
Изображение без объектов должно быть размечено как пустое только после проверки всех целевых классов. Если на нём есть маленькая упаковка, которую оставили без аннотации, обучение получает противоречие. Формат хранения пустой аннотации зависит от используемого датасета и загрузчика; проверьте его на одном кадре до большого запуска.
После переобучения сделайте два отчёта. Первый — качество на обычных независимых сценах. Второй — ложные срабатывания на фиксированном наборе сложного фона с числом изображений или часами видео в знаменателе. Одновременно следите за полнотой на настоящих объектах в этих сценах. Уменьшить число всех предсказаний повышением порога легко, но это не всегда полезное исправление.
Сохраняйте причины добавления примеров и версии разметки. При следующем сборе повторяющиеся ошибки покажут, что уже изученная граница снова нарушилась из-за новых условий, или что возник новый тип фона. Цикл становится управляемым: подтверждённая ошибка, разнообразные данные, обучение, отдельная проверка эффекта.
Для следующего шага пригодится разделение связанных видеокадров.
В платном курсе «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.
