Meet YOLO26: next-gen vision AI.

Link to this sectionGiải thích Kiến trúc YOLO: Từ YOLOv3 đến YOLO26#

Mỗi mô hình Ultralytics YOLO được xây dựng từ ba giai đoạn: một backbone dùng để trích xuất đặc trưng, một neck để kết hợp các đặc trưng qua các quy mô (scale) khác nhau, và một head để dự đoán khung hình (box) và lớp (class). Hướng dẫn này ghi lại các mô-đun tạo nên từng giai đoạn và cách chúng thay đổi từ YOLOv3 sang YOLO26, theo dõi từng thành phần đến định nghĩa của chúng trong các tệp cấu hình tại ultralytics/cfg/models/ và các lớp mô-đun trong ultralytics/nn/modules/.

Mỗi mô hình được định nghĩa khai báo trong một tệp YAML dưới dạng một danh sách các lớp theo thứ tự, nơi mỗi lớp tuân theo định dạng [from, repeats, module, args]: lớp nào truyền dữ liệu vào nó, số lần mô-đun lặp lại, lớp của mô-đun (Conv, C3k2, SPPF, Detect, …), và các đối số constructor của nó. Hướng dẫn Cấu hình YAML cho Mô hình ghi lại định dạng này — bao gồm cách repeatsargs thay đổi theo bội số độ sâu và chiều rộng của biến thể — cùng với hệ thống phân giải mô-đun đầy đủ. Hướng dẫn này tập trung vào chính các mô-đun và cách chúng thay đổi qua từng phiên bản.

Link to this sectionBa Giai đoạn#

Mỗi mô hình Ultralytics YOLO định tuyến hình ảnh qua ba giai đoạn tuần tự, mỗi giai đoạn có một nhiệm vụ riêng biệt:

Giai đoạnCông việcĐầu ra
BackboneTrích xuất đặc trưng từ hình ảnh đầu vào ở nhiều độ phân giảiBản đồ đặc trưng (feature map) ở các stride 8, 16, và 32 (P3, P4, P5)
NeckKết hợp các đặc trưng qua các quy mô để cả đối tượng nhỏ và lớn đều có ngữ cảnhBản đồ đặc trưng đã được kết hợp đa quy mô
HeadDự đoán các bounding box và điểm số lớp từ các đặc trưng đã kết hợpSố lần phát hiện trên mỗi điểm neo (anchor point)

Đơn vị cơ bản là khối Conv (được định nghĩa trong conv.py): một tích chập 2D, batch normalization, và một hàm kích hoạt SiLU, được áp dụng theo trình tự. Mọi mô-đun lớn hơn bên dưới đều được xây dựng bằng cách kết hợp các khối Conv.

Link to this sectionSơ đồ Kiến trúc#

Mỗi phiên bản giữ nguyên khung xương backbone → neck → head và thay đổi các giai đoạn cụ thể. Các tab bên dưới hiển thị cấu trúc theo từng phiên bản: các giai đoạn backbone và neck tuân theo cấu hình trong ultralytics/cfg/models/, trong khi head của YOLOv3 và YOLOv5 được vẽ theo dạng dựa trên anchor ban đầu thay vì head u-variant không sử dụng anchor mà các cấu hình package của chúng thực tế cung cấp. Việc duyệt qua các tab cho thấy những gì mỗi thế hệ đã thêm vào. Tóm lại, quá trình tiến hóa là: YOLOv3 là detector chỉ có FPN, dựa trên anchor; YOLOv5 thêm đường dẫn PAN từ dưới lên và SPPF; YOLOv8 chuyển sang khối C2f với head DFL không sử dụng anchor; YOLO11 chèn cơ chế chú ý C2PSA và khối C3k2; và YOLO26 thêm residual SPPF đồng thời làm cho head không cần NMS và không cần DFL. Màu sắc của các node tuân theo quy ước sơ đồ tài liệu: màu xanh lá cây cho đầu vào, màu xanh dương cho backbone, màu xanh đá cho pooling không gian và cơ chế chú ý, màu cam cho neck, màu tím cho head và đầu ra.

flowchart TD
    IN[Input 640x640]:::start --> ST[Conv stem<br/>5x stride-2 down to P1-P5]:::proc
    ST --> BB[Darknet-53 backbone<br/>stacked Bottleneck]:::proc
    BB --> FPN[Neck FPN only<br/>top-down Upsample + Concat]:::decide
    FPN --> HD[Detect head<br/>3 scales, anchor-based]:::out
    HD --> O[Predictions + NMS]:::out
    classDef start fill:#4CAF50,color:#fff
    classDef proc fill:#2196F3,color:#fff
    classDef decide fill:#FF9800,color:#fff
    classDef out fill:#9C27B0,color:#fff

