Link to this sectionUltralytics YOLO26의 엔드투엔드 탐지 이해하기#
Link to this section소개#
If you're upgrading to YOLO26 from an earlier model like YOLOv8 or YOLO11, one of the biggest changes you'll notice is the removal of Non-Maximum Suppression (NMS). Traditional YOLO models produce thousands of overlapping predictions that need a separate NMS post-processing step to filter down to final detections. This adds latency, complicates export graphs, and can behave inconsistently across different hardware platforms.
YOLO26은 다른 접근 방식을 취합니다. 외부 필터링 없이 모델에서 직접 최종 탐지 결과를 출력합니다. 이를 **엔드투엔드 object detection**이라고 하며, 모든 YOLO26 모델에서 기본적으로 활성화되어 있습니다. 그 결과 배포 파이프라인이 단순화되고, 지연 시간이 단축되며, CPU 추론 속도가 최대 43% 향상됩니다.
본 가이드에서는 변경 사항, 코드 업데이트 필요 여부, 엔드투엔드 추론을 지원하는 내보내기 형식, 그리고 이전 YOLO 모델에서 원활하게 마이그레이션하는 방법을 안내합니다.
이러한 아키텍처 전환의 동기에 대한 자세한 내용은 Ultralytics 블로그의 YOLO26에서 NMS를 제거한 이유와 배포에 미치는 영향 게시물을 확인하십시오.
- Ultralytics API 또는 CLI를 사용 중이신가요? 변경할 필요가 없습니다. 모델 이름을
yolo26n.pt로 교체하기만 하면 됩니다. - Using custom inference code (ONNX Runtime, TensorRT, etc.)? Update your post-processing — detection output is now
(N, 300, 6)inxyxyformat, no NMS required. Other tasks append extra data (mask coefficients, keypoints, or angle). - 내보내기 중이신가요? 대부분의 형식은 엔드투엔드 출력을 기본적으로 지원합니다. 하지만 일부 형식(NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX, Edge TPU, QNN)은 지원되지 않는 연산자 제약(예:
torch.topk)으로 인해 자동으로 기존 출력 방식으로 돌아갑니다. Hailo HEF 워크플로우는 ONNX에서 Hailo 전용 스크립트로 컴파일되므로, 모델의 탐지 헤드와 NMS 구성을 확인하십시오.
Link to this section엔드투엔드 탐지의 작동 원리#
YOLO26은 학습 중 듀얼 헤드 아키텍처를 사용합니다. 두 헤드는 동일한 백본과 넥을 공유하지만, 서로 다른 방식으로 출력을 생성합니다.
| 헤드 | 목적 | 탐지 출력 | 후처리 |
|---|---|---|---|
| One-to-One (기본값) | 엔드투엔드 추론 | (N, 300, 6) | 신뢰도 임계값만 사용 |
| One-to-Many | 기존 YOLO 출력 | (N, nc + 4, 8400) | NMS 필요 |
위의 형태는 탐지를 위한 것입니다. 다른 작업들은 탐지당 추가 데이터를 원투원 출력에 포함합니다.
| 작업 | 엔드투엔드 출력 | 추가 데이터 |
|---|---|---|
| 탐지 | (N, 300, 6) | — |
| 인스턴스 세그멘테이션 | (N, 300, 6 + nm) + proto (N, nm, H, W) | nm 마스크 계수(기본값 32) |
| 포즈 | (N, 300, 57) | 17 키포인트 × 3 (x, y, 가시성) |
| OBB | (N, 300, 7) | 회전 각도 |
학습 중에는 두 헤드가 동시에 실행됩니다. one-to-many 헤드는 더 풍부한 학습 신호를 제공하고, one-to-one 헤드는 중첩되지 않는 깔끔한 예측 결과를 생성하도록 학습합니다. 추론 및 내보내기 중에는 one-to-one 헤드가 기본적으로 활성화되어 이미지당 최대 300개의 탐지 결과를 [x1, y1, x2, y2, confidence, class_id] 형식으로 생성합니다.
model.fuse()를 호출하면 추론 속도 향상을 위해 Conv + BatchNorm 레이어를 결합하며, 엔드투엔드 모델의 경우 one-to-many 헤드를 제거하여 모델 크기와 FLOPs를 줄입니다. 듀얼 헤드 아키텍처에 대한 자세한 내용은 YOLO26 모델 페이지를 참조하십시오.
Link to this section코드를 변경해야 합니까?#
Link to this sectionUltralytics Python API 또는 CLI 사용#
변경할 필요가 없습니다. 표준 Ultralytics Python API 또는 CLI를 사용하는 경우, 모든 기능이 자동으로 작동합니다. 예측, 검증, 내보내기 모두 엔드투엔드 모델을 즉시 처리합니다.
from ultralytics import YOLO
# Load a YOLO26 model
model = YOLO("yolo26n.pt")
# Predict — no NMS step, no code changes
results = model.predict("image.jpg")Link to this section사용자 지정 추론 코드 사용#
예, 출력 형식이 다릅니다. YOLOv8 또는 YOLO11에 대한 사용자 지정 후처리 로직을 작성한 경우(예: ONNX Runtime 또는 TensorRT로 추론을 실행할 때), 새로운 출력 형태를 처리하도록 업데이트해야 합니다:
| YOLOv8 / YOLO11 | YOLO26 (엔드투엔드) | |
|---|---|---|
| 탐지 출력 | (N, nc + 4, 8400) | (N, 300, 6) |
| 박스 형식 | xywh (중심 x, 중심 y, 너비, 높이) | xyxy (좌상단 x, 좌상단 y, 우하단 x, 우하단 y) |
| 레이아웃 | 앵커당 박스 좌표 + 클래스 점수 | [x1, y1, x2, y2, conf, class_id] |
| NMS 필요 | 예 | 아니오 |
| 후처리 | NMS + 신뢰도 필터 | 신뢰도 필터만 사용 |
세그멘테이션, 포즈, OBB 작업의 경우, YOLO26은 각 탐지에 작업별 데이터를 덧붙입니다. 위의 출력 형태 표를 참조하십시오.
여기서 N은 배치 크기이고 nc는 클래스 수(예: COCO의 경우 80)입니다.
엔드투엔드 모델을 사용하면 후처리가 훨씬 간편해집니다. 예를 들어 ONNX Runtime을 사용할 경우:
import onnxruntime as ort
# Load and run the exported end-to-end model
session = ort.InferenceSession("yolo26n.onnx")
output = session.run(None, {session.get_inputs()[0].name: input_tensor})
# End-to-end output: (batch, 300, 6) → [x1, y1, x2, y2, confidence, class_id]
detections = output[0][0] # first image in batch
detections = detections[detections[:, 4] > conf_threshold] # confidence filter — that's it!Link to this sectionOne-to-Many 헤드로 전환하기#
기존의 YOLO 출력 형식이 필요한 경우(예: 기존 NMS 기반 후처리 코드를 재사용하려는 경우), end2end=False로 설정하여 언제든지 one-to-many 헤드로 전환할 수 있습니다.
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
# Prediction with NMS (traditional behavior)
results = model.predict("image.jpg", end2end=False)
# Validation with NMS
metrics = model.val(data="coco.yaml", end2end=False)
# Export without end-to-end
model.export(format="onnx", end2end=False)Link to this section내보내기 형식 호환성#
대부분의 내보내기 형식은 ONNX, TensorRT, CoreML, OpenVINO, TFLite, TF.js, MNN을 포함하여 엔드투엔드 추론을 즉시 지원합니다.
다음 형식은 엔드투엔드를 지원하지 않으며 자동으로 one-to-many 헤드로 돌아갑니다: NCNN, RKNN, PaddlePaddle, ExecuTorch, IMX, Edge TPU, Qualcomm QNN.
Hailo HEF의 경우, 컴파일 단계는 ONNX 내보내기 이후 model.export(format=...) 외부에서 수행됩니다. 정확한 탐지 모델과 일치하는 Hailo DFC 로그, .alls 모델 스크립트, NMS JSON을 사용하십시오. 만약 Hailo 툴체인에서 엔드투엔드 YOLO26 그래프가 지원되지 않으면, end2end=False로 ONNX 모델을 내보낸 후 기존 탐지 헤드를 컴파일하십시오.
TensorRT는 엔드투엔드를 지원하지만, TensorRT 10.3.0 이하 버전에서 int8=True로 내보낼 때는 자동으로 비활성화됩니다.
Link to this section정확도와 속도의 트레이드오프#
엔드투엔드 탐지는 정확도에 최소한의 영향만 미치면서 배포 측면에서 상당한 이점을 제공합니다:
| 지표 | 엔드투엔드 (기본값) | One-to-Many + NMS (end2end=False) |
|---|---|---|
| CPU 추론 속도 | 최대 43% 향상 | 기준치 |
| mAP 영향 | 약 0.5 mAP 감소 | YOLO11과 동일하거나 상회 |
| 후처리 | 신뢰도 필터만 사용 | 전체 NMS 파이프라인 |
| 배포 복잡성 | 최소화됨 | NMS 구현 필요 |
대부분의 실사용 환경에서 약 0.5 mAP 차이는 무시할 만한 수준이며, 특히 속도와 단순성 측면에서의 이득을 고려하면 더욱 그렇습니다. 최대 정확도가 최우선순위라면, 언제든 end2end=False를 사용하여 one-to-many 헤드로 돌아갈 수 있습니다.
모든 모델 크기(n, s, m, l, x)에 대한 자세한 벤치마크는 YOLO26 성능 지표를 참조하십시오.
Link to this sectionYOLOv8 또는 YOLO11에서 마이그레이션하기#
기존 프로젝트를 YOLO26으로 업그레이드하는 경우, 원활한 전환을 위해 다음 체크리스트를 확인하십시오:
- Ultralytics API / CLI 사용자: 변경 불필요. 모델 이름을
yolo26n.pt(또는yolo26n-seg.pt,yolo26n-pose.pt,yolo26n-obb.pt)로 업데이트하기만 하면 됩니다. - 사용자 지정 후처리 코드: 탐지 시
(N, 300, 6)및 세그멘테이션, 포즈, OBB에 대한 작업별 데이터를 처리하도록 업데이트하십시오. 또한 박스 형식이xywh에서xyxy로 변경되었음을 유의하십시오. - 내보내기 파이프라인: 대상 형식에 대해서는 위의 형식 호환성 섹션을 확인하십시오.
- TensorRT + INT8: 종단간(End-to-End) 지원을 위해 TensorRT 버전이 10.3.0 이상인지 확인하십시오.
- FP16 내보내기: 모든 출력을 FP16으로 유지해야 하는 경우
end2end=False로 내보내십시오. output0이 FP32로 유지되는 이유를 참조하십시오. - iOS / CoreML: End-to-end is fully supported. If you need Xcode Preview support, use
end2end=Falsewithnms=True - 엣지 기기 (NCNN, RKNN): 이러한 형식은 자동으로 일대다(one-to-many) 방식으로 폴백되므로, 온디바이스 파이프라인에 NMS를 포함해야 합니다.
Link to this sectionFAQ#
Link to this sectionend2end=True와 nms=True를 함께 사용할 수 있습니까?#
No. These options are mutually exclusive. If you set nms=True on an end-to-end model during export, it will be automatically forced to nms=False with a warning. The end-to-end head already handles duplicate filtering internally, so external NMS is unnecessary.
단, end2end=False와 nms=True를 조합하는 것은 유효한 구성입니다. 이 경우 기존의 NMS가 내보내기 그래프에 포함됩니다. 이는 CoreML 내보내기 시 Xcode의 Preview 기능을 감지 모델과 직접 사용할 수 있게 해주므로 유용합니다.
Link to this section종단간 모델에서 max_det 매개변수는 무엇을 제어합니까?#
max_det 매개변수(기본값: 300)는 일대일(one-to-one) 헤드가 이미지당 출력할 수 있는 최대 탐지 수를 설정합니다. 추론 또는 내보내기 시점에 이를 조정할 수 있습니다:
model.predict("image.jpg", max_det=100) # fewer detections, slightly faster
model.export(format="onnx", max_det=500) # more detections for dense scenes기본 YOLO26 체크포인트는 max_det=300으로 훈련되었습니다. 이 값을 늘릴 수는 있지만, 일대일 헤드는 훈련 과정에서 최대 300개의 깔끔한 탐지 결과를 생성하도록 최적화되었으므로 그 범위를 넘어서는 탐지 결과는 품질이 저하될 수 있습니다. 이미지당 300개 이상의 탐지가 필요한 경우 더 높은 max_det 값으로 재훈련하는 것을 고려하십시오.
Link to this section내보낸 ONNX 모델 출력이 (1, 300, 6)인데, 이게 맞습니까?#
네, 그것이 탐지를 위한 예상되는 종단간 출력 형식입니다. 배치 크기 1에 대해 최대 300개의 탐지 결과가 나오며, 각 결과는 [x1, y1, x2, y2, confidence, class_id]의 6개 값으로 구성됩니다. 단순히 신뢰도 임계값으로 필터링만 하면 완료되며, NMS는 필요하지 않습니다.
다른 작업의 경우 출력 형태가 다릅니다:
| 작업 | 출력 형태 | 설명 |
|---|---|---|
| 탐지(Detection) | (1, 300, 6) | [x1, y1, x2, y2, conf, class_id] |
| 세그멘테이션(Segmentation) | (1, 300, 38) + (1, 32, 160, 160) | 6개의 박스 값 + 32개의 마스크 계수, 그리고 프로토타입 마스크 텐서 |
| 포즈(Pose) | (1, 300, 57) | 6개의 박스 값 + 17개의 키포인트 × 3 (x, y, 가시성) |
| OBB | (1, 300, 7) | 6개의 박스 값 + 1개의 회전 각도 |
Link to this section내보낸 모델이 종단간 방식인지 어떻게 확인합니까?#
Ultralytics Python API를 사용하거나 내보낸 ONNX 모델 메타데이터를 직접 검사하여 확인할 수 있습니다:
from ultralytics import YOLO
model = YOLO("yolo26n.onnx")
model.predict(verbose=False) # run predict to setup predictor first
print(model.predictor.model.end2end) # True if end-to-end is enabled또는 출력 형태를 확인하십시오. 종단간 탐지 모델은 (1, 300, 6)을 출력하는 반면, 기존 모델은 (1, nc + 4, 8400)을 출력합니다. 다른 작업의 형태는 출력 형태 FAQ를 참조하십시오.
Link to this section인스턴스 세그멘테이션, 포즈 및 OBB 작업에서도 종단간 방식이 지원됩니까?#
네. YOLO26 탐지 스타일 작업 변형인 탐지(Detection), 인스턴스 세그멘테이션(Instance Segmentation), 포즈 추정(Pose Estimation), 및 회전 객체 탐지(OBB)는 기본적으로 종단간 추론을 지원합니다. end2end=False 폴백 옵션 역시 이러한 작업들에서 사용할 수 있습니다.
각 작업은 기본 탐지 출력에 작업별 데이터를 추가합니다:
| 작업 | 모델 | 엔드투엔드 출력 |
|---|---|---|
| 탐지(Detection) | yolo26n.pt | (N, 300, 6) |
| 인스턴스 세그멘테이션 | yolo26n-seg.pt | (N, 300, 38) + proto (N, 32, 160, 160) |
| 포즈(Pose) | yolo26n-pose.pt | (N, 300, 57) |
| OBB | yolo26n-obb.pt | (N, 300, 7) |