Ultralytics YOLO27:
Get Started

Phát hiện hộp giới hạn định hướng với Ultralytics YOLO#

Ultralytics YOLO oriented bounding box detection of boats in aerial imagery

Phát hiện đối tượng định hướng nâng cấp phương pháp phát hiện đối tượng tiêu chuẩn bằng cách bổ sung một góc, giúp xác định vị trí đối tượng trong ảnh chính xác hơn.

Đầu ra của bộ phát hiện đối tượng định hướng là tập hợp các hộp giới hạn xoay bao quanh chính xác các đối tượng trong ảnh, kèm theo nhãn lớp và điểm tin cậy cho từng hộp. Hộp giới hạn định hướng đặc biệt hữu ích khi đối tượng xuất hiện ở nhiều góc độ khác nhau, chẳng hạn trong ảnh chụp từ trên không, nơi hộp giới hạn truyền thống căn theo trục có thể bao gồm phần nền không cần thiết. Các ứng dụng phổ biến gồm phát hiện tàu thuyền và phương tiện từ vệ tinh và drone, phân tích công trình và cơ sở hạ tầng phục vụ quy hoạch đô thị, giám sát cây trồng và kiểm tra tấm pin mặt trời hoặc tua-bin gió.



Xem: Cách phát hiện và theo dõi đối tượng bằng bounding box định hướng (OBB) của Ultralytics YOLO26 | Theo dõi tàu 🚢
Mẹo

Các model YOLO26 OBB sử dụng hậu tố -obb, tức là yolo26n-obb.pt, và được pretrained trên DOTAv1.

Phát hiện tàu thuyền bằng OBBPhát hiện phương tiện bằng OBB
Phát hiện tàu thuyền bằng OBBPhát hiện phương tiện bằng OBB

Model#

Các model YOLO26 OBB được pretrained trên dataset DOTAv1 được hiển thị bên dưới.

Model sẽ tự động tải xuống từ bản phát hành Ultralytics mới nhất trong lần sử dụng đầu tiên.

Modelkích thước
(pixel)
mAPtest
50-95(e2e)
mAPtest
50(e2e)
Tốc độ
CPU ONNX
(ms)
Tốc độ
T4 TensorRT10
(ms)
params
(M)
FLOPs
(B)
YOLO26n-obb102452.478.997.7 ± 0.92.8 ± 0.02.414.8
YOLO26s-obb102454.880.9218.0 ± 1.44.9 ± 0.19.856.7
YOLO26m-obb102455.381.0579.2 ± 3.810.2 ± 0.321.2184.9
YOLO26l-obb102456.281.6735.6 ± 3.113.0 ± 0.225.6232.4
YOLO26x-obb102456.781.71485.7 ± 11.530.5 ± 0.957.6520.1
  • Các giá trị mAPtest được đo với một model, đa scale trên dataset DOTAv1.
    Tái lập kết quả bằng yolo obb val data=DOTAv1.yaml device=0 split=test nms=False và gửi kết quả đã gộp đến đánh giá DOTA.
  • Tốc độ được tính trung bình trên các ảnh val của DOTAv1 bằng ONNX trên CPU và TensorRT10 trên GPU NVIDIA T4.
    Tái lập kết quả bằng yolo obb val data=DOTAv1.yaml batch=1 device=0|cpu nms=False
  • Các giá trị Params và FLOPs được tính cho model đã hợp nhất sau khi gộp Conv/BatchNorm và loại bỏ nhánh phát hiện không sử dụng. Checkpoint được huấn luyện trước vẫn giữ nguyên kiến trúc huấn luyện đầy đủ nên có thể hiển thị số liệu cao hơn.

Xem bản preview YOLO27 chưa phát hành để biết kết quả sơ bộ trên DOTAv1.

Huấn luyện#

Train YOLO26n-obb trên dataset DOTA8 trong 100 epoch với kích thước ảnh 640. Xem trang Configuration để biết danh sách đầy đủ các đối số hiện có.

Lưu ý