Các sơ đồ YOLOv3 và YOLOv5 hiển thị head dựa trên anchor ban đầu. Gói ultralytics cung cấp các cấu hình YOLOv3uYOLOv5u không dùng anchor — cùng các backbone Darknet-53 và C3 với head Detect của YOLOv8 — được mô tả trong Detection Head.

Link to this sectionKhối Backbone: Bottleneck → C3 → C2f → C3k2#

Backbone xếp chồng một khối CSP (Cross-Stage Partial) lặp lại giữa các lớp downsampling Conv với stride-2. Khối lặp lại đó là phần thay đổi nhiều nhất qua các phiên bản. Tất cả các khối dưới đây nằm trong block.py; c1/c2 là số kênh đầu vào/đầu ra và c = 0.5 * c2 là chiều rộng ẩn.

Link to this sectionBottleneck (YOLOv3)#

Đơn vị cơ bản là Bottleneck: hai lớp Conv (kernel mặc định (3, 3)) với phép cộng residual tùy chọn khi shortcut=Truec1 == c2. Backbone Darknet-53 của YOLOv3 xếp chồng trực tiếp các khối này, không có phân tách CSP, và phát hiện ở ba quy mô (stride 8, 16, 32).

Link to this sectionC3 (YOLOv5)#

YOLOv5's C3 splits the input across two 1x1 convolutions: cv1 feeds n sequential Bottleneck blocks (kernels (1, 1) then (3, 3)), cv2 bypasses them. The two paths are concatenated and fused by a third 1x1 Conv:

def forward(self, x):
    # C3: bottleneck path m(cv1(x)) concatenated with bypass cv2(x), then fused by cv3
    return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))

Chỉ đầu ra bottleneck cuối cùng mới tới tích chập kết hợp, vì vậy cv3 nhìn thấy 2 bản đồ đặc trưng.

Link to this sectionC2f (YOLOv8)#

YOLOv8's C2f ("CSP Bottleneck with 2 convolutions, faster") changes which features reach the fusion conv:

  1. cv1 = Conv(c1, 2 * c, 1), sau đó chunk(2) chia đầu ra thành hai tensor có c kênh.
  2. n khối Bottleneck(c, c) (kernel (3, 3), (3, 3)) chạy tuần tự, mỗi khối được cấp đầu ra của khối trước đó.
  3. Tất cả n + 2 tensor trung gian được ghép nối và kết hợp bởi cv2 = Conv((2 + n) * c, c2, 1).

Trong khi C3 truyền 2 bản đồ đặc trưng vào tích chập kết hợp của nó, C2f truyền n + 2 — mọi đầu ra bottleneck trung gian đều được tái sử dụng.

Link to this sectionC3k2 (YOLO11 và YOLO26)#

YOLO11YOLO26 sử dụng C3k2, một lớp con của C2f thay đổi đơn vị lặp lại. Mỗi khối trong số n khối trở thành, tùy thuộc vào cờ constructor:

  • một Bottleneck thông thường (mặc định, c3k=False),
  • một khối C3k (c3k=True) — một biến thể C3 với kích thước kernel có thể cấu hình, hoặc
  • một cặp Bottleneck + PSABlock (attn=True).

Đối số YAML thứ hai thiết lập c3k; ví dụ [-1, 2, C3k2, [512, True]] xây dựng một mô-đun C3k2 tại 512 kênh đầu ra mà các khối bên trong là C3k (vì c3k=True). Đối với các mô-đun CSP, trường repeats — ở đây là 2, trước khi nó được mở rộng bởi bội số độ sâu của biến thể — trở thành số lần lặp lại nội bộ của khối thay vì xếp chồng các mô-đun riêng biệt.

Link to this sectionSpatial Pooling: SPP → SPPF#

At the end of the backbone, a spatial-pyramid-pooling block widens the receptive field. YOLOv5 replaced the original multi-kernel SPP with SPPF (Spatial Pyramid Pooling - Fast): a single MaxPool2d(kernel_size=5, stride=1, padding=2) applied n = 3 times in sequence, with the input and all three pooled outputs concatenated and fused by a 1x1 Conv. This is mathematically equivalent to SPP(k=(5, 9, 13)) but cheaper, because the chained 5x5 pools cover the larger kernels' receptive fields.

YOLO26 truyền một cờ shortcut (SPPF, [1024, 5, 3, True]); vì c1 == c2 == 1024 ở lớp sâu nhất, SPPF thêm một kết nối residual (return y + x).

