Ultralytics YOLO27:
Get Started

YOLO 아키텍처 설명: YOLOv3부터 YOLO26까지#

모든 Ultralytics YOLO 모델은 세 단계로 구성됩니다. 특징을 추출하는 백본, 여러 스케일의 특징을 융합하는 넥, 바운딩 박스와 클래스를 예측하는 헤드입니다. 이 가이드에서는 각 단계를 구성하는 모듈과 YOLOv3부터 YOLO26까지 모듈이 어떻게 변경되었는지 설명하고, 각 구성 요소의 정의를 ultralytics/cfg/models/ 아래의 구성 파일 및 ultralytics/nn/modules/의 모듈 클래스에서 추적합니다.

각 모델은 YAML 파일에서 순서가 지정된 레이어 목록으로 선언되며, 모든 레이어는 [from, repeats, module, args] 형식을 따릅니다. 즉, 입력으로 사용하는 레이어, 모듈 반복 횟수, 레이어 클래스(Conv, C3k2, SPPF, Detect, …), 생성자 인수로 구성됩니다. 모델 YAML 구성 가이드에서는 변형의 깊이 및 너비 배수에 따라 repeats과 args의 크기를 조정하는 방법을 비롯해 이 형식과 모듈 확인 시스템을 자세히 설명합니다. 이 가이드에서는 모듈 자체와 버전별 변경 사항에 중점을 둡니다.

세 가지 단계#

모든 Ultralytics YOLO 모델은 이미지를 각각 고유한 역할을 하는 세 가지 순차적 단계를 거쳐 처리합니다.

단계역할출력
백본여러 해상도에서 입력 이미지의 특징 추출스트라이드 8, 16, 32의 특징 맵(P3, P4, P5)
넥작은 객체와 큰 객체 모두에 문맥 정보가 반영되도록 스케일 간 특징 융합다중 스케일 융합 특징 맵
헤드융합된 특징으로 바운딩 박스와 클래스 점수 예측앵커 포인트별 감지 결과

기본 단위는 Conv 블록(conv.py에 정의됨)입니다. 2D 컨볼루션, 배치 정규화, SiLU 활성화를 순서대로 적용합니다. 아래의 모든 상위 모듈은 Conv 블록을 조합해 구성됩니다.

아키텍처 다이어그램#

각 버전은 동일한 백본 → 넥 → 헤드 구조를 유지하면서 특정 단계를 변경합니다. 아래 탭에는 버전별 구조가 표시됩니다. 백본과 넥 단계는 ultralytics/cfg/models/의 설정을 따르지만, YOLOv3 및 YOLOv5 헤드는 패키지 설정에 실제로 포함된 앵커 프리 u 변형 헤드가 아니라 원래의 앵커 기반 형태로 표시됩니다. 탭을 살펴보면 각 세대에서 추가된 항목을 확인할 수 있습니다. 요약하면, 발전 과정은 다음과 같습니다. YOLOv3는 FPN만 사용하는 앵커 기반 검출기이고, YOLOv5는 하향식 PAN 경로와 SPPF를 추가하며, YOLOv8은 앵커 프리 DFL 헤드를 갖춘 C2f 블록으로 전환합니다. YOLO11은 C2PSA 어텐션과 C3k2 블록을 삽입하며, YOLO26은 SPPF 잔차 블록을 추가하고 DFL을 제거하며 선택적 NMS 프리 헤드를 추가합니다.

YOLOv3 및 YOLOv5 다이어그램은 원래의 앵커 기반 헤드를 보여 줍니다. ultralytics 패키지에는 앵커 프리 YOLOv3u 및 YOLOv5u 구성이 포함되어 있습니다. 이 구성은 Darknet-53 및 C3 백본은 그대로 사용하고 YOLOv8의 Detect 헤드를 사용하며, 검출 헤드에서 설명합니다.

백본 블록: Bottleneck → C3 → C2f → C3k2#

백본은 스트라이드 2의 Conv 다운샘플링 레이어 사이에 반복되는 CSP(교차 단계 부분) 블록을 쌓습니다. 버전별로 가장 많이 변경된 부분은 이 반복 블록입니다. 아래 블록은 모두 block.py에 있습니다. c1/c2는 입력/출력 채널이고 c = 0.5 * c2는 은닉 차원입니다.

Bottleneck (YOLOv3)#

