Đánh giá và triển khai mọi tác vụ
Đặt ngưỡng cho từng tác vụ theo metric riêng ở kích thước triển khai, xác thực mọi tác vụ trong một vòng lặp và export từng tác vụ sang ONNX với dự đoán đã được xác minh.
Mỗi tác vụ có định nghĩa riêng về kết quả chính xác: độ chồng lấp pixel, độ tương đồng keypoint, IoU của box xoay, dự đoán top-1 đúng hoặc tỷ lệ độ sâu. Các nhóm tái sử dụng checklist phát hiện đối tượng sẽ triển khai model phân đoạn được đánh giá theo mAP của box và model tư thế được đánh giá theo box, dù box không phải sản phẩm cần dùng. Model vượt qua ngưỡng đánh giá vẫn có thể lỗi sau khi export: trong bài học này, cùng một bộ trọng số tư thế phát hiện 5 người ở kích thước đầu vào này nhưng chỉ 3 người ở kích thước khác, còn khoảng cách của model độ sâu gần như tăng gấp đôi.
Thực hành
Một ngưỡng cho mỗi tác vụ#
| Tác vụ | Đặt ngưỡng theo | Khóa results_dict | Thuộc tính Python | Được đánh giá bằng |
|---|---|---|---|---|
| phân đoạn | mAP50-95 của mask | metrics/mAP50-95(M) | metrics.seg.map | IoU pixel theo từng đối tượng |
| phân đoạn ngữ nghĩa | mIoU (+ IoU theo từng lớp) | metrics/mIoU | metrics.miou | IoU pixel theo từng lớp |
| tư thế | pose mAP50-95 | metrics/mAP50-95(P) | metrics.pose.map | OKS |
| obb | mAP50-95 của OBB | metrics/mAP50-95(B) | metrics.box.map | IoU của box xoay |
| phân loại | độ chính xác top-1 | metrics/accuracy_top1 | metrics.top1 | lớp dự đoán top-1 chính xác |
| độ sâu | δ1 (+ AbsRel) | metrics/delta1 | metrics.delta1 | tỷ lệ pixel có độ sâu nằm trong khoảng 1.25× độ sâu thực |
Hướng dẫn về metric hiệu năng giải thích từng điểm số. Các lần chạy phân đoạn và tư thế cũng báo cáo metric box; hãy dùng chúng làm chỉ số chẩn đoán — chênh lệch giữa box và mask cho thấy chất lượng đường viền — nhưng chúng không phải sản phẩm. Nội dung chuyên sâu về phát hiện đối tượng, chẳng hạn như kiểm tra nhiều ngưỡng và ma trận nhầm lẫn, cũng áp dụng từ Xác thực và chẩn đoán.
Xác thực mọi tác vụ trong một vòng lặp#
Chế độ Val chấp nhận trọng số của mọi tác vụ khi đi kèm dataset tương ứng, vì vậy một vòng lặp sẽ tạo ra các số liệu cho bảng phát hành:
from ultralytics import YOLO
runs = {
"yolo26n-seg.pt": ("coco8-seg.yaml", "metrics/mAP50-95(M)"),
"yolo26n-sem.pt": ("cityscapes8.yaml", "metrics/mIoU"),
"yolo26n-pose.pt": ("coco8-pose.yaml", "metrics/mAP50-95(P)"),
"yolo26n-obb.pt": ("dota8.yaml", "metrics/mAP50-95(B)"),
"yolo26n-depth.pt": ("depth8.yaml", "metrics/delta1"),
}
for weights, (data, key) in runs.items():
metrics = YOLO(weights).val(data=data, device="cpu", plots=False, verbose=False)
print(f"{weights:17s} {key:22s} {metrics.results_dict[key]:.3f}")yolo26n-seg.pt metrics/mAP50-95(M) 0.538
yolo26n-sem.pt metrics/mIoU 0.610
yolo26n-pose.pt metrics/mAP50-95(P) 0.419
yolo26n-obb.pt metrics/mAP50-95(B) 0.857
yolo26n-depth.pt metrics/delta1 0.377Nếu không chỉ định rõ imgsz, mỗi model sẽ được xác thực ở kích thước đã dùng khi huấn luyện: 640 cho phân đoạn và tư thế, 768 cho độ sâu, 1024 cho phân đoạn ngữ nghĩa và OBB. Các số liệu pretrained này cao hơn các lần chạy huấn luyện ở 320 pixel trước đó trong khóa học — một phần nhờ quá trình huấn luyện, một phần nhờ độ phân giải. Bốn ảnh xác thực khiến mọi số liệu ở đây chỉ có giá trị smoke test; chẳng hạn, trang tác vụ độ sâu báo cáo δ1 trên toàn bộ benchmark NYU. Cố ý không đưa phân loại vào: hãy xác thực classifier đã fine-tune trên các thư mục riêng của nó, như trong bài học về classifier.
Cùng một bộ trọng số có thể đạt điểm khác nhau ở các imgsz khác nhau. Ghi lại imgsz cùng với mọi con số, validation ở kích thước sẽ dùng khi triển khai và không bao giờ so sánh các con số được đo ở những kích thước khác nhau.
Export mọi tác vụ#
Mỗi tác vụ được export sang ONNX bằng cùng một lời gọi chế độ Export. Tác vụ được lưu trong metadata của model, vì vậy YOLO("model.onnx") áp dụng đúng bước hậu xử lý. Việc chọn runtime, kiểm tra độ tương đương và tinh chỉnh TensorRT hoặc OpenVINO thuộc nội dung Export sang ONNX (và xác minh độ tương đương); vòng lặp này kiểm tra xem mọi tác vụ có hoạt động sau khi chuyển đổi khứ hồi hay không:
from ultralytics import YOLO
for weights in ["yolo26n-seg.pt", "yolo26n-sem.pt", "yolo26n-pose.pt", "yolo26n-obb.pt", "yolo26n-cls.pt", "yolo26n-depth.pt"]:
onnx_path = YOLO(weights).export(format="onnx", imgsz=320)
onnx_model = YOLO(onnx_path) # task comes from the ONNX metadata
result = onnx_model("https://ultralytics.com/images/bus.jpg", imgsz=320, verbose=False)[0]
print(f"{onnx_model.task:9s} {result.verbose()}")segment 4 persons, 1 bus,
semantic
pose 3 persons,
obb (no detections),
classify minibus 0.38, police_van 0.21, trolleybus 0.05, amphibian 0.05, bullet_train 0.03,
depth depth 4.67-26.91m,Mọi bản export đều được tải lại với đúng tác vụ. Ba kết quả cần xem xét kỹ hơn:
- Tác vụ tư thế phát hiện được 3 người ở 320 pixel, trong khi lần chạy PyTorch ở 640 pixel phát hiện được 5 người.
- Model độ sâu ước tính cảnh ở mức 4.7–26.9 m, trong khi cùng bộ trọng số ở kích thước gốc 768 pixel cho kết quả 2.1–14.9 m.
- OBB không phát hiện gì trong ảnh đường phố — đây là hành vi đúng của model ảnh chụp từ trên không, không phải lỗi export.
PyTorch tại imgsz=320 cho cùng kết quả tư thế và độ sâu như ONNX, nên đây cũng không phải lỗi export: kích thước đầu vào đã làm thay đổi kết quả. Hãy export ở imgsz mà bạn đã xác thực. Kết quả phân đoạn ngữ nghĩa không có dòng tóm tắt theo từng đối tượng, vì vậy hãy kiểm tra result.semantic_mask.
Chạy dự đoán một lần bằng từng model đã export trên ảnh tương tự dữ liệu dùng để huấn luyện — cảnh đường phố với model COCO, ảnh chụp từ trên cao với OBB, cảnh trong nhà hoặc ngoài phố ở đúng tỷ lệ với depth — trước khi kết luận bản export bị lỗi hoặc đưa vào sử dụng.
Nếu tự viết bước hậu xử lý, đây là các đầu ra ONNX thô tại imgsz=320, lấy từ log export:
| Tác vụ | Hình dạng đầu ra ONNX | Nội dung |
|---|---|---|
| phân đoạn | (1, 116, 2100) và (1, 32, 80, 80) | box + 80 điểm số lớp + 32 hệ số mask; các prototype mask |
| phân đoạn ngữ nghĩa | (1, 320, 320) | bản đồ lớp, phép argmax đã nằm trong graph |
| tư thế | (1, 56, 2100) | box + 1 điểm số + 17 × 3 giá trị keypoint |
| obb | (1, 20, 2100) | box + 15 điểm số lớp + 1 góc |
| phân loại | (1, 1000) | xác suất lớp |
| độ sâu | (1, 1, 320, 320) | độ sâu tính bằng mét trên mỗi pixel |
Trên Ultralytics Platform, trang model hiển thị các metric riêng của tác vụ (mask mAP đối với model phân đoạn) phía trên tab Export, nơi tạo ra cùng các định dạng:

