yolov8支持OBB目标检测,且能提供较好的性能。
但是最近在使用yolov8-obb的过程中,发现yolov8-obb存在一个bug。即训练数据如果包含不带旋转角度的水平目标时,训练出的模型,经常会输出垂直的检测框,需要旋转90度以后才能得到最终结果。把yolov8-obb相关的源码阅读一遍才发现问题所在。
首先我们来看 yolov8-obb 如何将 [label, x1, y1, x2, y2, x3, y3, x4, y4] 格式的标注通过如下代码转换为 [cx, cy, w, h, rotation] 格式。
ultralytics-8.1.0\ultralytics\data\augment.py 的 Format 中,通过代码
if self.return_obb:
labels["bboxes"] = (xyxyxyxy2xywhr(torch.from_numpy(instances.segments)) if len(instances.segments) else torch.zeros((0, 5)))
ultralytics-8.1.0\ultralytics\utils\ops.py
def xyxyxyxy2xywhr(corners):
"""
Convert batched Oriented Bounding Boxes (OBB) from [xy1, xy2, xy3, xy4] to [xywh, rotation]. Rotation values are
expected in degrees from 0 to 90.
Args:
corners (numpy.ndarray | torch.Tensor): Input corners of shape (n, 8).
Returns:
(numpy.ndarray | torch.Tensor): Converted data in [cx, cy, w, h, rotation] format of shape (n, 5)