기본 단위는 Bottleneck입니다. 기본 커널이 (3, 3)인 Conv 레이어 두 개로 구성되며, shortcut=True 및 c1 == c2일 때 선택적으로 잔차 덧셈을 적용합니다. YOLOv3의 Darknet-53 백본은 CSP 분할 없이 이러한 블록을 직접 쌓으며, 세 가지 스케일(스트라이드 8, 16, 32)에서 객체를 감지합니다.

C3 (YOLOv5)#

YOLOv5의 C3은 입력을 1x1 컨볼루션 두 개로 분할합니다. cv1은 n개의 Bottleneck 블록(커널은 (1, 1) 다음 (3, 3))에 입력을 전달하고, cv2은 이를 우회합니다. 두 경로를 연결한 다음 세 번째 1x1 Conv으로 융합합니다.

def forward(self, x):
    # C3: 병목 경로 m(cv1(x))를 우회 경로 cv2(x)와 연결한 다음 cv3으로 융합합니다.
    return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))

마지막 병목 출력만 융합 컨볼루션에 전달되므로 cv3은 특징 맵 2개를 입력으로 받습니다.

C2f (YOLOv8)#

YOLOv8의 C2f(“컨볼루션 2개를 사용하는 CSP Bottleneck, 고속”)은 융합 컨볼루션에 전달되는 특징을 변경합니다.

  1. cv1 = Conv(c1, 2 * c, 1) 다음에 chunk(2)이 출력을 c채널 텐서 2개로 분할합니다.
  2. n개의 Bottleneck(c, c) 블록(커널 (3, 3), (3, 3))이 순차적으로 실행되며, 각 블록은 이전 블록의 출력을 입력으로 받습니다.
  3. 모든 n + 2 중간 텐서를 연결한 다음 cv2 = Conv((2 + n) * c, c2, 1)로 융합합니다.

C3은 융합 컨볼루션에 특징 맵 2개를 전달하는 반면, C2f은 n + 2개를 전달하므로 모든 중간 병목 출력을 재사용합니다.

C3k2 (YOLO11 및 YOLO26)#

YOLO11 및 YOLO26은 C2f의 하위 클래스로, 반복 단위를 교체하는 C3k2를 사용합니다. 생성자 플래그에 따라 각 n 블록은 다음 중 하나가 됩니다.

  • 일반 Bottleneck(기본값, c3k=False),
  • C3k 블록(c3k=True) — 커널 크기를 설정할 수 있는 C3 변형 또는
  • Bottleneck + PSABlock 쌍(attn=True).

두 번째 YAML 인수는 스케일이 m, l 또는 x인 경우가 아니면 c3k을 설정합니다. 이 세 스케일은 True를 강제로 사용하므로 하나의 yolo11.yaml로 다섯 가지 변형을 모두 처리할 수 있습니다. 따라서 [-1, 2, C3k2, [512, False]]은 Bottleneck 내부 블록을 n 및 s에서 구성하지만, C3k 내부 블록은 m, l, x에서 구성합니다. 512는 스케일 조정 전 채널 수이며, 변형의 너비 배수를 적용하면 n에서 128, x에서 768이 됩니다. CSP 모듈의 경우 repeats 필드(여기서는 2)는 변형의 깊이 배수로 스케일을 조정하기 전 값이며, 별도의 모듈을 쌓는 대신 블록 내부의 반복 횟수가 됩니다.

공간 풀링: SPP → SPPF#

백본의 끝에서 공간 피라미드 풀링 블록이 수용 영역을 넓힙니다. YOLOv5는 기존의 다중 커널 SPP을 SPPF(공간 피라미드 풀링 - 고속)로 대체했습니다. 이 방식은 단일 MaxPool2d(kernel_size=5, stride=1, padding=2)를 n = 3회 연속 적용하며, 입력과 세 개의 풀링 출력을 연결하고 1x1 Conv로 융합합니다. 연결된 5x5 풀링의 수용 영역이 더 큰 커널의 수용 영역을 포괄하므로, SPP(k=(5, 9, 13))과 수학적으로 동일하면서 연산 비용은 더 낮습니다.

YOLO26은 바로가기 플래그(SPPF, [1024, 5, 3, True])를 전달합니다. 가장 깊은 레이어가 c1 == c2 == 1024이므로 SPPF은 잔차 연결(return y + x)을 추가합니다.

공간 어텐션: C2PSA (YOLO11 이상)#