Link to this sectionSpatial Attention: C2PSA (YOLO11+)#

YOLO11 đã thêm C2PSA sau SPPF. Đây là một khối CSP có nhánh hoạt động là một chồng các mô-đun n PSABlock (Position-Sensitive Attention): cv1 = Conv(c1, 2 * c, 1) phân tách các đặc trưng, một nửa đi qua chồng PSABlock, và cv2 = Conv(2 * c, c1, 1) kết hợp việc ghép nối. Mỗi PSABlock áp dụng cơ chế chú ý đa đầu theo sau bởi một mạng feed-forward hai lớp (Conv(c, 2 * c, 1)Conv(2 * c, c, 1)), mỗi lớp có một kết nối residual. YOLO26 giữ nguyên backbone C3k2 + C2PSA.

Link to this sectionNeck: FPN + PAN#

Neck kết hợp các bản đồ đặc trưng P3/P4/P5 của backbone với Feature Pyramid Network (FPN) từ trên xuống, theo sau là Path Aggregation Network (PAN) từ dưới lên. Trong phần head của YAML, FPN là nn.Upsample + Concat (truyền thông tin ngữ nghĩa xuống các độ phân giải cao hơn) và PAN là Conv stride-2 + Concat (truyền thông tin định vị ngược lên):

# 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

Neck tái sử dụng khối backbone của thế hệ đó — C3 trong YOLOv5, C2f trong YOLOv8, C3k2 trong YOLO11 và YOLO26 — vì vậy mỗi điểm hợp nhất chạy cùng một mô-đun mà backbone sử dụng. Ba đầu ra được kết hợp truyền dữ liệu vào head. YOLOv3 là ngoại lệ: neck của nó chỉ là FPN từ trên xuống (YAML head của nó không có downsampling stride-2), không có đường dẫn PAN từ dưới lên mà YOLOv5 đã giới thiệu.

Link to this sectionDetection Head: Dựa trên Anchor → Không Anchor → Không NMS#

Head chuyển ba bản đồ đặc trưng đã kết hợp thành các dự đoán cho nhiệm vụ phát hiện. Thiết kế của nó đã thay đổi qua các phiên bản, từ dựa trên anchor sang không anchor và không NMS.

Link to this sectionHead Detect không dùng anchor, tách biệt#

Các phiên bản gốc YOLOv3 và YOLOv5 sử dụng head ghép nối, dựa trên anchor: các khung neo được định nghĩa trước và một nhánh chung cho dự đoán box và lớp. Các kho lưu trữ độc lập ultralytics/yolov3ultralytics/yolov5 vẫn giữ thiết kế dựa trên anchor đó. Gói ultralytics chính thay vào đó cung cấp các biến thể YOLOv3uYOLOv5u không dùng anchor — cùng các backbone Darknet-53 và C3 với head Detect không dùng anchor của YOLOv8 — và các cấu hình yolov3.yamlyolov5.yaml được ghi lại ở đây là các biến thể u này, không phải thiết kế lịch sử.

Head Detect (head.py) không dùng anchor và được tách biệt: mỗi cấp pyramid, nó chạy hai nhánh song song, và dự đoán trực tiếp trên các điểm lưới thay vì so với các khung neo.

  • Nhánh Box (cv2): Conv(x, c2, 3)Conv(c2, c2, 3)Conv2d(c2, 4 * reg_max, 1).
  • Nhánh Lớp (cv3): trong YOLO11 và YOLO26, hai khối tách biệt theo chiều sâu (DWConv + 1x1 Conv) → Conv2d(c3, nc, 1); YOLOv8 sử dụng biến thể cũ, hai lớp 3x3 ConvConv2d(c3, nc, 1).

Do đó, mỗi điểm neo phát ra no = nc + 4 * reg_max đầu ra. Việc loại bỏ các neo được định nghĩa trước giúp giảm kích thước khung neo và tỷ lệ khung hình khỏi các siêu tham số cần phải điều chỉnh.

Link to this sectionDistribution Focal Loss (DFL)#

YOLOv8 và YOLO11 hồi quy từng tọa độ trong 4 tọa độ box như một phân phối trên reg_max = 16 bin thay vì một vô hướng đơn lẻ (dạng tích phân từ Generalized Focal Loss). Mô-đun DFL định hình lại 4 kênh box 4 * reg_max thành (4, reg_max), áp dụng softmax trên các bin reg_max, và lấy chỉ số bin kỳ vọng — mỗi chỉ số bin được trọng số bởi xác suất softmax của nó, sau đó tổng hợp lại — làm tọa độ được dự đoán. Điều này được triển khai dưới dạng một tích chập 1x1 cố định với trọng số là các chỉ số bin arange(reg_max), vì vậy tổng trọng số là một tích vô hướng đơn lẻ.

