Тайлинг помогает детекции мелких дефектов по одной причине: объект перестаёт ужиматься вместе со всем кадром. Снимок режут на фрагменты, каждый фрагмент растягивают до входа сети, и скол, который на полном кадре занимал пару пикселей, получает десятки. В разборе на Habr нарезка только тестовых снимков при неизменной модели дала прирост AP на мелких объектах на 9,4% и mIoU на 8,8%: веса, архитектура и обучение остались прежними.
Цена тоже конкретная. Снимок обрабатывается как несколько фрагментов плюс целый кадр, поэтому время инференса растёт кратно. Крупные дефекты страдают: на фрагменте они видны частично и распадаются на несколько детекций вместо одной. Обучение только на увеличенных фрагментах ломает работу на полном кадре.
Дальше по порядку: почему мелкие объекты теряются до того, как их увидит сеть, как собрать тайлинг из пяти шагов, какие цифры он даёт на производственных снимках автомобилей и как поймать регресс на крупных дефектах отдельной метрикой.
Почему мелкие дефекты исчезают ещё до того, как их увидит сеть
Модель Mask R-CNN здесь ни при чём. Потери происходят на этапе подготовки кадра, до первого слоя свёртки. Задача с повреждениями автомобилей это показывает наглядно.
Что происходит с объектом при уменьшении кадра
Цепочка короткая: исходный снимок, ресайз до входа сети, карта признаков. Уменьшение кадра пропорционально уменьшает и объект. Дефект шириной 20 пикселей при коэффициенте 1,5-2 превращается в 10-13 пикселей, дефект в 10 пикселей - в 5-7. Интерполяция не создаёт новой информации об объекте, она лишь усредняет соседние пиксели.
Набор, о котором идёт речь, содержит 1812 производственных снимков с повреждениями автомобилей. Медианный размер кадра около 714×479, и перед подачей в сеть снимки уменьшают ещё раз. При входе 512 около 41% дефектов становятся меньше 8 пикселей, а среди деталей кузова таких всего 1,6% (разбор кейса на Habr).
Восемь пикселей - граница, за которой свёрточные признаки перестают различать форму. На самой подробной карте FPN после ресайза от мелкого скола остаётся одна-две клетки. Классификатору и маск-голове нечего анализировать, кроме факта «здесь что-то чуть темнее фона».
Почему общая метрика врёт: AP по размерам объектов
Одна цифра AP по датасету ничего не говорит о мелких дефектах. На автомобильных снимках картина такая: чем крупнее объект, тем выше качество, а на самых мелких оно почти ноль. Средняя метрика выглядит прилично только потому, что её вытягивают крупные детали кузова.
Первый шаг до любого тайлинга: разбить разметку на размерные бакеты по площади маски и посчитать AP в каждом. Границы удобно брать как в COCO (менее 32², 32²-96², более 96² пикселей) или свои, под масштаб конкретных дефектов. Провал целиком в первом бакете означает, что нарезка даст эффект. Ровный AP по всем бакетам говорит о другой проблеме: разметка, классы, порог NMS.
Как устроен тайлинг: схема из пяти шагов
Схема, которая использовалась в кейсе с автомобилями, воспроизводится на любом детекторе или сегментаторе:
- Нарезать снимок на фрагменты.
- Каждый фрагмент растянуть до входного размера сети.
- Найти объекты на фрагментах.
- Вернуть найденное в координаты исходного снимка и убрать дубли.
- Отдельно прогнать снимок целиком, чтобы не потерять крупные объекты.
Нарезка, растяжение и обратное проецирование координат
Фрагмент растягивается, поэтому координаты предсказаний живут в системе тайла. Обратное преобразование: x = x_offset + x_pred × (tile_width / input_width), аналогично для y, ширины и высоты. Проецировать нужно и боксы, и маски: логит-маску кропа апскейлят до размера тайла бинарной интерполяцией и вставляют в общую маску кадра. Ошибка в коэффициенте или забытый offset дают рамки, которые уезжают на десятки пикселей. Метрика падает, а причина в арифметике.
Удаление дублей и зачем нужен прогон целого кадра
Дубли появляются в двух местах: на перекрытиях соседних тайлов и на границах. Первые снимает NMS по IoU. Вторые сложнее: объект, разрезанный границей, даёт две неполные детекции с низким взаимным IoU, и стандартный NMS считает их разными объектами.
Перекрытие тайлов уменьшает проблему. В исследовании на дефектах печатных плат тайловый инференс сохранял локальные детали, но вносил артефакты на границах, а добавление перекрытия 128 px подняло recall в пограничной зоне примерно с 26-63% до 70-100% (arXiv 2605.24726). Универсального значения нет: перекрытие подбирают под размер самого крупного объекта, который не должен целиком попадать на границу.
Прогон целого кадра страхует крупные дефекты, которые на фрагментах распадаются на части. Шаг добавляет ещё один проход по снимку и ещё немного времени инференса. Экономить на нём нельзя: без него крупные объекты выпадают из результата.
Сколько даёт тайлинг только на тесте: цифры и цена
Самый дешёвый эксперимент: модель, веса и гиперпараметры не трогаем, режем только тестовые снимки. На тех же 1812 снимках с повреждениями автомобилей AP на мелких объектах вырос на 9,4%, mIoU на 8,8% (отчёт по эксперименту). Переобучение не понадобилось, весь код сводится к нарезке, обратному проецированию и дедупликации.
Почему прирост именно на мелких объектах
Мелкий дефект при тайлинге занимает куда большую долю входа сети, поэтому признаки становятся различимыми: у объекта появляются контур, текстура, внутренняя граница. Крупные дефекты и так хорошо видны на полном кадре, там прирост близок к шуму измерений. Отсюда и картина, которую видно в размерных бакетах: первый бакет растёт заметно, последний почти не двигается.
Что происходит со временем инференса
Время растёт примерно линейно числу проходов сети. Сетка 3×3 плюс целый кадр - это десять прогонов на один снимок вместо одного. Для офлайн-разбора архива или ночного батча такая цена приемлема. Для видеопотока или конвейера с тактом в сотни миллисекунд это уже блокер, и считать бюджет нужно до запуска, а не после.
Литература даёт ориентиры. SAHI (Akyon и др., 2022) нарезает изображение на перекрывающиеся куски прямо на инференсе и подходит к любому детектору. На VisDrone и xView нарезка без переобучения добавила 5,1-6,8% AP детекторам FCOS, VFNet и TOOD, а с дообучением на нарезанных данных - 12,7-14,5%.
Где тайлинг ломается: обучение на фрагментах и смешивание масштабов
Два провала повторяются чаще всего. Оба связаны с масштабом, а не с качеством разметки или архитектурой.
Почему обучение только на фрагментах ухудшает целый кадр
Обучение только на сильно увеличенных фрагментах даёт модели искажённое представление о мире: на входе она всегда видит крупные объекты и не учится искать мелкое. На полном кадре результат хуже, чем до эксперимента. Это не гипотеза: SNIP (Singh, Davis, 2018) показал, что расхождение масштабов между обучением и тестом вредит детекторам. В SNIP обучение и тест идут на одних масштабах пирамиды, а градиент на каждом масштабе дают только объекты подходящего размера.
SNIPER (Singh и др., 2018) развил идею: сеть учится на чипах вокруг объектов вместо целых изображений, и пикселей на это уходит лишь немногим больше, чем при обычном одномасштабном обучении. Практический вывод простой: проверяйте модель в том режиме, в котором обучали.
Кейс с дефектами печатных плат показывает цену ошибки в цифрах. Детектор, обученный на полных изображениях, при тайловом инференсе падает до mAP@50 = 0,01. Та же архитектура, обученная на тайлах 640×640, даёт 0,72 на PCB-Defect и 0,94 на HRIPCB (сравнение стратегий инференса).
Смешивание масштабов и распад крупных объектов на части
Смешивание масштабов (полный кадр и увеличенные фрагменты в одной обучающей выборке) возвращает мелким объектам шанс, зато бьёт по крупным. Крупный дефект на фрагменте виден частично, и модель выдаёт несколько частичных детекций вместо одной целой. Портится и AP, и геометрия маски: вместо одного контура царапины в предсказании появляется набор фрагментов, которые формально покрывают разметку, но описывают её неправильно.
Spatial Mask Merging и Topology-Aware Tile Merging (TA-TM) пытаются собрать частичные маски обратно. Полностью проблему они не снимают: слияние опирается на геометрию и уверенность модели, а не на понимание объекта, и при сильном перекрытии соседних дефектов легко склеивает лишнее.
Как измерить фрагментацию крупных объектов отдельной метрикой
Распад крупных объектов прячется в среднем AP, поэтому его нужно считать отдельно. Три диагностики, которые дают разную чувствительность:
- отношение числа предсказанных масок к числу ground-truth объектов крупнее порога: 1,0 близко к идеалу, 2,5 означает, что крупный дефект в среднем режется на два-три куска;
- доля крупных GT, покрытых более чем одной предсказанной маской;
- средняя площадь частичной маски относительно площади GT: значения около 0,3-0,5 прямо указывают на распад.
Это диагностика, а не канон, и пороги зависят от задачи. Смысл в сравнении режимов между собой: полный кадр, тайлинг, тайлинг со слиянием. Рост доли раздробленных объектов при неизменном среднем AP значит, что выигрыш на мелких куплен деградацией на крупных.
Постобработка помогает выровнять числа. TA-TM строит граф смежности тайлов и корректирует оценки граничных детекций по согласию соседних тайлов перед глобальным NMS, не требует переобучения и не зависит от архитектуры (описание метода). Своя метрика фрагментации при этом остаётся нужна: она измеряет то, что NMS и слияние не видят.
Чек-лист: стоит ли тайлинг вашей задаче
Пять шагов, которые проходят до включения тайлинга в прод:
- Посчитать долю объектов, исчезающих после ресайза: сколько масок становится меньше 8 пикселей на рабочем входе сети.
- Оценить AP по размерным бакетам и убедиться, что провал действительно в мелких объектах.
- Проверить модель в том же режиме, в котором обучали: тайловый инференс для модели, обученной на полных кадрах, без переобучения может обрушить качество.
- Измерить фрагментацию крупных объектов отдельной метрикой до и после включения нарезки.
- Замерить рост времени инференса и сверить его с бюджетом latency.
Рамка применимости получается такой. Дефекты мелкие, инференс батчевый или офлайн - нарезка теста даёт быстрый выигрыш без переобучения, это самый выгодный первый ход. Дефекты крупные, инференс в реальном времени, датасет простой - тайлинг скорее навредит: время вырастет, а точность останется на месте. Если готовы пересобирать датасет, дообучение на нарезанных данных обещает больший прирост (12,7-14,5% AP по опыту SAHI), но требует новой разметки на фрагментах и обязательной валидации на полных кадрах.
Что в итоге: тайлинг как инструмент, а не серебряная пуля
Тайлинг помогает мелким дефектам, потому что возвращает им пиксели, которые съедает ресайз. Плата - кратное время инференса и риск для крупных объектов, которые на фрагментах распадаются на частичные детекции. Ключевое условие успеха: режим обучения и режим инференса должны совпадать, иначе модель, обученная на полных кадрах, при нарезке теряет всё.
Без размерных метрик выигрыш на мелких легко не заметить, а без метрики фрагментации - пропустить регресс на крупных. Общая AP в этой задаче молчит об обоих процессах, поэтому считать её единственным ориентиром нельзя.
Рабочий порядок действий: посчитать долю объектов меньше 8 пикселей на своём входе, разложить AP по размерам, прогнать дешёвый эксперимент с нарезкой только теста и сравнить его с полным кадром по трём числам сразу: AP мелких объектов, фрагментация крупных, время инференса. Дальше решение принимается по бюджету latency, а не по обещаниям метода.