Есть ли детекция без anchor-box?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Детекция объектов без anchor-box
Да, существует несколько подходов к детекции объектов без использования anchor-box (якорных блоков). Это особенно актуально в последние годы, так как anchor-free методы показывают лучшую производительность и более просты в реализации.
История развития
Anchor-based методы (R-CNN, YOLO v1-v3, SSD, Faster R-CNN) использовали предопределённые якорные блоки разных размеров и соотношений сторон. Это требовало:
- Много ручной работы при выборе anchor размеров
- Сложную матчинг процедуру между ground truth и anchors
- Много гиперпараметров
Anchor-free методы избегают этих проблем.
Основные anchor-free подходы
1. CornerNet (2018)
Обнаруживает объекты как пары углов (top-left и bottom-right).
# Принцип работы
# 1. Предсказываем тепловые карты для левых-верхних углов
# 2. Предсказываем тепловые карты для правых-нижних углов
# 3. Объединяем углы, которые принадлежат одному объекту
from cornernet_lite import CornerNet
model = CornerNet(num_classes=80) # COCO dataset
# Входное изображение -> Backbone -> Heatmaps for corners
Преимущества:
- Без якорей и NMS
- Проще обнаруживать объекты с необычными пропорциями
Недостатки:
- Сложнее в реализации
- Медленнее чем YOLO
2. CenterNet (2019)
Обнаруживает объекты по центру и предсказывает их размер.
# Концепция: один объект = одна точка в центре
from torchvision.models.detection import fasterrcnn_resnet50_fpn
# CenterNet выходной формат:
# center_heatmap: (H, W) - вероятность наличия объекта
# size_map: (H, W, 2) - высота и ширина объекта
# offset_map: (H, W, 2) - смещение от grid ячейки к центру
# Inference:
detections = []
for y, x in center_locations:
w, h = size_map[y, x]
offset_y, offset_x = offset_map[y, x]
# Реальный центр: (x + offset_x) * stride, (y + offset_y) * stride
bbox = [x - w/2, y - h/2, x + w/2, y + h/2]
detections.append(bbox)
Преимущества:
- Простая идея - один объект = одна точка
- Быстрый inference
- Не требует NMS
3. YOLO v4-v8 (anchor-free версии)
Новые версии YOLO постепенно отошли от anchors:
from ultralytics import YOLO
# YOLOv8 - полностью anchor-free
model = YOLO(yolov8n.pt) # nano version
results = model(image_path)
# YOLOv8 предсказывает:
# - Вероятность объекта в каждой ячейке сетки
# - Прямые координаты bbox (x_center, y_center, width, height)
# - Классы объектов
# Без якорей -> проще, быстрее, лучше
4. FCOS (Fully Convolutional One-Stage Object Detection)
Обрабатывает каждый пиксель как потенциальный центр объекта.
# Каждый пиксель в feature map может быть центром bbox
# Предсказываем для каждого пикселя:
# - Вероятность содержить центр объекта
# - Расстояния до четырёх сторон объекта (left, right, top, bottom)
from fcos_core.config import cfg
from fcos_core.modeling.detector import build_detection_model
model = build_detection_model(cfg)
# Выход: class_logits, bbox_regression
# Для пиксела (i, j):
# bbox = [x - left, y - top, x + right, y + bottom]
Преимущества FCOS:
- Полностью свёрточная архитектура
- Каждый пиксель - потенциальный центр
- Не требует ручного выбора anchor размеров
5. RepPoints (Representational Points)
Объект представляется набором репрезентативных точек.
# Вместо bbox, предсказываем N точек, которые хорошо
# описывают форму объекта
# Например, 9 точек расположены так:
# 1 - 2 - 3
# | | |
# 4 - 5 - 6 (5 - центр)
# | | |
# 7 - 8 - 9
# Эти точки можно преобразовать в bbox, но они
# более гибкие для сложных форм
Сравнение подходов
| Метод | Пространство поиска | Простота | Скорость | Точность |
|---|---|---|---|---|
| Anchor-based | Дискретное (anchors) | Сложно | Средняя | 80-85% |
| CornerNet | Углы | Сложно | Медленно | 85-87% |
| CenterNet | Центр + размер | Просто | Быстро | 85-88% |
| FCOS | Каждый пиксель | Средне | Быстро | 86-89% |
| YOLOv8 | Сетка (без anchors) | Просто | Очень быстро | 87-89% |
| RepPoints | Репрезентативные точки | Средне | Быстро | 88-90% |
Почему anchor-free лучше?
-
Меньше гиперпараметров — не нужно выбирать anchor sizes и ratios
-
Более гибкий поиск — не привязаны к предопределённым формам
-
Проще реализация — нет сложного matching между GT и anchors
-
Лучшая обобщаемость — лучше работает на новых доменах
-
Быстрее inference — без NMS или с более простой версией
Практический пример с YOLOv8
from ultralytics import YOLO
import cv2
# Загрузить модель
model = YOLO(yolov8m.pt) # medium version
# Детекция на изображении
results = model(image.jpg, conf=0.5)
# Результаты
for r in results:
for box in r.boxes:
x1, y1, x2, y2 = box.xyxy[0] # координаты
confidence = box.conf[0] # уверенность
class_id = box.cls[0] # класс объекта
print(f"Object: class={class_id}, conf={confidence}")
print(f"BBox: ({x1}, {y1}) to ({x2}, {y2})")
# Без anchors, без NMS, просто и эффективно!
Современный тренд
Все новые методы (YOLO v8, RTMDet, YOLOv10, Faster R-CNN v3 с anchor-free веткой) движутся в сторону anchor-free подходов, потому что они:
- Дают лучшую точность
- Требуют меньше настроек
- Работают быстрее
- Проще в разработке
Заключение
Да, детекция без anchor-box не только возможна, но и становится стандартом в индустрии. Современные модели вроде YOLOv8, FCOS и CenterNet демонстрируют, что anchor-free подходы превосходят старые anchor-based методы по всем ключевым метрикам.