Link to this sectionYOLO26: Không NMS, Không DFL#

YOLO26 thiết lập hai tham số YAML mà head đọc trực tiếp:

  • end2end: TrueDetect sao chép sâu các nhánh của nó vào một head một-đối-một (one2one_cv2/one2one_cv3) tạo ra một dự đoán duy nhất cho mỗi đối tượng, loại bỏ bước hậu xử lý Non-Maximum Suppression (NMS). Xem hướng dẫn Phát hiện End-to-End để biết chi tiết về xuất và di chuyển.
  • reg_max: 1 — với một bin, self.dfl trở thành nn.Identity()no = nc + 4; head hồi quy trực tiếp các tọa độ và không có thao tác DFL nào xuất hiện trong đồ thị ONNX đã xuất.

Qua năm kích thước mô hình (n/s/m/l/x), YOLO26 đạt 40.9-57.5 mAP trên COCO với độ trễ 1.7-11.8 ms T4 TensorRT, theo báo cáo trong bài báo YOLO26.

Link to this sectionTóm tắt theo Phiên bản#

Phiên bảnKhối BackboneSpatial poolingCơ chế chú ýDetection headDFL
YOLOv3Darknet-53 (Bottleneck)không có trong cấu hình cơ bảnkhôngGốc: dựa trên anchor; biến thể u: không dùng anchorkhông / có (u)
YOLOv5C3 (CSP)SPPFkhôngGốc: dựa trên anchor; biến thể u: không dùng anchorkhông / có (u)
YOLOv8C2fSPPFkhôngKhông dùng anchor, tách biệtcó (reg_max=16)
YOLO11C3k2SPPFC2PSAKhông dùng anchor, tách biệtcó (reg_max=16)
YOLO26C3k2SPPF + shortcutC2PSAKhông dùng anchor, không NMS (end2end)đã loại bỏ (reg_max=1)

Để biết chi tiết về từng mô hình, bảng hiệu suất và ví dụ sử dụng, xem các trang riêng lẻ cho YOLOv3, YOLOv5, YOLOv8, YOLO11, và YOLO26.

Link to this sectionTự Kiểm tra Kiến trúc#

Phương thức model.info() in ra bản tóm tắt về lớp, tham số và FLOPs, và danh sách mô-đun đã phân tích có sẵn trên model.model.model.

Kiểm tra kiến trúc của một mô hình YOLO
from ultralytics import YOLO

# Load a pretrained model
model = YOLO("yolo11n.pt")

# Fuse Conv + BatchNorm layers so counts match the published specs
model.fuse()

# Print a summary: layers, parameters, gradients, GFLOPs
model.info()

# Inspect the detection head (the last module in the network)
head = model.model.model[-1]
print(type(head).__name__, "| reg_max:", head.reg_max, "| end2end:", head.end2end)

Chạy đoạn mã qua ba thế hệ cho thấy những thay đổi về mặt số liệu. Đây là các đầu ra mô hình đã kết hợp thực tế từ gói ultralytics, khớp với số lượng tham số và FLOPs được công bố trên mỗi trang mô hình:

Mô hìnhCác lớpTham sốGFLOPsreg_maxend2endLớp DFL
YOLOv8n723,151,9048.716FalseDFL
YOLO11n1002,616,2486.516FalseDFL
YOLO26n1222,408,9325.41TrueIdentity

YOLO26n báo cáo reg_max=1, end2end=True, và một lớp DFL Identity — dấu ấn kiến trúc của head không NMS, không DFL của nó.

Số lượng đã kết hợp vs chưa kết hợp

Các giá trị thông số và FLOPs được báo cáo cho mô hình fused (model.fuse()), giúp hợp nhất mỗi lớp Conv và lớp batch normalization của nó. Điều này khớp với các thông số kỹ thuật đã công bố; một checkpoint mới được tải sẽ báo cáo số lượng cao hơn một chút trước khi thực hiện fuse.

Link to this sectionKết luận#

Qua các phiên bản, kiến trúc YOLO đã thay đổi từng giai đoạn một: backbone chuyển từ Darknet-53 sang các khối C3, C2fC3k2 dựa trên CSP với cơ chế attention C2PSA; phần neck vẫn giữ cấu trúc FPN + PAN trong khi SPP trở thành SPPF; và phần head chuyển từ dựa trên anchor sang không dùng anchor, sau đó đến thiết kế end-to-end không cần NMS và không cần DFL của YOLO26.

