Тайлинг
Презентации любой новой yolo модели всегда впечатляют: всё детектится и распознаётся корректно. Однако основной домен, с которым я работаю — это cctv камеры. И здесь уже не всё так хорошо.
Ракурсы, освещение, качество картинки - небольшой список того, на что всегда нужно обращать внимание при работе с этим доменом. Но зачастую основная моя боль — маленькие объекты.
Допустим, у нас есть объект на большой картинке, размер объекта 50 пикселей. И пусть мы не можем себе позволить работать на большой картинке по видеопамяти. Первое, что приходит в голову — ресайз. Но если мы ресайзнем картинку, например, в 3 раза, то и наш объект станет меньше в 3 раза. То есть, вместо 50 пикселей станет 17. Что-то понять про объект на 17 пикселях гораздо сложнее как модели, так и человеку.
📌 И здесь приходит на помощь такая техника, как тайлинг. Тайлинг - техника инференса, когда изображение сначала нарезается на небольшие перекрывающиеся фрагменты (тайлы), а затем модель прогоняется на них по отдельности. Тот же объект 17×17 на полном кадре на отдельном тайле может занимать уже 50+ пикселей — и модель его уверенно находит.
Но есть проблема. Если тайлы разобьют объект на части, то детектор их выделит на каждом тайле. И вместо одного бокса, соответствующего одному объекту, мы получим несколько, которые охватывают его части. Классический NMS здесь не поможет: он заточен на удаление дублей, которые перекрывают объект целиком, а не его фрагменты.
📌 Здесь мы переходим ко второму секретному ингредиенту нашего решения - WBF/Weighted Boxes Fusion.
В отличие от NMS, который жёстко выбирает «победителя» и выбрасывает остальных, WBF усредняет все боксы кластера с весом по confidence. Чем увереннее было предсказание — тем больше его влияние на итоговые координаты.
Вот теперь получится один бокс на каждый объект — без дублей и без потери точности локализации.
📌 Пара советов про тайлинг:
❤️В идеале лучше сразу обучать на тайлах, чтобы на инференсе не было геометрии, которую модель не видела при обучении.
❤️Перекрытие лучше, чем ровная нарезка — оно даёт объектам на границах больше пространства для уверенной детекции.
❤️Нужно фильтровать боксы при тайлинге, так как нам не нужно детектировать их отдельные части. Порог IoU (пересечение бокса с тайлом) зависит от класса: для машины можно взять 0.2, для человека уже 0.5.
❤️Желательно работать с фиксированной сеткой тайлов - это даёт предсказуемое потребление по скорости и памяти. Например, FullHD 3покрываем сеткой 4×2, а 2К сначала ресайзим в FullHD, а только потом нарезаем.
Важный момент: тайлинг - это не панацея. Если детектор плохо обучен, то тайлинг не поможет улучшить детекцию.
P.S. Репозиторий для встраивания тайлинга в пайлпайн ultralytics, mmdetection и так далее.
Герман Петров