Phát hiện hộp giới hạn định hướng với Ultralytics YOLO#
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 🚢
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 OBB | Phá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.
| Model | kí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-obb | 1024 | 52.4 | 78.9 | 97.7 ± 0.9 | 2.8 ± 0.0 | 2.4 | 14.8 |
| YOLO26s-obb | 1024 | 54.8 | 80.9 | 218.0 ± 1.4 | 4.9 ± 0.1 | 9.8 | 56.7 |
| YOLO26m-obb | 1024 | 55.3 | 81.0 | 579.2 ± 3.8 | 10.2 ± 0.3 | 21.2 | 184.9 |
| YOLO26l-obb | 1024 | 56.2 | 81.6 | 735.6 ± 3.1 | 13.0 ± 0.2 | 25.6 | 232.4 |
| YOLO26x-obb | 1024 | 56.7 | 81.7 | 1485.7 ± 11.5 | 30.5 ± 0.9 | 57.6 | 520.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ằngyolo obb val data=DOTAv1.yaml device=0 split=test nms=Falsevà 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ằngyolo 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ó.
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.
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 y4Trong 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.
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à FNDự đoán#
Sử dụng model YOLO26n-obb đã train để chạy dự đoán trên ảnh.
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ộpXem 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ính | Kiểu | Hình dạng | Mô tả |
|---|---|---|---|
result.obb | OBB | (N) | BBox định hướng. |
result.obb.data | torch.float32 | (N,7/8) | BBox xoay thô kèm độ tin cậy/lớp. |
result.obb.xywhr | torch.float32 | (N,5) | BBox xoay xywhr. |
result.obb.xyxyxyxy | torch.float32 | (N,4,2) | Bốn điểm góc. |
result.obb.conf | torch.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.
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ố format | Model | Metadata | Đối số |
|---|---|---|---|---|
| PyTorch | - | yolo26n-obb.pt | ✅ | - |
| TorchScript | torchscript | yolo26n-obb.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n-obb.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n-obb_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n-obb.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n-obb.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| Apple Core AI | coreai | yolo26n-obb.aimodel | ✅ | imgsz, batch, quantize |
| TF SavedModel | saved_model | yolo26n-obb_saved_model/ | ✅ | imgsz, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n-obb.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n-obb_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| LiteRT | litert | yolo26n-obb.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| PaddlePaddle | paddle | yolo26n-obb_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n-obb.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n-obb_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n-obb_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n-obb_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n-obb_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n-obb_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n-obb_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n-obb_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| Hailo | hailo | yolo26n-obb_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou, device |
| Huawei Ascend | ascend | yolo26n-obb_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms, device |
| AMD Xilinx | xilinx | yolo26n-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.