YOLO11은 SPPF 다음에 C2PSA을 추가했습니다. 이는 활성 분기가 n개의 PSABlock(위치 민감 어텐션) 모듈을 쌓는 CSP 블록입니다. cv1 = Conv(c1, 2 * c, 1)가 특징을 분할하고, 절반은 PSABlock 스택을 통과한 다음 cv2 = Conv(2 * c, c1, 1)이 연결 결과를 융합합니다. 각 PSABlock은 다중 헤드 어텐션을 적용한 후 2계층 피드포워드 네트워크(Conv(c, 2 * c, 1) → Conv(2 * c, c, 1))를 적용하며, 각 단계에는 잔차 연결이 있습니다. YOLO26은 동일한 C3k2 + C2PSA 백본을 유지합니다.

넥: FPN + PAN#

넥은 하향식 특징 피라미드 네트워크(FPN)에 이어 상향식 경로 집계 네트워크(PAN)를 적용해 백본의 P3/P4/P5 특징 맵을 융합합니다. YAML 헤드 섹션에서 FPN은 nn.Upsample + Concat(의미 정보를 더 높은 해상도로 전달)이고, PAN은 스트라이드 2의 Conv + Concat(위치 정보를 다시 높은 단계로 전달)입니다.

# YOLO11 head (FPN top-down, then PAN bottom-up)
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 2, C3k2, [512, False]] # 13
# ... second upsample + concat to P3 ...
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 13], 1, Concat, [1]] # cat head P4 (PAN)
- [-1, 2, C3k2, [512, False]] # 19

넥은 해당 세대의 백본 블록을 재사용합니다. YOLOv5에서는 C3, YOLOv8에서는 C2f, YOLO11 및 YOLO26에서는 C3k2를 사용하므로 각 병합 지점에서 백본과 동일한 모듈을 실행합니다. 세 개의 융합된 출력이 헤드에 입력됩니다. 예외는 YOLOv3입니다. YOLOv3의 넥은 하향식 FPN만 사용하며(YAML 헤드에 스트라이드 2 다운샘플링이 없음), YOLOv5에서 도입한 상향식 PAN 경로는 없습니다.

검출 헤드: 앵커 기반 → 앵커 프리 → NMS 프리#

헤드는 세 개의 융합된 특징 맵을 검출 작업의 예측값으로 변환합니다. 버전이 바뀌면서 설계도 앵커 기반에서 앵커 프리, 그리고 NMS 프리로 변경되었습니다.

앵커 프리, 분리형 Detect#

YOLOv3 및 YOLOv5의 초기 버전은 앵커 기반 결합형 헤드를 사용했습니다. 이 헤드는 미리 정의된 앵커 박스와 박스 및 클래스 예측에 공통으로 사용하는 분기를 사용합니다. 독립 실행형 ultralytics/yolov3 및 ultralytics/yolov5 저장소는 이 앵커 기반 설계를 유지합니다. 반면 기본 ultralytics 패키지에는 앵커 프리 YOLOv3u 및 YOLOv5u 변형이 포함되어 있습니다. 이 변형은 Darknet-53 및 C3 백본은 그대로 사용하면서 YOLOv8의 앵커 프리 Detect 헤드를 사용합니다. 여기에서 설명하는 yolov3.yaml 및 yolov5.yaml 구성은 과거 설계가 아닌 이러한 u 변형에 해당합니다.

Detect 헤드(head.py)는 앵커 프리 분리형 헤드입니다. 피라미드 수준마다 두 개의 병렬 분기를 실행하며 앵커 박스가 아니라 그리드 포인트를 기준으로 직접 예측합니다.

  • 박스 분기(cv2): Conv(x, c2, 3) → Conv(c2, c2, 3) → Conv2d(c2, 4 * reg_max, 1).
  • 클래스 분기(cv3): YOLO11 및 YOLO26에서는 깊이별 분리 컨볼루션 블록 두 개(DWConv + 1x1 Conv) 다음에 Conv2d(c3, nc, 1)을 적용합니다. YOLOv8은 기존 변형을 사용하며, 3x3 Conv 레이어 두 개 다음에 Conv2d(c3, nc, 1)를 적용합니다.

따라서 각 앵커 포인트는 no = nc + 4 * reg_max개의 출력을 생성합니다. 미리 정의된 앵커를 제거하면 튜닝해야 하는 하이퍼파라미터에서 앵커 박스 크기와 종횡비가 제외됩니다.

분포 초점 손실 (DFL)#

