Ultralytics YOLO27: Tham gia danh sách chờ.
Get Started
Vượt ra ngoài detection: segmentation, pose, OBB và classification·Phân loại, kết hợp, triển khai·Bài học 10/10
Bài họctrung cấp

Đá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.

Kết quả

Tạo bảng phát hành gồm metric dùng để đặt ngưỡng và imgsz cho từng model tác vụ, cùng bản export ONNX đã xác minh của từng model; mỗi bản phải tải lại đúng tác vụ và dự đoán chính xác trên ảnh thuộc miền dữ liệu.

Lộ trình cấp tốc
Nếu bạn đã nắm rõ cách thực hiện, đây là phiên bản tóm tắt.
  1. Đặt ngưỡng phân đoạn theo mask mAP50-95, phân đoạn ngữ nghĩa theo mIoU, tư thế theo pose mAP50-95, OBB theo OBB mAP50-95, phân loại theo top-1, độ sâu theo δ1.

  2. Đọc các số liệu chính từ metrics.results_dict bằng khóa của tác vụ, rồi ghi imgsz bên cạnh mỗi số liệu.

  3. Export bằng model.export(format="onnx", imgsz=...) ở kích thước bạn đã xác thực.

  4. Tải lại bản export bằng YOLO("model.onnx") và chạy dự đoán một lần trên ảnh thuộc miền dữ liệu của chính model trước khi triển khai.

Thực hành

Một ngưỡng cho mỗi tác vụ#

Tác vụĐặt ngưỡng theoKhóa results_dictThuộc tính PythonĐược đánh giá bằng
phân đoạnmAP50-95 của maskmetrics/mAP50-95(M)metrics.seg.mapIoU pixel theo từng đối tượng
phân đoạn ngữ nghĩamIoU (+ IoU theo từng lớp)metrics/mIoUmetrics.miouIoU pixel theo từng lớp
tư thếpose mAP50-95metrics/mAP50-95(P)metrics.pose.mapOKS
obbmAP50-95 của OBBmetrics/mAP50-95(B)metrics.box.mapIoU của box xoay
phân loạiđộ chính xác top-1metrics/accuracy_top1metrics.top1lớp dự đoán top-1 chính xác
độ sâuδ1 (+ AbsRel)metrics/delta1metrics.delta1tỷ 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.377

Nế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.

Độ phân giải là một phần của chỉ số

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.

Kiểm tra nhanh từng bản export trong đúng miền dữ liệu

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 ONNXNộ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:

Trang model trên Ultralytics Platform dành cho model phân đoạn, có các thẻ mask mAP50, mAP50-95, precision và recall phía trên tab Export liệt kê TorchScript, ONNX, OpenVINO, TensorRT và CoreML

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.

ONNX dưới dạng định dạng trung gian: model từ PyTorch, TensorFlow, Keras và các framework khác được export sang ONNX rồi tải vào ONNX Runtime hoặc framework 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, ở imgsz dùng khi triển khai.
  • Model đã export tải lại với task như 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ố:

Ba cách cải thiện mAP: chất lượng dữ liệu, tối ưu hóa model và quy trình gán nhãn

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.

Dùng thử

Chọn hai tác vụ bạn đã huấn luyện trong khóa học này. Với mỗi tác vụ, hãy viết một dòng trong bảng phát hành, ghi metric dùng để đặt ngưỡng tại imgsz triển khai, export best.pt đã huấn luyện sang ONNX ở kích thước đó, tải lại model và xác nhận model dự đoán hợp lý trên một ảnh thuộc miền dữ liệu.

Điều kiện hoàn thành
Bạn đã hoàn thành bài học khi tất cả các điều kiện sau đều đúng.
  • Bảng phát hành của bạn liệt kê đúng metric dùng để đặt ngưỡng, giá trị của metric và imgsz cho cả hai model.

  • Cả hai model đã được export sang ONNX và tải lại với task như mong đợi.

  • Mỗi bản export tạo ra dự đoán hợp lý trên ảnh thuộc miền dữ liệu tương ứng.

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,
ModelMetric kiểm soátGiá trịimgszONNX
phân đoạnmAP50-95 của mask0.377320tải lại thành segment, phát hiện xe buýt và 4 người
obbmAP50-95 của OBB0.832320tả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á.

Tiếp theo là gì

Hãy làm bài thi cuối khóa để nhận chứng chỉ, sau đó tiếp tục với Ultralytics YOLO trong môi trường production để triển khai các model này bằng runtime được tối ưu, theo dõi và giám sát.

Đăng nhập để lưu tiến độ