Phát hiện hộp bao định hướng với Ultralytics YOLO#
Phát hiện đối tượng định hướng tiến xa hơn một bước so với phát hiện đối tượng tiêu chuẩn bằng cách thêm một góc để xác định vị trí đối tượng chính xác hơn trong ảnh.
Đầu ra của một model phát hiện đối tượng định hướng là tập hợp các bounding box xoay bao quanh chính xác các đối tượng trong ảnh, cùng với nhãn lớp và điểm độ tin cậy cho từng box. Oriented bounding boxes đặc biệt hữu ích khi các đố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 các bounding box thẳng theo trục truyền thống có thể bao gồm phần nền không cần thiết.
Các model YOLO26 OBB sử dụng hậu tố -obb, tức là yolo26n-obb.pt, và được pretrained trên DOTAv1.
Watch: How to Detect & Track Objects with Ultralytics YOLO26 Oriented Bounding Boxes (OBB) | Ship Tracking 🚢
Mẫu trực quan#
| Phát hiện tàu bằng OBB | Phát hiện phương tiện bằng OBB |
|---|---|
![]() | ![]() |
Models#
Các model OBB YOLO26 pretrained được hiển thị ở đây; chúng được pretrained trên dataset DOTAv1.
Models được tự động tải xuống từ bản phát hành mới nhất của Ultralytics 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) | tham số (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 là kết quả multiscale với một model duy nhất trên dataset DOTAv1.
Tái hiện bằngyolo val obb data=DOTAv1.yaml device=0 split=test nms=Falsevà gửi kết quả đã gộp đến DOTA evaluation. - Tốc độ được tính trung bình trên các ảnh val của DOTAv1 bằng một instance Amazon EC2 P4d.
Tái hiện bằngyolo val obb data=DOTAv1.yaml batch=1 device=0|cpu nms=False - Params and FLOPs values are for fused models after Conv/BatchNorm folding and removal of the unused detection branch. Pretrained checkpoints retain the full training architecture and may show higher counts.
Xem bản xem trước YOLO27 chưa phát hành để biết các kết quả DOTAv1 sơ bộ.
Huấn luyện#
Train YOLO26n-obb trên dataset DOTA8 trong 100 epoch ở image size 640. Để xem danh sách đầy đủ các argument khả dụng, hãy xem trang Configuration.
Một OBB và phép xoay 180° của nó là giống hệt nhau, vì vậy phép xoay được xác định theo modulo 180° và box không có hướng. Các nhãn training được chuẩn hóa theo dạng cạnh dài: chiều rộng box 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 theo radian trong [-π/4, 3π/4) ([-45°, 135°)). Predictions không được chuẩn hóa, vì vậy một box được dự đoán có thể báo cáo cạnh ngắn là w; xem Results Output. Dạng [0°, 90°) là quy ước kiểu DOTA đã regularize và không được áp dụng trong training hoặc inference.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-obb.yaml") # build a new model from YAML
model = YOLO("yolo26n-obb.pt") # load a pretrained model (recommended for training)
model = YOLO("yolo26n-obb.yaml").load("yolo26n-obb.pt") # build from YAML and transfer weights
# Train the model
results = model.train(data="dota8.yaml", epochs=100, imgsz=640)Watch: How to Train Ultralytics YOLO-OBB (Oriented Bounding Boxes) Models on DOTA Dataset using Ultralytics Platform
Định dạng dataset#
Định dạng dataset OBB được trình bày chi tiết trong Dataset Guide. Định dạng YOLO OBB biểu diễn bounding box bằng bốn điểm góc có tọa độ được chuẩn hóa trong khoảng từ 0 đến 1, theo cấu trúc sau. Ultralytics Platform annotation hỗ trợ nhãn OBB bằng một công cụ vẽ oriented bounding box chuyên dụng:
class_index x1 y1 x2 y2 x3 y3 x4 y4Nội bộ, YOLO xử lý loss và output theo định dạng xywhr, biểu diễn điểm tâm (xy), chiều rộng, chiều cao và phép xoay của bounding box.
Val#
Đánh giá accuracy của model YOLO26n-obb đã train trên dataset DOTA8. Không cần argument vì model giữ lại data dùng trong training và các argument dưới dạng thuộc tính của model.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-obb.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Validate the model
metrics = model.val(data="dota8.yaml") # validate on the DOTA8 dataset
metrics.box.map # map50-95(B)
metrics.box.map50 # map50(B)
metrics.box.map75 # map75(B)
metrics.box.maps # a list containing mAP50-95(B) for each category
metrics.box.image_metrics # per-image metrics dictionary with precision, recall, F1, TP, FP, and FNPredict#
Sử dụng model YOLO26n-obb đã train để chạy predictions trên ảnh.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-obb.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Predict with the model
results = model("https://ultralytics.com/images/boats.jpg") # predict on an image
# Access the results
for result in results:
xywhr = result.obb.xywhr # center-x, center-y, width, height, angle (radians)
xyxyxyxy = result.obb.xyxyxyxy # polygon format with 4-points
names = [result.names[cls.item()] for cls in result.obb.cls.int()] # class name of each box
confs = result.obb.conf # confidence score of each boxWatch: How to Detect and Track Storage Tanks using Ultralytics YOLO-OBB | Oriented Bounding Boxes | DOTA
Xem đầy đủ chi tiết về mode predict trên trang Predict.
Output kết quả#
Phát hiện oriented bounding box trả về một object Results cho mỗi ảnh. Trường prediction chính là result.obb,
chứa các box xoay, class ID và điểm độ tin cậy cho từng đối tượng được phát hiện.
| Thuộc tính | Kiểu | Shape | Mô tả |
|---|---|---|---|
result.obb | OBB | (N) | Các box định hướng. |
result.obb.data | torch.float32 | (N,7/8) | Các box xoay thô cùng độ tin cậy/lớp. |
result.obb.xywhr | torch.float32 | (N,5) | Các box 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. |
Các nhãn được chuẩn hóa theo quy ước cạnh dài, nhưng predictions thì không; vì vậy result.obb.xywhr có thể báo cáo w nhỏ hơn h với phép 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. Hãy chuyển các góc trở lại khi code downstream 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ố box có thể dịch chuyển tuần hoàn thứ tự các góc:
from ultralytics.utils.ops import xyxyxyxy2xywhr
xywhr = xyxyxyxy2xywhr(result.obb.xyxyxyxy) # w >= h, rotation in [-pi/4, 3pi/4)Để xem các field Results dành riêng cho từng task trên mọi task, hãy xem phần Predict Results by Task.
Export#
Export model YOLO26n-obb sang một định dạng khác như ONNX, CoreML, v.v.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-obb.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom-trained model
# Export the model
model.export(format="onnx")Các định dạng export YOLO26-obb khả dụng được liệt kê trong bảng dưới đây. Bạn có thể export sang bất kỳ định dạng nào bằng argument format, tức là format='onnx' hoặc format='engine'. Bạn có thể trực tiếp predict hoặc validate trên các model đã export, tức là yolo predict model=yolo26n-obb.onnx. Các ví dụ sử dụng cho model của bạn sẽ được hiển thị sau khi hoàn tất export.
| Định dạng | Argument format | Model | Metadata | Arguments |
|---|---|---|---|---|
| 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 |
| TF SavedModel | saved_model | yolo26n-obb_saved_model/ | ✅ | imgsz, keras, 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 |
| 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 |
| LiteRT | litert | yolo26n-obb.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| Hailo | hailo | yolo26n-obb_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou |
| Huawei Ascend | ascend | yolo26n-obb_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms |
| Apple Core AI | coreai | yolo26n-obb.aimodel | ✅ | imgsz, batch, quantize |
nms=None mặc định sử dụng đầu ra thô cho NMS bên ngoài. Thiết lập nms=False để chọn phần đầu không có NMS khả dụng; các định dạng không được hỗ trợ sẽ quay lại đường dẫn đầu ra gốc của chúng. Các mục nms ở trên xác định các định dạng có thể nhúng NMS bằng nms=True.
Xem đầy đủ chi tiết về export trên trang Export.
Ứng dụng thực tế#
Phát hiện OBB với YOLO26 có nhiều ứng dụng thực tiễn trong nhiều ngành khác nhau:
- Hàng hải và quản lý cảng: Phát hiện tàu và thuyền ở nhiều góc khác nhau để quản lý đội tàu và giám sát.
- Quy hoạch đô thị: Phân tích các tòa nhà và cơ sở hạ tầng từ ảnh chụp trên không.
- Nông nghiệp: Giám sát mùa màng và thiết bị nông nghiệp từ cảnh quay bằng drone.
- Lĩnh vực năng lượng: Kiểm tra các tấm pin mặt trời và tua-bin gió ở nhiều hướng khác nhau.
- Giao thông vận tải: Theo dõi phương tiện trên đường và trong bãi đỗ xe từ nhiều góc nhìn khác nhau.
Các ứng dụng này hưởng lợi từ khả năng của OBB trong việc khớp chính xác với các đối tượng ở mọi góc, mang lại khả năng phát hiện chính xác hơn so với bounding box truyền thống.
FAQ#
Hộp giới hạn định hướng (OBB) bổ sung một góc để cải thiện độ chính xác định vị đối tượng trong ảnh. Không giống các hộp giới hạn thông thường, vốn là các hình chữ nhật căn theo trục, OBB có thể xoay để khớp tốt 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 yêu cầu xác định vị trí đố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 Dataset).
Để huấn luyện model YOLO26n-obb với dataset tùy chỉnh, hãy làm theo ví dụ dưới đây bằng Python hoặc CLI:
Ví dụfrom ultralytics import YOLO # Load a pretrained model model = YOLO("yolo26n-obb.pt") # Train the model results = model.train(data="path/to/custom_dataset.yaml", epochs=100, imgsz=640)Để biết thêm các tham số huấn luyện, hãy xem phần Cấu hình.
Các model YOLO26-OBB được pretrained trên những dataset như DOTAv1, nhưng bạn có thể sử dụng bất kỳ dataset nào được định dạng cho OBB. Thông tin chi tiết về các định dạng dataset OBB có trong Hướng dẫn Dataset.
Bạn có thể dễ dàng export model YOLO26-OBB sang định dạng ONNX bằng Python hoặc CLI:
Ví dụfrom ultralytics import YOLO # Load a model model = YOLO("yolo26n-obb.pt") # Export the model model.export(format="onnx")Để biết thêm các định dạng export và thông tin chi tiết, hãy tham khảo trang Export.
Để đánh giá model YOLO26n-obb, bạn có thể sử dụng các lệnh Python hoặc CLI như minh họa dưới đây:
Ví dụfrom ultralytics import YOLO # Load a model model = YOLO("yolo26n-obb.pt") # Validate the model metrics = model.val(data="dota8.yaml")Xem thông tin chi tiết về validation trong phần Val.