YOLOv8 및 YOLO11은 4개의 박스 좌표를 각각 단일 스칼라가 아니라 reg_max = 16개 빈의 분포로 회귀합니다(일반화 초점 손실의 적분 형태). DFL 모듈은 4 * reg_max개의 박스 채널을 (4, reg_max)로 형태 변경하고, reg_max개 빈에 소프트맥스를 적용한 다음 기대 빈 인덱스를 계산합니다. 각 빈 인덱스에 해당 소프트맥스 확률을 가중해 합산한 값이 예측 좌표가 됩니다. 이는 가중치가 빈 인덱스 arange(reg_max)인 고정 1x1 컨볼루션으로 구현되므로, 가중합은 한 번의 내적으로 계산됩니다.

YOLO26: NMS 프리, DFL 프리#

YOLO26은 헤드가 직접 읽는 두 개의 YAML 매개변수를 설정합니다.

  • end2end: True — Detect은 분기를 원투원 헤드(one2one_cv2/one2one_cv3)로 복제해 객체당 하나의 예측값을 학습합니다. 이 YAML 설정은 두 가지 학습 헤드를 모두 생성하며, 런타임 nms=False는 원투원 헤드를 선택하고 비최대 억제(NMS) 후처리 단계를 제거합니다. 추론 및 내보내기 세부 정보는 엔드투엔드 검출 가이드를 참조하세요.
  • reg_max: 1 — 빈이 하나이면 self.dfl은 nn.Identity() 및 no = nc + 4이 됩니다. 헤드는 좌표를 직접 회귀하며 내보낸 ONNX 그래프에는 DFL 연산이 포함되지 않습니다.

YOLO26은 다섯 가지 모델 크기(n/s/m/l/x)에 걸쳐 YOLO26 논문에 보고된 바와 같이 COCO에서 40.9~57.5 mAP를 기록하며, T4 TensorRT 지연 시간은 1.7~11.8ms입니다.

버전별 요약#

버전백본 블록공간 풀링어텐션검출 헤드DFL
YOLOv3Darknet-53 (Bottleneck)기본 구성에는 없음없음초기 버전: 앵커 기반, u 변형: 앵커 프리아니요 / 예 (u)
YOLOv5C3 (CSP)SPPF없음초기 버전: 앵커 기반, u 변형: 앵커 프리아니요 / 예 (u)
YOLOv8C2fSPPF없음앵커 프리, 분리형예 (reg_max=16)
YOLO11C3k2SPPFC2PSA앵커 프리, 분리형예 (reg_max=16)
YOLO26C3k2SPPF + 바로가기 연결C2PSA앵커 프리, 듀얼 헤드, 선택적 NMS 프리제거됨 (reg_max=1)

모델별 세부 정보, 성능 표, 사용 예시는 YOLOv3, YOLOv5, YOLOv8, YOLO11, YOLO26 개별 페이지를 참조하세요.

직접 아키텍처 살펴보기#

model.info() 메서드는 레이어, 매개변수 및 FLOPs 요약을 출력하며, 파싱된 모듈 목록은 model.model.model에서 확인할 수 있습니다.

YOLO 모델 아키텍처 살펴보기
from ultralytics import YOLO

# 사전 학습된 모델 불러오기
model = YOLO("yolo11n.pt")

# 게시된 사양과 개수가 일치하도록 Conv + BatchNorm 레이어를 융합합니다.
model.fuse()

# 요약 출력: 레이어, 매개변수, 그래디언트, GFLOPs
model.info()

# 검출 헤드(네트워크의 마지막 모듈) 살펴보기
head = model.model.model[-1]
print(type(head).__name__, "| reg_max:", head.reg_max, "| DFL layer:", type(head.dfl).__name__)

세 세대에 걸쳐 이 스니펫을 실행하면 변경 사항을 수치로 확인할 수 있습니다. 다음은 ultralytics 패키지의 실제 융합 모델 출력으로, 각 모델 페이지에 게시된 매개변수 및 FLOPs 개수와 일치합니다.

모델레이어파라미터GFLOPsreg_maxDFL 레이어
YOLOv8n723,151,9048.716DFL
YOLO11n1002,616,2486.516DFL
YOLO26n1202,408,9325.51Identity

YOLO26n은 reg_max=1 및 Identity DFL 레이어를 보고합니다. 기본적으로 예측 및 검증에서는 NMS를 사용하는 일대다 방식을 사용합니다. NMS 프리 추론을 사용하려면 nms=False를 설정하세요. 두 헤드 모두 학습됩니다.

Fused 모델과 unfused 모델의 개수

매개변수와 FLOPs 값은 각 Conv과 해당 배치 정규화 레이어를 병합한 fused 모델(model.fuse())을 기준으로 보고합니다. 이는 공개된 사양과 일치하며, 새로 불러온 체크포인트는 fusion 전 약간 더 높은 개수를 보고합니다.