Một OBB và phép xoay 180° của nó là giống hệt nhau, vì vậy góc xoay được xác định theo modulo 180° và hộp không có hướng. Nhãn training được chuẩn hóa theo dạng cạnh dài: chiều rộng hộp w là cạnh dài hơn, góc được đo theo chiều kim đồng hồ từ trục x dương đến hướng của cạnh w, và được lưu bằng radian trong [-π/4, 3π/4) ([-45°, 135°)). Dự đoán không được chuẩn hóa, vì vậy hộp được dự đoán có thể báo cạnh ngắn là w; xem Đầu ra kết quả. Dạng [0°, 90°) là quy ước kiểu DOTA đã chuẩn hóa và không được áp dụng trong quá trình training hoặc inference.

Ví dụ
from ultralytics import YOLO

# Tải model
model = YOLO("yolo26n-obb.yaml")  # tạo model mới từ YAML
model = YOLO("yolo26n-obb.pt")  # tải model đã huấn luyện trước (được khuyến nghị khi huấn luyện)
model = YOLO("yolo26n-obb.yaml").load("yolo26n-obb.pt")  # tạo từ YAML và chuyển trọng số

# Huấn luyện model
results = model.train(data="dota8.yaml", epochs=100, imgsz=640)


Xem: Cách huấn luyện model Ultralytics YOLO-OBB (bounding box định hướng) trên dataset DOTA bằng Ultralytics Platform

Xem chi tiết đầy đủ về chế độ train trên trang Train. Bạn cũng có thể train model OBB bằng dịch vụ training đám mây của Ultralytics Platform.

Định dạng dataset#

Bạn có thể xem chi tiết định dạng dataset OBB trong Hướng dẫn về dataset. Định dạng YOLO OBB biểu diễn hộp giới hạn bằng bốn điểm góc có tọa độ chuẩn hóa trong khoảng từ 0 đến 1, theo cấu trúc sau. Tính năng gán nhãn của Ultralytics Platform hỗ trợ nhãn OBB với công cụ vẽ hộp giới hạn định hướng chuyên dụng:

class_index x1 y1 x2 y2 x3 y3 x4 y4

Trong nội bộ, YOLO xử lý loss và đầu ra ở định dạng xywhr, biểu diễn tâm của hộp giới hạn (xy), chiều rộng, chiều cao và góc xoay.

Đánh giá#

Validate độ chính xác của model YOLO26n-obb đã train trên dataset DOTA8. Truyền rõ ràng data để quá trình validation sử dụng đúng YAML của dataset.

Ví dụ
from ultralytics import YOLO

# Tải model
model = YOLO("yolo26n-obb.pt")  # tải model chính thức
model = YOLO("path/to/best.pt")  # tải model tùy chỉnh

# Xác thực model
metrics = model.val(data="dota8.yaml")  # validate trên dataset DOTA8
metrics.box.map  # map50-95(B)
metrics.box.map50  # map50(B)
metrics.box.map75  # map75(B)
metrics.box.maps  # danh sách chứa mAP50-95(B) cho từng danh mục
metrics.box.image_metrics  # dictionary metric theo từng ảnh, gồm precision, recall, F1, TP, FP và FN

Dự đoán#

Sử dụng model YOLO26n-obb đã train để chạy dự đoán trên ảnh.

Ví dụ
from ultralytics import YOLO

# Tải model
model = YOLO("yolo26n-obb.pt")  # tải model chính thức
model = YOLO("path/to/best.pt")  # tải model tùy chỉnh

# Dự đoán bằng model
results = model("https://ultralytics.com/images/boats.jpg")  # dự đoán trên một ảnh

# Truy cập kết quả
for result in results:
    xywhr = result.obb.xywhr  # tâm-x, tâm-y, chiều rộng, chiều cao, góc (radian)
    xyxyxyxy = result.obb.xyxyxyxy  # định dạng đa giác với 4 điểm
    names = [result.names[cls.item()] for cls in result.obb.cls.int()]  # tên lớp của từng hộp
    confs = result.obb.conf  # điểm tin cậy của từng hộp

