更新历史
日期 版本 作者 更新内容
2024-12-20 v1.0 neucrack 支持 YOLO11/YOLOv8 OBB 模型并添加文档

简介

普通的检测中输出结果是一个矩形框,但是在一些场景中,目标物体的形状是旋转的,这时候就需要输出一个带旋转角度的矩形框,这种矩形框叫做OBB(Oriented Bounding Box)。

普通检测结果: x, y, w, h, 分别是 矩形框左上角或者中心点坐标,以及矩形宽高。
OBB 检测结果:x, y, w, h, angle, 多了一个旋转角度。

MaixPy MaixCAM 中使用带旋转角度的目标检测(OBB)

MaixPy 中移植了 YOLO11/YOLOv8 OBB 模型,可以快速方便地实现, 以下为例程,以MaixPy/examples中的nn_yolo11_obb.py为准:

from maix import camera, display, image, nn, app

detector = nn.YOLO11(model="/root/models/yolo11n_obb.mud", dual_buff = True)

cam = camera.Camera(detector.input_width(), detector.input_height(), detector.input_format())
disp = display.Display()

while not app.need_exit():
    img = cam.read()
    objs = detector.detect(img, conf_th = 0.5, iou_th = 0.45)
    for obj in objs:
        points = obj.get_obb_points()
        msg = f'{detector.labels[obj.class_id]}: {obj.score:.2f}, {obj.angle * 180:.1f}'
        img.draw_string(points[0], points[1] - 4, msg, color = image.COLOR_RED)
        detector.draw_pose(img, points, 8 if detector.input_width() > 480 else 4, image.COLOR_RED, close=True)
    disp.show(img)

可以看到这里使用YOLO11加载了obb模型,然后在检测到目标后,通过obj.angle获取到矩形旋转角度,objx,y,w,h属性是未旋转的矩形,通过get_obb_points获取到旋转后的矩形的四个顶点坐标,然后通过draw_pose绘制出目标的旋转矩形框,close参数表示将矩形框四个顶点连线起来。

默认的模型是 YOLO11 官方的15类模型,分类标签如下:

plane, ship, storage tank, baseball diamond, tennis court, basketball court, ground track field, harbor, bridge, large vehicle, small vehicle, helicopter, roundabout, soccer ball field, swimming pool

/root/models/yolo11n_obb.mud文件中也能看到。

更多输入分辨率

默认的输入图像分辨率是320x224,如果需要更高的分辨率,可以到MaixHub 模型库 下载,或者按照后文自定义模型。

MaixPy MaixCAM 自定义自己的OBB模型

电脑端使用模型

关于 YOLO11 官方的 OBB 模型介绍请看YOLO11 OBB
在这个文档中可以看到如何在电脑端使用obb模型,以及如何导出 ONNX 模型文件。

导出模型给 MaixCAM 使用

根据 YOLO11/YOLOv8 自定义模型 即可将 ONNX 模型转换为 MaixCAM 可以使用的 MUD 模型。
注意:转换时需要注意输出层的输出名不要弄错。

训练自己的 OBB 模型

根据YOLO11 官方训练文档 准备自己的数据集,然后进行训练即可。