ONNX là định dạng trung gian: một file đã export có thể chạy trong ONNX Runtime hoặc được chuyển đổi tiếp sang các runtime khác.

Checklist triển khai#
- Metric dùng để đặt ngưỡng trong bảng phía trên đạt mục tiêu trên tập dữ liệu hold-out, ở
imgszdùng khi triển khai. - Model đã export tải lại với
tasknhư mong đợi và cho kết quả dự đoán khớp với PyTorch trên một tập ảnh cố định. - Các luồng xử lý theo từng tác vụ xử lý được kết quả rỗng:
masks is None, không có keypoint, không có OBB. - Các số liệu ở bước tiếp theo (diện tích, góc, khoảng cách, xác suất lớp) được ghi log để bạn theo dõi độ trôi, như mô tả trong Khả năng quan sát và độ trôi.
Khi không đạt ngưỡng, "quay lại xử lý dữ liệu" thường có nghĩa là điều chỉnh một trong ba yếu tố:

Trước tiên, cải thiện chất lượng dữ liệu và quy trình gán nhãn — các bước kiểm tra nhãn trong bài học 2 và 6 là điểm khởi đầu ít tốn kém nhất — và chỉ thay đổi model khi dữ liệu đã sạch.
Hiển thị lời giải
from ultralytics import YOLO
checks = {
"runs/segment/train/weights/best.pt": ("coco8-seg.yaml", "metrics/mAP50-95(M)", "https://ultralytics.com/images/bus.jpg"),
"runs/obb/train/weights/best.pt": ("dota8.yaml", "metrics/mAP50-95(B)", "https://ultralytics.com/images/boats.jpg"),
}
for weights, (data, key, image) in checks.items():
model = YOLO(weights)
gate = model.val(data=data, imgsz=320, plots=False, verbose=False).results_dict[key]
onnx_model = YOLO(model.export(format="onnx", imgsz=320))
result = onnx_model(image, imgsz=320, verbose=False)[0]
print(f"{onnx_model.task:8s} {key} @320 = {gate:.3f} | ONNX: {result.verbose()}")Điều chỉnh các đường dẫn runs/... cho khớp với các thư mục mà những lần chạy huấn luyện đã in ra (Results saved to ...). Với các lần chạy một epoch trong bài học 2 và 7:
segment metrics/mAP50-95(M) @320 = 0.377 | ONNX: 4 persons, 1 bus,
obb metrics/mAP50-95(B) @320 = 0.832 | ONNX: 185 ships, 3 harbors,| Model | Metric kiểm soát | Giá trị | imgsz | ONNX |
|---|---|---|---|---|
| phân đoạn | mAP50-95 của mask | 0.377 | 320 | tải lại thành segment, phát hiện xe buýt và 4 người |
| obb | mAP50-95 của OBB | 0.832 | 320 | tải lại thành obb, phát hiện 185 tàu và 3 bến cảng |
Mỗi lần kiểm tra dùng ảnh thuộc đúng miền dữ liệu: model OBB nhận ảnh cảng chụp từ trên không, không phải cảnh đường phố. Cả hai hàng đều vượt qua bước kiểm tra export; chưa model nào sẵn sàng triển khai, vì một epoch trên bốn ảnh xác thực chỉ là smoke test, không phải ngưỡng đánh giá.