Để định nghĩa các kiến trúc tùy chỉnh, hãy xem Hướng dẫn Cấu hình YAML cho Model, hoặc so sánh các mô hình trên trang mô hình. Nếu có câu hỏi, hãy liên hệ trên GitHub hoặc Discord.

Link to this sectionCâu hỏi thường gặp#

Link to this sectionBa giai đoạn của một kiến trúc YOLO là gì?#

Một mô hình YOLO có backbone giúp trích xuất các đặc trưng từ hình ảnh ở các stride 8, 16 và 32, một neck giúp hợp nhất các đặc trưng đó qua các thang đo với FPN và PAN, và một head giúp dự đoán BBox và điểm số lớp. Mọi mô hình Ultralytics YOLO từ YOLOv3 đến YOLO26 đều tuân theo thiết kế ba giai đoạn này.

Link to this sectionSự khác biệt giữa các khối C2f và C3k2 là gì?#

C2f (YOLOv8) là một khối CSP thực hiện nối (concatenate) đầu ra của mọi Bottleneck bên trong — n + 2 bản đồ đặc trưng — trước khi thực hiện convolution hợp nhất, trong khi C3 cũ hơn chỉ truyền qua 2. C3k2 (YOLO11 và YOLO26) là một lớp con của C2f có khả năng thay thế mỗi Bottleneck bằng một khối C3k (một biến thể C3 với kích thước kernel có thể cấu hình) khi cờ c3k được thiết lập. Cả hai đều được định nghĩa trong block.py.

Link to this sectionKiến trúc đã thay đổi như thế nào giữa YOLOv8 và YOLO11?#

YOLO11 thực hiện ba thay đổi cấu trúc đối với YOLOv8: nó thay thế khối backbone và neck C2f bằng C3k2, chèn một khối self-attention C2PSA sau SPPF, và chuyển nhánh phân loại của head sang các tích chập tách biệt theo chiều sâu (depthwise-separable convolutions) nhẹ hơn. Cả hai đều giữ nguyên Detect head không dùng anchor và tách rời với hồi quy DFL reg_max=16, vì vậy các thay đổi này giúp giảm số lượng tham số và FLOPs trong khi vẫn tăng độ chính xác thay vì thiết kế lại giao diện phát hiện.

Link to this sectionYOLO có phải là anchor-free không?#

Các mô hình Ultralytics YOLO hiện đại đều là anchor-free. YOLOv8, YOLO11 và YOLO26 sử dụng Detect head anchor-free, tách rời với các nhánh riêng biệt cho hồi quy hộp và phân loại. Các phiên bản YOLOv3 và YOLOv5 gốc dựa trên anchor, nhưng Ultralytics cung cấp chúng dưới dạng các biến thể YOLOv3uYOLOv5u, có cấu hình sử dụng cùng một head anchor-free như YOLOv8.

Link to this sectionYOLO26 có loại bỏ NMS không?#

Có — YOLO26 thiết lập end2end=True, cung cấp cho Detect một head one-to-one giúp tạo ra một dự đoán duy nhất cho mỗi đối tượng và loại bỏ bước xử lý hậu kỳ Non-Maximum Suppression vốn được yêu cầu ở các mô hình trước đó. Xem Hướng dẫn Phát hiện End-to-End để biết chi tiết.

Link to this sectionDistribution Focal Loss (DFL) là gì và tại sao YOLO26 lại loại bỏ nó?#

DFL hồi quy mỗi tọa độ hộp dưới dạng một phân phối softmax trên các bin reg_max (mặc định là 16 trong YOLOv8 và YOLO11) và lấy giá trị kỳ vọng làm tọa độ, thay vì dự đoán một giá trị vô hướng đơn lẻ. YOLO26 thiết lập reg_max=1, do đó lớp DFL trở thành một phép toán đồng nhất (identity operation), head trực tiếp hồi quy tọa độ và không có toán tử DFL nào xuất hiện trong các đồ thị ONNX hoặc TensorRT đã export.

Link to this sectionLàm thế nào để tôi có thể xem kiến trúc của một mô hình YOLO cụ thể?#

Tải mô hình trong Python và gọi model.info() để xem tóm tắt về lớp, tham số và GFLOPs. Các lớp đã được phân tích nằm trong model.model.model — ví dụ, model.model.model[-1]Detect head, hiển thị các thuộc tính như reg_maxend2end. Kiến trúc đầy đủ được định nghĩa trong tệp cấu hình YAML của mô hình.

Người đóng góp

Bình luận