결론#

버전이 바뀌면서 YOLO 아키텍처는 한 번에 한 단계씩 변경되었습니다. 백본은 Darknet-53에서 C3, C2f, C3k2와 C2PSA 어텐션을 사용하는 CSP 기반 블록으로 바뀌었고, 넥은 FPN + PAN 구조를 유지하면서 SPP가 SPPF로 바뀌었으며, 헤드는 앵커 기반에서 앵커 프리로 전환된 다음 선택적 NMS 프리 엔드투엔드 헤드를 갖춘 YOLO26의 DFL 프리 설계로 발전했습니다.

사용자 지정 아키텍처를 정의하려면 모델 YAML 구성 가이드를 참조하거나 모델 페이지에서 모델을 비교하세요. 궁금한 점은 GitHub 또는 Discord로 문의해 주세요.

자주 묻는 질문#

  • YOLO 모델에는 이미지에서 스트라이드 8, 16, 32의 특징을 추출하는 백본, FPN과 PAN을 사용해 여러 스케일의 특징을 융합하는 넥, 그리고 바운딩 박스와 클래스 점수를 예측하는 헤드가 있습니다. YOLOv3부터 YOLO26까지 모든 Ultralytics YOLO 모델은 이 3단계 설계를 따릅니다.

  • C2f(YOLOv8)은 fusion 컨볼루션 전에 모든 내부 Bottleneck(즉, n + 2 특징 맵)의 출력을 연결하는 CSP 블록입니다. 이전 C3은 두 개만 전달합니다. C3k2(YOLO11 및 YOLO26)는 C2f의 하위 클래스이며, c3k 플래그가 설정되면 각 Bottleneck을 C3k 블록(커널 크기를 설정할 수 있는 C3 변형)으로 대체할 수 있습니다. 두 블록 모두 block.py에 정의되어 있습니다.

  • YOLO11은 YOLOv8의 구조를 세 가지 방식으로 변경했습니다. 백본과 넥의 C2f 블록을 C3k2로 교체하고, SPPF 뒤에 C2PSA 셀프 어텐션 블록을 삽입했으며, 헤드의 분류 브랜치를 더 가벼운 depthwise-separable 컨볼루션으로 전환했습니다. 두 모델은 reg_max=16 DFL 회귀를 사용하는 동일한 앵커 프리 분리형 Detect 헤드를 유지하므로, 탐지 인터페이스를 재설계하는 대신 매개변수와 FLOPs를 줄이면서 정확도를 높입니다.

  • 최신 Ultralytics YOLO 모델은 앵커 프리 방식입니다. YOLOv8, YOLO11, YOLO26은 박스 회귀와 분류를 위한 별도의 브랜치를 갖춘 앵커 프리 분리형 Detect 헤드를 사용합니다. 기존 YOLOv3과 YOLOv5는 앵커 기반이었지만, Ultralytics는 YOLOv8과 동일한 앵커 프리 헤드 설정을 사용하는 YOLOv3u 및 YOLOv5u 변형으로 제공합니다.

  • 예. YOLO26에는 nms=False을 사용하는 NMS 프리 추론을 지원하는 일대일 헤드가 포함되어 있습니다. 기본 일대다 추론 경로에서는 NMS를 사용하며, 학습 중에는 두 헤드 모두 supervision을 받습니다. 자세한 내용은 엔드투엔드 탐지 가이드를 참조하세요.

  • DFL은 각 박스 좌표를 reg_max개 bin에 대한 softmax 분포로 회귀한 다음(기본값은 YOLOv8 및 YOLO11에서 16), 단일 스칼라를 예측하는 대신 기댓값을 좌표로 사용합니다. YOLO26은 reg_max=1을 설정하므로 DFL 레이어가 항등 연산이 되고, 헤드가 좌표를 직접 회귀하며, 내보낸 ONNX 또는 TensorRT 그래프에 DFL 연산이 포함되지 않습니다.

  • Python에서 모델을 불러온 다음 model.info()을 호출하면 레이어, 매개변수, GFLOPs 요약을 확인할 수 있습니다. 파싱된 레이어는 model.model.model에 있으며, 예를 들어 model.model.model[-1]는 Detect 헤드로, reg_max 및 dfl와 같은 속성을 노출합니다. 전체 아키텍처는 모델의 YAML 구성 파일에 정의되어 있습니다.

댓글