Hiểu về quá trình phát hiện từ đầu đến cuối trong Ultralytics YOLO26
Giới thiệu
Nếu bạn nâng cấp lên YOLO26 từ các phiên bản cũ hơn như YOLOv8 hoặc YOLO11 , một trong những thay đổi lớn nhất mà bạn sẽ nhận thấy là việc loại bỏ tính năng Non-Maximum Suppression (Ngăn chặn các kết quả không tối đa ). NMS ). Truyền thống YOLO các mô hình tạo ra hàng ngàn dự đoán chồng chéo cần một quy trình riêng biệt. NMS Bước xử lý hậu kỳ nhằm lọc ra các phát hiện cuối cùng. Điều này làm tăng độ trễ, làm phức tạp biểu đồ xuất và có thể hoạt động không nhất quán trên các nền tảng phần cứng khác nhau.
YOLO26 áp dụng một phương pháp khác. Nó xuất ra kết quả phát hiện cuối cùng trực tiếp từ mô hình — không cần lọc bên ngoài. Điều này được gọi là phát hiện đối tượng từ đầu đến cuối , và nó được bật theo mặc định trong tất cả các mô hình YOLO26. Kết quả là quy trình triển khai đơn giản hơn, độ trễ thấp hơn và tốc độ suy luận trên CPU nhanh hơn tới 43% .
Hướng dẫn này sẽ giúp bạn hiểu rõ những thay đổi, liệu bạn có cần cập nhật mã của mình hay không, định dạng xuất nào hỗ trợ suy luận từ đầu đến cuối và cách chuyển đổi suôn sẻ từ phiên bản cũ. YOLO mô hình.
Để hiểu rõ hơn về động cơ đằng sau sự thay đổi kiến trúc này, hãy xem bài đăng trên blog Ultralytics về lý do tại sao YOLO26 loại bỏ NMS .
Tóm tắt nhanh
- Sử dụng Ultralytics API hoặc CLI ? Không cần thay đổi gì cả — chỉ cần đổi tên mẫu của bạn thành
yolo26n.pt. - Sử dụng mã suy luận tùy chỉnh ( ONNX Thời gian chạy, TensorRT , vân vân.)? Cập nhật quá trình xử lý hậu kỳ của bạn — kết quả phát hiện hiện đã có sẵn.
(N, 300, 6)trongxyxyđịnh dạng, không NMS cần thiết. Các tác vụ khác sẽ thêm dữ liệu bổ sung (hệ số mặt nạ, điểm đặc trưng hoặc góc). - Xuất khẩu? Hầu hết các định dạng đều hỗ trợ xuất dữ liệu từ đầu đến cuối một cách tự nhiên. Tuy nhiên, một vài định dạng ( NCNN , RKNN, PaddlePaddle , ExecuTorch, IMX và Edge TPU ) tự động chuyển về chế độ xuất truyền thống do các ràng buộc toán tử không được hỗ trợ (ví dụ:
torch.topk).
Cách thức hoạt động của tính năng phát hiện từ đầu đến cuối
YOLO26 sử dụng kiến trúc hai đầu trong quá trình huấn luyện . Cả hai đầu đều dùng chung một khung xương và cổ, nhưng tạo ra đầu ra theo những cách khác nhau:
| Head | Mục đích | Đầu ra phát hiện | Xử lý hậu kỳ |
|---|---|---|---|
| Một đối một (mặc định) | Suy luận từ đầu đến cuối | (N, 300, 6) | Chỉ ngưỡng tin cậy |
| Một-nhiều | Truyền thống YOLO đầu ra | (N, nc + 4, 8400) | Yêu cầu NMS |
Các hình dạng ở trên dùng để phát hiện . Các tác vụ khác mở rộng đầu ra một-đối-một bằng cách cung cấp thêm dữ liệu cho mỗi lần phát hiện:
| Tác vụ | Đầu ra từ đầu đến cuối | Dữ liệu bổ sung |
|---|---|---|
| Phát hiện vật thể | (N, 300, 6) | — |
| Phân đoạn | (N, 300, 6 + nm) + nguyên mẫu (N, nm, H, W) | nm hệ số mặt nạ (mặc định 32) |
| Pose (Dáng điệu/Tư thế) | (N, 300, 57) | 17 điểm mấu chốt × 3 (x, y, khả năng quan sát) |
| OBB | (N, 300, 7) | Góc quay |
Trong quá trình huấn luyện, cả hai đầu xử lý hoạt động đồng thời — đầu xử lý một-nhiều cung cấp tín hiệu học tập phong phú hơn, trong khi đầu xử lý một-một học cách tạo ra các dự đoán rõ ràng, không chồng chéo. suy luận và exportchỉ có một đối một đầu Chức năng này được kích hoạt theo mặc định, tạo ra tối đa 300 lượt phát hiện trên mỗi hình ảnh ở định dạng này. [x1, y1, x2, y2, confidence, class_id].
Khi bạn gọi model.fuse()Nó kết hợp các lớp Conv + BatchNorm để suy luận nhanh hơn và, trên các mô hình end-to-end, cũng loại bỏ đầu nối một-nhiều — giảm kích thước mô hình và FLOPs. Để biết thêm chi tiết về kiến trúc đầu nối kép, hãy xem [tham khảo]. Trang mẫu YOLO26.
Tôi có cần thay đổi mã của mình không?
Sử dụng Ultralytics Python API hoặc CLI
Không cần thay đổi gì cả. Nếu bạn sử dụng Python Ultralytics hoặc CLI tiêu chuẩn của Ultralytics, mọi thứ sẽ hoạt động tự động — dự đoán , xác thực và xuất dữ liệu đều xử lý các mô hình từ đầu đến cuối một cách hoàn chỉnh.
Không cần thay đổi mã nguồn nào với Ultralytics API
from ultralytics import YOLO
# Load a YOLO26 model
model = YOLO("yolo26n.pt")
# Predict — no NMS step, no code changes
results = model.predict("image.jpg")
yolo predict model=yolo26n.pt source=image.jpg
Sử dụng mã suy luận tùy chỉnh
Đúng vậy, định dạng đầu ra khác nhau. Nếu bạn đã viết logic xử lý hậu kỳ tùy chỉnh cho YOLOv8 hoặc YOLO11 (ví dụ: khi chạy suy luận với ONNX Runtime hoặc TensorRT ), bạn cần cập nhật nó để xử lý hình dạng đầu ra mới:
| YOLOv8 / YOLO11 | YOLO26 (từ đầu đến cuối) | |
|---|---|---|
| Kết quả phát hiện | (N, nc + 4, 8400) | (N, 300, 6) |
| Định dạng hộp | xywh (tâm x, tâm y, chiều rộng, chiều cao) | xyxy (góc trên bên trái x, góc trên bên trái y, góc dưới bên phải x, góc dưới bên phải y) |
| Cách trình bày | Tọa độ hộp + điểm số của lớp cho mỗi người dẫn đầu | [x1, y1, x2, y2, conf, class_id] |
| NMS yêu cầu | Có | Không |
| Xử lý hậu kỳ | NMS bộ lọc độ tin cậy + | Chỉ lọc độ tin cậy |
Đối với các tác vụ phân đoạn , định vị và OBB , YOLO26 sẽ thêm dữ liệu cụ thể cho từng tác vụ vào mỗi lần phát hiện — xem bảng hình dạng đầu ra ở trên.
Ở đâu N là kích thước lô và nc là số lượng lớp học (ví dụ: 80 cho COCO).
Với các mô hình tích hợp từ đầu đến cuối, quá trình xử lý hậu kỳ trở nên đơn giản hơn nhiều — ví dụ, khi sử dụng 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!
Chuyển sang mô hình Một-nhiều
Nếu bạn cần loại truyền thống YOLO định dạng đầu ra (ví dụ: để tái sử dụng định dạng hiện có) NMS (mã xử lý hậu kỳ dựa trên), bạn có thể chuyển sang đầu thu một-nhiều bất cứ lúc nào bằng cách thiết lập end2end=False:
Sử dụng đầu nối một-nhiều cho kiểu truyền thống NMS đầu ra dựa trên
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)
yolo predict model=yolo26n.pt source=image.jpg end2end=False
yolo val model=yolo26n.pt data=coco.yaml end2end=False
yolo export model=yolo26n.pt format=onnx end2end=False
Khả năng tương thích định dạng xuất
Hầu hết các định dạng xuất đều hỗ trợ suy luận từ đầu đến cuối ngay từ đầu, bao gồm ONNX , TensorRT , CoreML , OpenVINO , TFLite , TF và MNN .
Các định dạng sau không hỗ trợ kết nối đầu cuối và tự động chuyển sang kết nối một-nhiều: NCNN , RKNN , PaddlePaddle , ExecuTorch , IMX và Edge TPU .
Điều gì sẽ xảy ra khi tính năng hỗ trợ từ đầu đến cuối không được hỗ trợ?
Khi bạn xuất sang một trong những định dạng này, Ultralytics Tự động chuyển sang chế độ kết nối một-nhiều và ghi lại cảnh báo — không cần can thiệp thủ công. Điều này có nghĩa là bạn sẽ cần NMS trong quy trình suy luận của mình cho các định dạng này, giống như với YOLOv8 hoặc YOLO11 .
TensorRT + INT8
TensorRT hỗ trợ từ đầu đến cuối, nhưng nó là tự động vô hiệu hóa khi xuất khẩu với int8=True TRÊN TensorRT ≤10.3.0.
Sự đánh đổi giữa độ chính xác và tốc độ
Việc phát hiện từ đầu đến cuối mang lại những lợi ích đáng kể trong quá trình triển khai với tác động tối thiểu đến độ chính xác :
| Chỉ số | Từ đầu đến cuối (mặc định) | Một-nhiều + NMS (end2end=False) |
|---|---|---|
| CPU Tốc độ suy luận | Nhanh hơn tới 43% | Cơ sở |
| mAP Sự va chạm | ~0,5 mAP thấp hơn | Phù hợp hoặc vượt quá YOLO11 |
| Xử lý hậu kỳ | Chỉ lọc độ tin cậy | Đầy NMS đường ống |
| Độ phức tạp triển khai | Tối thiểu | Yêu cầu NMS triển khai |
Đối với hầu hết các ứng dụng thực tế, con số ~0,5 mAP Sự khác biệt là không đáng kể, đặc biệt khi xét đến tốc độ và sự đơn giản được cải thiện. Nếu độ chính xác tối đa là ưu tiên hàng đầu của bạn, bạn luôn có thể quay lại sử dụng đầu nối một-nhiều. end2end=False.
Xem các chỉ số hiệu năng của YOLO26 để biết chi tiết về điểm chuẩn trên tất cả các kích thước mô hình (n, s, m, l, x).
Di cư từ YOLOv8 hoặc YOLO11
Nếu bạn đang nâng cấp một dự án hiện có lên YOLO26, đây là danh sách kiểm tra nhanh để đảm bảo quá trình chuyển đổi diễn ra suôn sẻ:
- Ultralytics API / CLI người dùng: Không cần thay đổi gì cả — chỉ cần cập nhật tên mẫu thành
yolo26n.pt(hoặcyolo26n-seg.pt,yolo26n-pose.pt,yolo26n-obb.pt) - Mã xử lý hậu kỳ tùy chỉnh: Cập nhật để xử lý các định dạng đầu ra mới —
(N, 300, 6)để phát hiện, cộng thêm dữ liệu cụ thể cho nhiệm vụ. phân đoạn, pose, và OBBCũng lưu ý sự thay đổi định dạng hộp từ...xywhđếnxyxy - Quy trình xuất dữ liệu: Kiểm tra phần tương thích định dạng ở trên để biết định dạng mục tiêu của bạn.
- TensorRT + INT8: Xác minh TensorRT Phiên bản phải lớn hơn 10.3.0 để được hỗ trợ toàn diện.
- Xuất khẩu FP16: Nếu bạn cần tất cả các đầu ra ở định dạng FP16, hãy xuất bằng lệnh sau:
end2end=False- nhìn thấy Tại sao output0 vẫn là FP32? - iOS / CoreML : Được hỗ trợ đầy đủ từ đầu đến cuối. Nếu bạn cần hỗ trợ Xcode Preview, hãy sử dụng...
end2end=Falsevớinms=True - Các thiết bị biên ( NCNN , RKNN): Các định dạng này tự động chuyển về chế độ một-nhiều, vì vậy bao gồm NMS trong quy trình xử lý trên thiết bị của bạn
Câu hỏi thường gặp
Tôi có thể sử dụng end2end=True và nms=True cùng nhau không?
Không. Hai tùy chọn này loại trừ lẫn nhau. Nếu bạn thiết lập nms=True trên mô hình từ đầu đến cuối trong suốt exportNó sẽ tự động bị buộc phải làm như vậy. nms=False với một cảnh báo. Phần đầu cuối đã xử lý việc lọc trùng lặp nội bộ, vì vậy cần có thêm cảnh báo bên ngoài. NMS Điều đó là không cần thiết.
Tuy nhiên, end2end=False kết hợp với nms=True là một cấu hình hợp lệ — nó nướng theo kiểu truyền thống NMS vào biểu đồ xuất khẩu. Điều này có thể hữu ích cho CoreML Xuất dữ liệu vì nó cho phép bạn sử dụng chức năng Xem trước trong Xcode trực tiếp với mô hình phát hiện.
Tham số max_det điều khiển những gì trong các mô hình end-to-end?
Hàm max_det Tham số (mặc định: 300) thiết lập số lượng phát hiện tối đa mà đầu đọc one-to-one có thể xuất ra trên mỗi hình ảnh. Bạn có thể điều chỉnh tham số này trong quá trình suy luận hoặc xuất dữ liệu:
model.predict("image.jpg", max_det=100) # fewer detections, slightly faster
model.export(format="onnx", max_det=500) # more detections for dense scenes
Lưu ý rằng các điểm kiểm tra mặc định của YOLO26 được huấn luyện với max_det=300Mặc dù bạn có thể tăng giá trị này, nhưng thuật toán nhận diện đối tượng (one-to-one) đã được tối ưu hóa trong quá trình huấn luyện để tạo ra tối đa 300 lượt nhận diện chính xác, vì vậy các lượt nhận diện vượt quá giới hạn đó có thể có chất lượng thấp hơn. Nếu bạn cần nhiều hơn 300 lượt nhận diện trên mỗi hình ảnh, hãy cân nhắc huấn luyện lại với giá trị cao hơn. max_det giá trị.
Tôi đã xuất khẩu ONNX Kết quả đầu ra của mô hình (1, 300, 6) — có đúng không?
Đúng vậy, đó là định dạng đầu ra dự kiến từ đầu đến cuối cho quá trình phát hiện: kích thước lô của 1, tối đa 300 lần phát hiện, mỗi lần có 6 giá trị [x1, y1, x2, y2, confidence, class_id]Chỉ cần lọc theo ngưỡng độ tin cậy là xong — không cần gì thêm NMS cần thiết.
Đối với các tác vụ khác, hình dạng đầu ra sẽ khác nhau:
| Tác vụ | Hình dạng đầu ra | Mô tả |
|---|---|---|
| Phát hiện vật thể | (1, 300, 6) | [x1, y1, x2, y2, conf, class_id] |
| Phân đoạn | (1, 300, 38) + (1, 32, 160, 160) | 6 giá trị hộp + 32 hệ số mặt nạ, cộng thêm một mặt nạ nguyên mẫu tensor |
| Pose (Dáng điệu/Tư thế) | (1, 300, 57) | 6 giá trị hộp + 17 điểm đặc trưng × 3 (x, y, khả năng hiển thị) |
| OBB | (1, 300, 7) | 6 giá trị hộp + 1 góc xoay |
Làm sao để kiểm tra xem mô hình đã xuất của tôi có phải là mô hình hoàn chỉnh từ đầu đến cuối hay không?
Bạn có thể kiểm tra bằng cách sử dụng một trong hai cách sau: Ultralytics Python API hoặc bằng cách kiểm tra các tệp đã xuất. ONNX Siêu dữ liệu mô hình trực tiếp:
Kiểm tra xem mô hình có phải là mô hình đầu cuối hay không.
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
import onnxruntime as ort
session = ort.InferenceSession("yolo26n.onnx")
metadata = session.get_modelmeta().custom_metadata_map
print(metadata.get("end2end")) # 'True' if end-to-end is enabled
Ngoài ra, bạn cũng có thể kiểm tra hình dạng đầu ra — đầu ra của các mô hình phát hiện từ đầu đến cuối. (1, 300, 6)trong khi các mô hình truyền thống xuất ra (1, nc + 4, 8400)Để biết thêm thông tin về các hình thức nhiệm vụ khác, vui lòng xem phần [liên kết đến tài liệu tham khảo]. Câu hỏi thường gặp về hình dạng đầu ra.
Liệu quy trình xử lý từ đầu đến cuối có được hỗ trợ cho các tác vụ phân đoạn, định vị và OBB không?
Đúng vậy. Tất cả các biến thể tác vụ YOLO26 — phát hiện, phân đoạn, ước tính tư thế, và phát hiện đối tượng định hướng (obb) — Hỗ trợ suy luận từ đầu đến cuối theo mặc định. end2end=False Chế độ dự phòng cũng khả dụng cho tất cả các tác vụ.
Mỗi tác vụ mở rộng kết quả phát hiện cơ bản bằng dữ liệu dành riêng cho tác vụ đó:
| Tác vụ | Mô hình | Đầu ra từ đầu đến cuối |
|---|---|---|
| Phát hiện vật thể | yolo26n.pt | (N, 300, 6) |
| Phân đoạn | yolo26n-seg.pt | (N, 300, 38) + nguyên mẫu (N, 32, 160, 160) |
| Pose (Dáng điệu/Tư thế) | yolo26n-pose.pt | (N, 300, 57) |
| OBB | yolo26n-obb.pt | (N, 300, 7) |