Ответ
В компьютерном зрении я экспериментировал с anchor-free подходами, которые упрощают pipeline детекции, избавляясь от предзаданных якорей (anchors). Основные семейства:
1. Детекторы на основе ключевых точек (Keypoint-based) CenterNet (Objects as Points) – модель, с которой у меня был наибольший практический опыт. Она детектирует объект как одну точку (центр bounding box) и регрессирует его размеры и другие атрибуты (например, ориентацию в 3D).
# Псевдокод логики вывода CenterNet
heatmap = model(image) # [H, W, C] - карта вероятностей центров классов
scores, indices = torch.topk(heatmap.flatten(), k=100) # Выбор топ-N центров
for score, idx in zip(scores, indices):
y, x = divmod(idx, heatmap.shape[1])
width, height = regress_size(y, x) # Регрессия размеров из отдельных голов
bbox = [x - width/2, y - height/2, x + width/2, y + height/2]
Преимущества: Простая и элегантная архитектура, легко расширяется (например, для оценки позы).
2. Пиксельные детекторы (Pixel-wise / Dense Prediction) FCOS (Fully Convolutional One-Stage) – детектирует объект для каждого пикселя feature map, предсказывая расстояние до границ bounding box (left, right, top, bottom) и класс. Я использовал его для задач, где объекты могли быть сильно разного масштаба.
3. Детекторы на основе пар точек (Corner-based) CornerNet – предсказывает пары верхнего левого и нижнего правого углов, а затем группирует их. На практике я столкнулся со сложностью корректной группировки углов на сцене с множеством перекрывающихся объектов.
Сравнение и мой опыт:
- Anchor-free vs Anchor-based: Anchor-free модели проще (нет гиперпараметров якорей), часто быстрее обучаются и лучше справляются с объектами нестандартных пропорций.
- Проблемы: Основная сложность – подавление дублирующих детекций (NMS). В CenterNet это решается выбором пиков на heatmap.
- YOLOv8: Современные фреймворки, такие как Ultralytics YOLOv8, используют anchor-free подход по умолчанию, что подтверждает тренд в индустрии.
Для нового проекта я бы выбрал anchor-free архитектуру (например, на основе CenterNet или YOLOv8) из-за ее простоты и хорошей производительности.
Ответ 18+ 🔞
А, слушай, вот тут про anchor-free детекцию расскажу — это вообще отдельная песня, блядь. Я с этими подходами так намучился, что ебать мои старые костыли, но в итоге-то понял, в чём прикол.
Ну, короче, вся фишка в том, чтобы нахуй выкинуть эти предзаданные якоря (anchors), которые как будто на дворе 2012-й год. Вместо этого модель учится находить объекты как точки или пиксели — и это, сука, овердохуища упрощает весь пайплайн.
1. Детекторы на основе ключевых точек (Keypoint-based) Вот CenterNet (Objects as Points) — это моя любовь и боль одновременно, ёпта. Там объект — это просто одна точка, его центр. А всё остальное (ширина, высота, ориентация в 3D, если надо) модель дорегрессирует сама. Элегантно, блядь, как швейцарские часы.
# Псевдокод логики вывода CenterNet
heatmap = model(image) # [H, W, C] - карта вероятностей центров классов
scores, indices = torch.topk(heatmap.flatten(), k=100) # Выбор топ-N центров
for score, idx in zip(scores, indices):
y, x = divmod(idx, heatmap.shape[1])
width, height = regress_size(y, x) # Регрессия размеров из отдельных голов
bbox = [x - width/2, y - height/2, x + width/2, y + height/2]
Что хорошо: Архитектура проще некуда, расширяется на раз — хоть позу людей детекть, хоть хвост кошке считать. Но, чувак, если heatmap криво обучена — пиши пропало, будет тебе хиросима и нигерсраки на выходе.
2. Пиксельные детекторы (Pixel-wise / Dense Prediction) FCOS — тут уже для каждого пикселя на карте признаков предсказывается, он ли это объект и сколько от него до каждой границы bounding box. Я его юзал, когда объекты были от мухи до слона на одном кадре. Работает, но иногда такая плотная предсказательная сетка начинает бздеть дубликатами — терпения ноль, ебать.
3. Детекторы на основе пар точек (Corner-based) CornerNet — вот это, блядь, ёперный театр. Модель ищет верхний левый и нижний правый углы объектов, а потом пытается их склеить. И представляешь, когда объекты друг на друге лежат, эта группировка превращается в пизда рулю. Получается такая манда с ушами — углов дохуя, а какие к кому относятся, хуй поймёшь. Я с ней довольно быстро забил.
Так что в итоге, сука?
- Anchor-free vs Anchor-based: Anchor-free — это как машина на автомате: нет этих ёбаных гиперпараметров якорей, которые подбирать надо. Обучается часто быстрее, и если объект вытянутый как хуй с горы, а не квадратный — anchor-free его найдёт без проблем.
- Проблемы: Главная засада — дублирующие детекции. В том же CenterNet это решается поиском пиков на heatmap (типа локальных максимумов), но если два центра объекта рядом — один из них может подавиться. Волнение, ебать!
- YOLOv8: Это вообще показатель. Ребята в Ultralytics уже по умолчанию в YOLOv8 используют anchor-free. Весь мир, сука, понял, что так проще и чаще лучше.
Так что для нового проекта я бы, не думая, взял anchor-free архитектуру — какую-нибудь производную от CenterNet или тот же YOLOv8. Простота какая-то обалденная, и производительность на уровне, а то и выше. Главное — данные нормально разметить и loss-функции не накосячить, а то будет не детекция, а цирк с конями.