Xem chi tiết đầy đủ về chế độ predict trên trang Dự đoán.

Truyền save_crop=True để lưu ảnh cắt của mỗi OBB đã căn chỉnh theo góc xoay với kích thước bằng kích thước box, giống như ObjectCropper.

Đầu ra kết quả#

Phát hiện hộp giới hạn định hướng trả về một đối tượng Results cho mỗi ảnh. Trường dự đoán chính là result.obb, chứa các hộp xoay, ID lớp và điểm tin cậy cho từng đối tượng được phát hiện.

Thuộc tínhKiểuHình dạngMô tả
result.obbOBB(N)BBox định hướng.
result.obb.datatorch.float32(N,7/8)BBox xoay thô kèm độ tin cậy/lớp.
result.obb.xywhrtorch.float32(N,5)BBox xoay xywhr.
result.obb.xyxyxyxytorch.float32(N,4,2)Bốn điểm góc.
result.obb.conftorch.float32(N,)Điểm độ tin cậy.

Nhãn được chuẩn hóa theo quy ước cạnh dài nhưng dự đoán thì không, vì vậy result.obb.xywhr có thể báo w nhỏ hơn h, với góc xoay được đo từ cạnh ngắn. Cả hai dạng đều mô tả cùng một hình chữ nhật, vì vậy result.obb.xyxyxyxy đều chính xác trong cả hai trường hợp. Chuyển đổi các góc trở lại khi code ở bước sau cần dạng cạnh dài, đồng thời lưu ý rằng việc viết lại các tham số hộp có thể làm thứ tự các góc dịch chuyển theo chu kỳ:

from ultralytics.utils.ops import xyxyxyxy2xywhr

xywhr = xyxyxyxy2xywhr(result.obb.xyxyxyxy)  # w >= h, rotation in [-pi/4, 3pi/4)

Để xem các trường Results dành riêng cho từng tác vụ trên tất cả tác vụ, hãy tham khảo mục Kết quả dự đoán theo tác vụ.

Export#

Xuất model YOLO26n-obb sang định dạng khác như ONNX, CoreML, v.v.

Ví dụ
from ultralytics import YOLO

# Tải model
model = YOLO("yolo26n-obb.pt")  # tải model chính thức
model = YOLO("path/to/best.pt")  # tải model tùy chỉnh

# # Xuất model
model.export(format="onnx")

Các định dạng xuất YOLO26-obb khả dụng được liệt kê trong bảng bên dưới. Bạn có thể xuất sang bất kỳ định dạng nào bằng đối số format, chẳng hạn format='onnx' hoặc format='engine'. Bạn có thể dự đoán hoặc đánh giá trực tiếp trên các model đã xuất, chẳng hạn yolo predict model=yolo26n-obb.onnx. Sau khi quá trình xuất hoàn tất, các ví dụ sử dụng sẽ được hiển thị cho model của bạn.

