跳转至

YOLO11-OBB

1 概述

1.1 背景介绍

yolov11-obb是一种支持旋转框(Oriented Bounding Box)的实时目标检测模型,比普通YOLO模型更适合遥感、航拍、工业等倾斜目标场景。yolov11-obb官方有提供多种不同大小的检测模型:n、s、m、l、x, 这些开源模型的精度如下:

详情可参考yolov11-obb官方说明:

https://github.com/ultralytics/ultralytics/tree/v8.3.253

yolov11-obb开源模型下载地址如下:

1.2 使用说明

Linux SDK-alkaid中默认带了已经预先转换好的离线模型及板端示例, 相关文件路径如下:

  • 板端示例程序路径

    Linux_SDK/sdk/verify/opendla/source/detection/yolov11_obb
    
  • 板端离线模型路径

    Linux_SDK/project/board/${chip}/dla_file/ipu_open_models/detection/yolo11n_obb_640x640.img
    
  • 板端测试图像路径

    Linux_SDK/sdk/verify/opendla/source/resource/P0006.png
    

如果用户不需要转换模型可直接跳转至第3章节。

2 模型转换

2.1 onnx模型转换

  • python环境搭建

    $conda create -n yolov11-obb python==3.10
    $conda activate yolov11-obb
    $git clone https://github.com/ultralytics/ultralytics
    $cd ultralytics
    $pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple
    

    注意:这里提供的python环境搭建, 仅作为参考示例, 具体搭建过程请参考官方源码运行教程:

    https://docs.ultralytics.com/quickstart/
    
  • 模型测试

    • 编写模型测试脚本predict.py

      from ultralytics import YOLO
      
      # Load a model
      model = YOLO("yolo11n-obb.pt")  # load an official model
      
      # Predict with the model
      results = model("./ultralytics/assets/bus.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 box
      
    • 运行模型测试脚本, 确保yolov11环境配置正确。

      $python predict.py
      

    具体可参考yolov11-obb官方测试文档

    https://docs.ultralytics.com/zh/modes/predict
    
  • 模型导出

    • 编写模型转换脚本export.py:

      import os,sys
      sys.path.append(os.getcwd())
      from ultralytics import YOLO
      
      # Load a model
      model = YOLO("opendla/yolo11-obb/yolo11n-obb.pt")  # load an official model
      
      # Export the model
      model.export(format="onnx", imgsz=[640, 640], simplify=True, opset=13)
      
    • 运行模型转换脚本, 会在当目录下生成yolov11n-obb.onnx模型

      $python export.py
      

2.2 离线模型转换

2.2.1 预&后处理说明

  • 预处理

    转换成功的yolov11n-obb.onnx模型输入信息如下图所示, 要求输入图像的尺寸为 (1, 3, 640, 640), 此外需要将像素值归一化到 [0, 1] 范围内。

  • 后处理

    转换成功的yolov11n-obb.onnx模型输出信息如下图所示, 通常yolov11-obb转换出来的模型输出维度为(1, 20, 8400), 其中 8400 是候选框的数量, 20包括4个边界框坐标、1个置信度、1个角度和14个类别概率。获取到模型输出的候选框后, 需要对所有候选框的类别进行判断以及NMS非极大值抑制操作后才能输出正确的坐标框;最后结合角度信息对坐标框进行旋转校正,输出最终检测结果。

2.2.2 offline模型转换流程

注意:1)OpenDLAModel对应的是压缩包image-dev_model_convert.tar解压之后的smodel文件。2)转换命令需要在docker环境下运行, 请先根据Docker开发环境教程, 加载SGS Docker环境。

  • 拷贝onnx模型到转换代码目录

    $cp ultralytics/yolo11n-obb.onnx OpenDLAModel/detection/yolov11-obb/onnx
    
  • 转换命令

    $cd IPU_SDK_Release/docker
    $bash run_docker.sh
    #进入到docker环境下的OpenDLAModel目录
    $cd /work/SGS_XXX/OpenDLAModel
    $bash convert.sh -a detection/yolov11-obb -c config/detection_yolov11_obb.cfg -p SGS_IPU_Toolchain(绝对路径) -s false
    
  • 最终生成的模型地址

    output/${chip}_${时间}/detection_yolov11_obb.img
    output/${chip}_${时间}/detection_yolov11_obb_fixed.sim
    output/${chip}_${时间}/detection_yolov11_obb_float.sim
    

