Понимание сквозного обнаружения объектов в Ultralytics YOLO26#
YOLO26 обучает как голову «многие к одному», так и голову «один к одному». Предсказание и валидация по умолчанию используют голову «многие к одному» с подавлением ненужных максимумов (NMS). Это повышает точность при использовании тех же обученных весов. Задай nms=False, чтобы вместо этого использовать более быструю голову «один к одному» без NMS.
Один аргумент управляет выбором в предсказании, валидации, трекинге, экспорте и бенчмаркинге:
nms | Предсказание и валидация | Экспорт |
|---|---|---|
None (по умолчанию) | Голова «многие к одному»; Ultralytics запускает NMS | Необработанные выходы «многие к одному»; потребитель запускает NMS |
True | То же, что None | Голова «многие к одному» со встроенным NMS, где это поддерживается |
False | Голова «один к одному» без подавления IoU | Выходы «один к одному» без NMS, где это поддерживается |
None означает, что в модель не встроена дополнительная постобработка. Это не отменяет нормальную обработку, которая преобразует выходы модели в результаты предсказания или метрики валидации. Классификация, семантическая сегментация, глубина и модели без выбираемых голов детекции сохраняют стандартное поведение своей задачи.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.predict("image.jpg") # one-to-many + NMS
metrics = model.val(data="coco.yaml") # one-to-many + NMS
results = model.predict("image.jpg", nms=False) # opt into NMS-free inference
results = model.predict("image.jpg", nms=None) # switch back to one-to-many + NMS
model.export(format="onnx") # raw one-to-many outputs
model.export(format="onnx", nms=True) # embed NMS
model.export(format="onnx", nms=False) # NMS-free one-to-one outputsКак работает сквозное обнаружение#
Обе головы используют общий бэкбон и шейп-нек и оптимизируются во время обучения. Голова «многие к одному» предоставляет несколько кандидатов предсказаний для каждого объекта; NMS удаляет пересекающиеся обнаружения. Голова «один к одному» учится выдавать одно предсказание на объект. Выбор пути инференса не отключает надзор с двумя головами. Валидация во время обучения использует выбранную голову инференса, поэтому выбор чекпоинта и ранней остановки следуют тем же предсказаниям, что и развертывание.
| Голова | Выход детекции до внешней обработки | Обработка |
|---|---|---|
| Многие к одному (по умолчанию) | (N, nc + 4, 8400) | Фильтрация по уверенности и NMS |
| Один к одному | (N, 300, 6) | Фильтрация по уверенности; без подавления IoU |
Здесь N — размер батча, nc — количество классов, а 8400 — количество кандидатов на imgsz=640. Строки детекции «один к одному» содержат [x1, y1, x2, y2, confidence, class_id]. Другие задачи детекции содержат дополнительные выходы:
| Задача | Сквозной выход | Дополнительные данные |
|---|---|---|
| Обнаружение | (N, 300, 6) | — |
| Сегментация экземпляров | (N, 300, 6 + nm) и (N, nm, H, W) | Коэффициенты масок и прототипы |
| Поза | (N, 300, 57) | 17 ключевых точек × 3 значения |
| OBB | (N, 300, 7) | Угол поворота |
Слияние удаляет неиспользуемые ветви инференса, а также сворачивает слои Conv и BatchNorm. Сохрани исходный чекпоинт обучения, если тебе нужно переключить головы: слияние не может восстановить уже удаленную ветвь. Модель, у которой осталась только голова «один к одному», сохраняет этот доступный путь.
Экспортированные выходы#
Модели детекции YOLOv8, YOLO11 и YOLO26 по умолчанию экспортируют необработанные предсказания «многие к одному». Экспортируй YOLO26 с nms=False для детекций без NMS.
nms=None | nms=False | |
|---|---|---|
| Выход детекции | (N, nc + 4, 8400) | (N, 300, 6) |
| Формат бокса | xywh | xyxy |
| Оценки | Одна оценка на класс для каждого кандидата | Уверенность и ID класса для каждого обнаружения |
| Внешняя обработка | Фильтрация по уверенности и NMS | Фильтрация по уверенности |
nms=True также создает обработанные обнаружения, но использует голову «многие к одному» и встраивает традиционный NMS. Это полезно, когда твоя среда выполнения должна получать обнаружения без самостоятельной реализации подавления.
Граф экспортированной модели определяет ее выходы. Передача nms при ее загрузке не перестраивает граф; экспортируй исходный чекпоинт с нужным значением nms, чтобы выбрать путь вывода. Ultralytics использует метаданные артефакта, чтобы избежать повторного применения NMS.
Совместимость форматов экспорта#
ONNX, TensorRT, CoreML, OpenVINO и несколько других форматов поддерживают экспорт без NMS. NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX, Edge TPU и Qualcomm QNN возвращаются к пути «многие к одному», когда их операторы не могут поддержать сквозной выход. Предупреждения форматов объясняют такой переход.
- Встроенный NMS:
nms=Trueподчиняется ограничениям формата на задачи, точность и динамические формы. Форматы без поддержки встроенного NMS экспортируют нативные выходы для внешней обработки. - CoreML: Встроенный NMS поддерживает детекцию, сегментацию и позы со статическими формами. Используй
nms=Trueдля моделей детекции, которым нужен пайплайн NMS в Xcode Preview. - MNN: Встроенный NMS поддерживает детекцию и позы с
dynamic=False. - IMX: Детекция, сегментация экземпляров и позы требуют встроенного NMS, выбираемого автоматически.
- Hailo: YOLO26 по умолчанию использует сырые тензоры с NMS на хосте;
nms=Falseвыбирает путь «один к одному». Детекция YOLOv8/YOLO11 использует HailoRT NMS. - Квантование: Версии TensorRT до 8.5.0, TensorRT 10.3.0 INT8 на JetPack 6, а также LiteRT INT8 или
w8a16возвращаются к выходам «многие к одному».
Смотри отдельные инструкции по интеграции для требований к оборудованию. Для получения полных выходных тензоров FP16 используй nms=None; сквозные индексы классов могут сохранять выходные тензоры в формате FP32 даже при квантовании модели.
Компромиссы между точностью и скоростью#
Опубликованные результаты COCO для YOLO26 показывают, что голова «многие к одному» улучшает mAP детекции на 0.6–0.8 пункта для пяти масштабов: например, 40.9 против 40.1 для YOLO26n и 57.5 против 56.9 для YOLO26x. Голова «один к одному» позволяет избежать прохода NMS и повышает скорость. Эти результаты оправдывают выбор по умолчанию, но не гарантируют прирост на каждом датасете.
Опубликованные измерения скорости без NMS используют nms=False. Сравнивай точность и задержку, используя одинаковый выбор головы, размер изображения, точность и оборудование.
Часто задаваемые вопросы#
Это ограничивает количество детектиций, возвращаемых при предсказании и валидации. Для экспортов end-to-end и с в ในстроенным NMS это ограничение является частью графа, поэтому для его изменения выполни экспорт заново; исключением является детектиция CoreML со встроенным NMS, у которой нет ограничения на количество детектиций. Выходные данные end-to-end могут содержать меньше кандидатов, если на изображении меньше
max_detякорей.Да, для
nms=Falseилиnms=Trueс лимитом детекции по умолчанию. Сама по себе форма не указывает, какая именно голова была экспортирована. Экспорт детекции COCO по умолчанию в сыром виде обычно имеет форму(1, 84, 8400)вimgsz=640.Да. Тот же аргумент
nmsвыбирает доступную голову детекции для задач детекции, сегментации экземпляров, поз и OBB. Он не заменяет реконструкцию масок, декодирование ключевых точек, обработку повернутых боксов, вероятности классификации, карты семантических классов или декодирование глубины.