Định dạngĐối số formatModelMetadataĐối số
PyTorch-yolo26n-obb.pt✅-
TorchScripttorchscriptyolo26n-obb.torchscript✅imgsz, quantize, dynamic, nms, batch, device
ONNXonnxyolo26n-obb.onnx✅imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device
OpenVINOopenvinoyolo26n-obb_openvino_model/✅imgsz, quantize, dynamic, nms, batch, data, fraction, device
TensorRTengineyolo26n-obb.engine✅imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device
CoreMLcoremlyolo26n-obb.mlpackage✅imgsz, dynamic, quantize, nms, batch, device
Apple Core AIcoreaiyolo26n-obb.aimodel✅imgsz, batch, quantize
TF SavedModelsaved_modelyolo26n-obb_saved_model/✅imgsz, quantize, opset, nms, batch, data, fraction, device
TF GraphDefpbyolo26n-obb.pb❌imgsz, opset, batch, device
TF Edge TPUedgetpuyolo26n-obb_edgetpu.tflite✅imgsz, quantize, opset, data, fraction, device
LiteRTlitertyolo26n-obb.tflite✅imgsz, quantize, batch, data, fraction, device
PaddlePaddlepaddleyolo26n-obb_paddle_model/✅imgsz, batch, device
MNNmnnyolo26n-obb.mnn✅imgsz, batch, dynamic, quantize, simplify, opset, nms, device
NCNNncnnyolo26n-obb_ncnn_model/✅imgsz, quantize, batch, device
IMX500imxyolo26n-obb_imx_model/✅imgsz, quantize, data, fraction, nms, device
RKNNrknnyolo26n-obb_rknn_model/✅imgsz, batch, name, quantize, simplify, opset, data, fraction, device
ExecuTorchexecutorchyolo26n-obb_executorch_model/✅imgsz, batch, device
Axeleraaxelerayolo26n-obb_axelera_model/✅imgsz, batch, quantize, data, fraction, device
DEEPXdeepxyolo26n-obb_deepx_model/✅imgsz, quantize, simplify, opset, data, optimize, device
Qualcomm QNNqnnyolo26n-obb_qnn.onnx✅imgsz, batch, name, quantize, simplify, opset, data, fraction, device
Hailohailoyolo26n-obb_hailo_model/✅imgsz, name, quantize, data, fraction, simplify, conf, iou, device
Huawei Ascendascendyolo26n-obb_ascend_model/✅imgsz, batch, name, quantize, opset, simplify, nms, device
AMD Xilinxxilinxyolo26n-obb_xilinx_model/✅imgsz, name, quantize, data, fraction, opset, simplify, device

nms=None mặc định xuất đầu ra thô cho NMS bên ngoài. Đặt nms=False để chọn một head không dùng NMS hiện có; các định dạng không được hỗ trợ sẽ chuyển về luồng đầu ra gốc. Các mục nms ở trên xác định những định dạng có thể tích hợp NMS với nms=True.

Xem chi tiết đầy đủ về export trên trang Export.

Câu hỏi thường gặp#

  • Bounding box định hướng (OBB) có thêm một góc để nâng cao độ chính xác định vị đối tượng trong ảnh. Không giống bounding box thông thường là các hình chữ nhật song song với trục, OBB có thể xoay để khớp hơn với hướng của đối tượng. Điều này đặc biệt hữu ích cho các ứng dụng đòi hỏi định vị đối tượng chính xác, chẳng hạn như ảnh chụp từ trên không hoặc ảnh vệ tinh (Hướng dẫn về dataset).

  • Để huấn luyện model YOLO26n-obb bằng dataset tùy chỉnh, hãy làm theo ví dụ bên dưới bằng Python hoặc CLI:

    Ví dụ
    from ultralytics import YOLO
    
    # Tải model pretrained
    model = YOLO("yolo26n-obb.pt")
    
    # Huấn luyện model
    results = model.train(data="path/to/custom_dataset.yaml", epochs=100, imgsz=640)

    Để biết thêm các đối số huấn luyện, hãy xem mục Cấu hình.

  • Model YOLO26-OBB được huấn luyện trước trên các dataset như DOTAv1, nhưng bạn có thể dùng bất kỳ dataset nào được định dạng cho OBB. Thông tin chi tiết về định dạng dataset OBB có trong Hướng dẫn về dataset.

  • Để đánh giá model YOLO26n-obb, bạn có thể dùng các lệnh Python hoặc CLI như minh họa bên dưới:

    Ví dụ
    from ultralytics import YOLO
    
    # Tải model
    model = YOLO("yolo26n-obb.pt")
    
    # Xác thực model
    metrics = model.val(data="dota8.yaml")

    Xem thông tin chi tiết về quy trình đánh giá trong mục Val.

  • Có thể dễ dàng xuất model YOLO26-OBB sang định dạng ONNX bằng Python hoặc CLI:

    Ví dụ
    from ultralytics import YOLO
    
    # Tải model
    model = YOLO("yolo26n-obb.pt")
    
    # # Xuất model
    model.export(format="onnx")

    Để biết thêm định dạng xuất và thông tin chi tiết, hãy tham khảo trang Export.

Bình luận