2.2.3 关键脚本参数解析

-   input_config.ini

        [INPUT_CONFIG]
        inputs = images;                #onnx 输入节点名称, 如果有多个需以“,”隔开;
        training_input_formats = RGB;   #模型训练时的输入格式, 通常都是RGB;
        input_formats = BGRA;           #板端输入格式, 可以根据情况选择BGRA或者YUV_NV12;
        quantizations = TRUE;           #打开输入量化, 不需要修改;
        mean_red = 0;                   #均值, 跟模型预处理相关, 根据实际情况配置;
        mean_green = 0;                 #均值, 跟模型预处理相关, 根据实际情况配置;
        mean_blue = 0;                  #均值, 跟模型预处理相关, 根据实际情况配置;
        std_value = 255;                #方差, 跟模型预处理相关, 根据实际情况配置;

        [OUTPUT_CONFIG]
        outputs = output0;              #onnx 输出节点名称, 如果有多个需以“,”隔开;
        dequantizations = TRUE;         #是否开启反量化, 根据实际需求填写, 建议为TRUE。设为False, 输出为int16; 设为True, 输出为float32

-   detection.cfg

        [DETECTION]
        CHIP_LIST=pcupid                        #平台名称, 必须和板端平台一致, 否则模型无法运行
        Model_LIST=yolo11n-obb                  #输入onnx模型名称
        INPUT_SIZE_LIST=640x640                 #模型输入分辨率
        INPUT_INI_LIST=input_config.ini         #配置文件
        CLASS_NUM_LIST=0                        #填0即可
        SAVE_NAME_LIST=yolo11n_obb_640x640.img  #输出模型名称
        QUANT_DATA_PATH=quant_data              #量化图片路径

2.3 模型仿真

  • 获取float/fixed/offline模型输出

    $bash convert.sh -a detection/yolov11-obb -c config/detection_yolov11_obb.cfg -p SGS_IPU_Toolchain(绝对路径) -s true
    

    执行上述命令后, 会默认将float模型的输出tensor保存到detection/yolov11-obb/log/output路径下的txt文件中。此外, 在detection/yolov11-obb/convert.sh脚本中也提供了fixedoffline的仿真示例, 用户在运行时可以通过打开注释代码块, 分别获取fixedoffline模型输出。

  • 模型精度对比

    在保证输入和上述模型相同的情况下, 进入2.1章节搭建好的环境, 在ultralytics/ultralytics/nn/modules/head.py文件的第238行处添加打印:

    print(torch.cat([x, angle], 1))
    

    获取pytorch模型对应节点的输出tensor, 进而和float、fixed、offline模型进行对比。此外需要特别注意的是, 原始模型的输出格式是NCHW, 而float/fixed/offline模型输出的格式是NHWC

3 板端部署

3.1 程序编译

示例程序编译之前需要先根据板子(nand/nor/emmc, ddr型号等)选择deconfig进行sdk整包编译, 具体可以参考alkaid sdk sigdoc《开发环境搭建》文档。

  • 编译板端yolov11-obb示例。

    $cd sdk/verify/opendla
    $make clean && make source/detection/yolov11_obb -j8
    
  • 最终生成的可执行文件地址

    sdk/verify/opendla/out/${AARCH}/app/prog_detection_yolov11_obb
    

3.2 运行文件

运行程序时, 需要先将以下几个文件拷贝到板端

  • prog_detection_yolov11_obb
  • P0006.png
  • yolo11n_obb_640x640.img

3.3 运行说明

  • Usage: ./prog_detection_yolov11_obb -i image -m model [-t threshold](执行文件使用命令)

  • Required Input:

    • image: 图像文件夹/单张图像路径
    • model: 需要测试的offline模型路径
  • Optional Input:

    • threshold: 检测阈值(0.0~1.0, 默认为0.5)
  • Typical output:

    >./prog_detection_yolov11_obb -i resource/P0006.png -m models/yolo11n_obb_640x640.img 
            inputs: resource/P0006.png
            model path: models/yolo11n_obb_640x640.img
            threshold: 0.500000
            found 1 images!
            [0] processing resource/P0006.png...
            fillbuffer processing...
            net input width: 640, net input height: 640
            model invoke time: 5.198000 ms
            Nms time: 102.053000 ms
            post process time: 114.497000 ms
            outImagePath: ./output/52382/P0006.png