rotated_object_detection.md 25 KB


comments: true

旋转目标检测产线使用教程

1. 旋转目标检测产线介绍

旋转目标检测是目标检测模块中的一种衍生,它专门针对旋转目标进行检测。旋转框(Rotated Bounding Boxes)常用于检测带有角度信息的矩形框,即矩形框的宽和高不再与图像坐标轴平行。相较于水平矩形框,旋转矩形框一般包括更少的背景信息。旋转目标检测在遥感等场景中有重要的应用。本产线同时提供了灵活的服务化部署方式,支持在多种硬件上使用多种编程语言调用。不仅如此,本产线也提供了二次开发的能力,您可以基于本产线在您自己的数据集上训练调优,训练后的模型也可以无缝集成。

旋转目标检测产线中包含了旋转目标检测模块,该模块都包含多个模型,您可以根据下方的基准测试数据选择使用的模型

如果您更注重模型的精度,请选择精度较高的模型;如果您更在意模型的推理速度,请选择推理速度较快的模型;如果您关注模型的存储大小,请选择存储体积较小的模型。

推理耗时仅包含模型推理耗时,不包含前后处理耗时。

图像旋转目标检测模块(可选):

模型模型下载链接 mAP(%) GPU推理耗时 (ms) GPU推理耗时(ms)
[常规模式 / 高性能模式]
模型存储大小(MB) 介绍
PP-YOLOE-R-L 推理模型/训练模型 78.14 67.50 / 61.15 414.79 / 414.79 211.0 PP-YOLOE-R是一个高效的单阶段Anchor-free旋转框检测模型。基于PP-YOLOE, PP-YOLOE-R以极少的参数量和计算量为代价,引入了一系列有用的设计来提升检测精度。

测试环境说明:

      <li><b>性能测试环境</b>
          <ul>
                       <li><strong>测试数据集:
             </strong>
                <a href="https://captain-whu.github.io/DOTA/">DOTA</a>验证集。
             </li>
              <li><strong>硬件配置:</strong>
                  <ul>
                      <li>GPU:NVIDIA Tesla T4</li>
                      <li>CPU:Intel Xeon Gold 6271C @ 2.60GHz</li>
                  </ul>
              </li>
              <li><strong>软件环境:</strong>
                  <ul>
                      <li>Ubuntu 20.04 / CUDA 11.8 / cuDNN 8.9 / TensorRT 8.6.1.6</li>
                      <li>paddlepaddle 3.0.0 / paddlex 3.0.3</li>
                  </ul>
              </li>
          </ul>
      </li>
      <li><b>推理模式说明</b></li>
    

    模式 GPU配置 CPU配置 加速技术组合
    常规模式 FP32精度 / 无TRT加速 FP32精度 / 8线程 PaddleInference
    高性能模式 选择先验精度类型和加速策略的最优组合 FP32精度 / 8线程 选择先验最优后端(Paddle/OpenVINO/TRT等)

    2. 快速开始

    2.1 本地体验

    ❗ 在本地使用旋转目标检测产线前,请确保您已经按照PaddleX本地安装教程完成了PaddleX的wheel包安装。如果您希望选择性安装依赖,请参考安装教程中的相关说明。该产线对应的依赖分组为 cv

    2.1.1 命令行方式体验

    • 一行命令即可快速体验旋转目标检测产线效果,使用 测试文件,并将 --input 替换为本地路径,进行预测

      paddlex --pipeline rotated_object_detection \
          --input rotated_object_detection_001.png \
          --threshold 0.5 \
          --save_path ./output \
          --device gpu:0 \
      

    相关的参数说明可以参考2.2.2 Python脚本方式集成中的参数说明。支持同时指定多个设备以进行并行推理,详情请参考 产线并行推理

    运行后,会将结果打印到终端上,结果如下:

    {'res': {'input_path': 'rotated_object_detection_001.png', 'page_index': None, 'boxes': [{'cls_id': 4, 'label': 'small-vehicle', 'score': 0.7409099340438843, 'coordinate': [92.88687, 763.1569, 85.163124, 749.5868, 116.07975, 731.99414, 123.8035, 745.5643]}, {'cls_id': 4, 'label': 'small-vehicle', 'score': 0.7393015623092651, 'coordinate': [348.2332, 177.55974, 332.77704, 150.24973, 345.2183, 143.21028, 360.67444, 170.5203]}, {'cls_id': 11, 'label': 'roundabout', 'score': 0.8101699948310852, 'coordinate': [537.1732, 695.5475, 204.4297, 612.9735, 286.71338, 281.48022, 619.4569, 364.05426]}]}}
    

    运行结果参数说明可以参考2.2.2 Python脚本方式集成中的结果解释。

    可视化结果保存在save_path下,其中旋转目标检测的可视化结果如下:

    2.1.2 Python脚本方式集成

    • 上述命令行是为了快速体验查看效果,一般来说,在项目中,往往需要通过代码集成,您可以通过几行代码即可完成产线的快速推理,推理代码如下:

      from paddlex import create_pipeline
      pipeline = create_pipeline(pipeline="rotated_object_detection")
      output = pipeline.predict(input="rotated_object_detection_001.png", threshold=0.5)
      for res in output:
      res.print()
      res.save_to_img(save_path="./output/")
      res.save_to_json(save_path="./output/")
      

    在上述 Python 脚本中,执行了如下几个步骤:

    (1)通过 create_pipeline() 实例化 旋转目标检测 产线对象,具体参数说明如下:

    参数 参数说明 参数类型 默认值
    pipeline 产线名称或是产线配置文件路径。如为产线名称,则必须为 PaddleX 所支持的产线。 str None
    config 产线具体的配置信息(如果和pipeline同时设置,优先级高于pipeline,且要求产线名和pipeline一致)。 dict[str, Any] None
    device 产线推理设备。支持指定GPU具体卡号,如“gpu:0”,其他硬件具体卡号,如“npu:0”,CPU如“cpu”。支持同时指定多个设备以进行并行推理,详情请参考产线并行推理文档。 str None
    use_hpip 是否启用高性能推理插件。如果为 None,则使用配置文件或 config 中的配置。 bool | None None
    hpi_config 高性能推理配置 dict | None None

    (2)调用 旋转目标检测 产线对象的 predict() 方法进行推理预测。该方法将返回一个 generator。以下是 predict() 方法的参数及其说明:

    参数 参数说明 参数类型 可选项 默认值
    input 待预测数据,支持多种输入类型,必填 Python Var|str|list
    • Python Var:如 numpy.ndarray 表示的图像数据
    • str:如图像文件或者PDF文件的本地路径:/root/data/img.jpg如URL链接,如图像文件或PDF文件的网络URL:示例如本地目录,该目录下需包含待预测图像,如本地路径:/root/data/(当前不支持目录中包含PDF文件的预测,PDF文件需要指定到具体文件路径)
    • List:列表元素需为上述类型数据,如[numpy.ndarray, numpy.ndarray][\"/root/data/img1.jpg\", \"/root/data/img2.jpg\"][\"/root/data1\", \"/root/data2\"]
    None
    threshold 低分object过滤阈值 None|float|dict[int, float]
    • None:如果设置为 None, 将默认使用产线初始化参数0.5, 即以0.5作为所有类别的低分object过滤阈值
    • float:任意大于0小于1的浮点数
    • dict[int, float]: key表示类别ID, value表示类别对应的阈值, 表示对不同类别使用不同的低分过滤阈值, 如{0:0.5, 1:0.35}表示对类别0和类别1分别使用0.5和0.35作为低分过滤阈值
    None

    (3)对预测结果进行处理,每个样本的预测结果均为对应的Result对象,且支持打印、保存为图片、保存为json文件的操作:

    方法 方法说明 参数 参数类型 参数说明 默认值
    print() 打印结果到终端 format_json bool 是否对输出内容进行使用 JSON 缩进格式化 True
    indent int 指定缩进级别,以美化输出的 JSON 数据,使其更具可读性,仅当 format_jsonTrue 时有效 4
    ensure_ascii bool 控制是否将非 ASCII 字符转义为 Unicode。设置为 True 时,所有非 ASCII 字符将被转义;False 则保留原始字符,仅当format_jsonTrue时有效 False
    save_to_json() 将结果保存为json格式的文件 save_path str 保存的文件路径,当为目录时,保存文件命名与输入文件类型命名一致
    indent int 指定缩进级别,以美化输出的 JSON 数据,使其更具可读性,仅当 format_jsonTrue 时有效 4
    ensure_ascii bool 控制是否将非 ASCII 字符转义为 Unicode。设置为 True 时,所有非 ASCII 字符将被转义;False 则保留原始字符,仅当format_jsonTrue时有效 False
    save_to_img() 将结果保存为图像格式的文件 save_path str 保存的文件路径,支持目录或文件路径
    • 调用print() 方法会将结果打印到终端,打印到终端的内容解释如下:

      • input_path: (str) 待预测图像的输入路径

      • page_index: (Union[int, None]) 如果输入是PDF文件,则表示当前是PDF的第几页,否则为 None

      • boxes: (list) 检测框信息,每个元素为一个字典,包含以下字段

        • cls_id: (int) 类别ID
        • label: (str) 类别名称
        • score: (float) 置信度
        • coordinates: (list) 检测框坐标,格式为[x1, y1, x2, y2, x3, y3, x4, y4]
    • 调用save_to_json() 方法会将上述内容保存到指定的save_path中,如果指定为目录,则保存的路径为save_path/{your_img_basename}_res.json,如果指定为文件,则直接保存到该文件中。由于json文件不支持保存numpy数组,因此会将其中的numpy.array类型转换为列表形式。

    • 调用save_to_img() 方法会将可视化结果保存到指定的save_path中,如果指定为目录,则保存的路径为save_path/{your_img_basename}_res.{your_img_extension},如果指定为文件,则直接保存到该文件中。

    • 此外,也支持通过属性获取带结果的可视化图像和预测结果,具体如下:

    属性 属性说明
    json 获取预测的 json 格式的结果
    img 获取格式为 dict 的可视化图像
    • json 属性获取的预测结果为dict类型的数据,相关内容与调用 save_to_json() 方法保存的内容一致。
    • img 属性返回的预测结果是一个字典类型的数据。其中,键为 res, 对应的值是一个 Image.Image 对象:一个用于显示 旋转目标检测 的预测结果。

    此外,您可以获取 旋转目标检测 产线配置文件,并加载配置文件进行预测。可执行如下命令将结果保存在 my_path 中:

    paddlex --get_pipeline_config rotated_object_detection --save_path ./my_path
    

    若您获取了配置文件,即可对旋转目标检测产线各项配置进行自定义,只需要修改 create_pipeline 方法中的 pipeline 参数值为产线配置文件路径即可。示例如下:

    from paddlex import create_pipeline
    
    pipeline = create_pipeline(pipeline="./my_path/rotated_object_detection.yaml")
    
    output = pipeline.predict(
        input="./rotated_object_detection_001.png",
        threshold=0.5,
    )
    for res in output:
        res.print()
        res.save_to_img("./output/")
        res.save_to_json("./output/")
    
    

    注: 配置文件中的参数为产线初始化参数,如果希望更改旋转目标检测产线初始化参数,可以直接修改配置文件中的参数,并加载配置文件进行预测。同时,CLI 预测也支持传入配置文件,--pipeline 指定配置文件的路径即可。

    3. 开发集成/部署

    如果产线可以达到您对产线推理速度和精度的要求,您可以直接进行开发集成/部署。

    若您需要将产线直接应用在您的Python项目中,可以参考 2.2 Python脚本方式中的示例代码。

    此外,PaddleX 也提供了其他三种部署方式,详细说明如下:

    🚀 高性能推理:在实际生产环境中,许多应用对部署策略的性能指标(尤其是响应速度)有着较严苛的标准,以确保系统的高效运行与用户体验的流畅性。为此,PaddleX 提供高性能推理插件,旨在对模型推理及前后处理进行深度性能优化,实现端到端流程的显著提速,详细的高性能推理流程请参考PaddleX高性能推理指南

    ☁️ 服务化部署:服务化部署是实际生产环境中常见的一种部署形式。通过将推理功能封装为服务,客户端可以通过网络请求来访问这些服务,以获取推理结果。PaddleX 支持多种产线服务化部署方案,详细的产线服务化部署流程请参考PaddleX服务化部署指南

    以下是基础服务化部署的API参考与多语言服务调用示例:

    API参考

    对于服务提供的主要操作:

    • HTTP请求方法为POST。
    • 请求体和响应体均为JSON数据(JSON对象)。
    • 当请求处理成功时,响应状态码为200,响应体的属性如下:
    名称 类型 含义
    logId string 请求的UUID。
    errorCode integer 错误码。固定为0
    errorMsg string 错误说明。固定为"Success"
    result object 操作结果。
    • 当请求处理未成功时,响应体的属性如下:
    名称 类型 含义
    logId string 请求的UUID。
    errorCode integer 错误码。与响应状态码相同。
    errorMsg string 错误说明。

    服务提供的主要操作如下:

    • infer

    对图像进行目标检测。

    POST /rotated-object-detection

    • 请求体的属性如下:
    名称 类型 含义 是否必填
    image string 服务器可访问的图像文件的URL或图像文件内容的Base64编码结果。
    threshold number | object | null 请参阅产线对象中 predict 方法的 threshold 参数相关说明。
    visualize boolean | null 是否返回可视化结果图以及处理过程中的中间图像等。
    • 传入 true:返回图像。
    • 传入 false:不返回图像。
    • 若请求体中未提供该参数或传入 null:遵循产线配置文件Serving.visualize 的设置。

    例如,在产线配置文件中添加如下字段:
    Serving:
      visualize: False
    
    将默认不返回图像,通过请求体中的visualize参数可以覆盖默认行为。如果请求体和配置文件中均未设置(或请求体传入null、配置文件中未设置),则默认返回图像。
    • 请求处理成功时,响应体的result具有如下属性:
    名称 类型 含义
    detectedObjects array 目标的位置、类别等信息。
    image string 目标检测结果图。图像为JPEG格式,使用Base64编码。

    detectedObjects中的每个元素为一个object,具有如下属性:

    名称 类型 含义
    bbox array 目标位置。数组中元素依次为边界框左上角x坐标、左上角y坐标、右下角x坐标以及右下角y坐标。
    categoryId integer 目标类别ID。
    categoryName string 目标类别名称。
    score number 目标得分。

    result示例如下:

    {
    "detectedObjects": [
    {
    "bbox": [
    92.88687133789062,
    763.1569213867188,
    85.16312408447266,
    749.5867919921875,
    116.07975006103516,
    731.994140625,
    123.80349731445312,
    745.5642700195312
    ],
    "categoryId": 0,
    "score": 0.7418514490127563
    },
    {
    "bbox": [
    348.2331848144531,
    177.5597381591797,
    332.77703857421875,
    150.24972534179688,
    345.2182922363281,
    143.2102813720703,
    360.6744384765625,
    170.52029418945312
    ],
    "categoryId": 1,
    "score": 0.7328268885612488
    }
    ],
    "image": "xxxxxx"
    }
    

    多语言调用服务示例

    Python

    
    import base64
    import requests

    API_URL = "http://localhost:8080/rotated-object-detection" # 服务URL image_path = "./demo.jpg" output_image_path = "./out.jpg"

    对本地图像进行Base64编码

    with open(image_path, "rb") as file:

    image_bytes = file.read()
    image_data = base64.b64encode(image_bytes).decode("ascii")
    

    payload = {"image": image_data} # Base64编码的文件内容或者图像URL

    调用API

    response = requests.post(API_URL, json=payload)

    处理接口返回数据

    assert response.status_code == 200 result = response.json()["result"] with open(output_image_path, "wb") as file:

    file.write(base64.b64decode(result["image"]))
    

    print(f"Output image saved at {output_image_path}") print("\nDetected objects:") print(result["detectedObjects"])


    📱 端侧部署:端侧部署是一种将计算和数据处理功能放在用户设备本身上的方式,设备可以直接处理数据,而不需要依赖远程的服务器。PaddleX 支持将模型部署在 Android 等端侧设备上,详细的端侧部署流程请参考PaddleX端侧部署指南。 您可以根据需要选择合适的方式部署模型产线,进而进行后续的 AI 应用集成。

    4. 二次开发

    如果旋转目标检测产线提供的默认模型权重在您的场景中,精度或速度不满意,您可以尝试利用您自己拥有的特定领域或应用场景的数据对现有模型进行进一步的微调,以提升旋转目标检测产线的在您的场景中的识别效果。

    4.1 模型微调

    由于旋转目标检测产线包含旋转目标检测模块,如果模型产线的效果不及预期,您可以对分割效果差的图片进行分析,并参考以下表格中对应的微调教程链接进行模型微调。

    情形 微调模块 微调参考链接
    预测结果不达预期 旋转目标检测模块 链接

    4.2 模型应用

    当您使用私有数据集完成微调训练后,可获得本地模型权重文件。

    若您需要使用微调后的模型权重,只需对产线配置文件做修改,将微调后模型权重的本地路径替换至产线配置文件中的对应位置即可:

    SubModules:
      RotatedObjectDetection:
        module_name: rotated_object_detection
        model_name: PP-YOLOE-R-L
        model_dir: null # 替换为微调后的旋转目标检测模型权重路径
        batch_size: 1
        threshold: 0.5
    

    随后, 参考本地体验中的命令行方式或 Python 脚本方式,加载修改后的产线配置文件即可。

    5. 多硬件支持

    PaddleX 支持英伟达 GPU、昆仑芯 XPU、昇腾 NPU和寒武纪 MLU 等多种主流硬件设备,仅需修改 --device参数即可完成不同硬件之间的无缝切换。

    例如,您使用昇腾 NPU 进行 旋转目标检测 产线的推理,使用的 CLI 命令为:

    paddlex --pipeline rotated_object_detection \
            --input rotated_object_detection_001.png \
            --threshold 0.5 \
            --save_path ./output \
            --device npu:0
    

    当然,您也可以在 Python 脚本中 create_pipeline() 时或者 predict() 时指定硬件设备。

    若您想在更多种类的硬件上使用旋转目标检测产线,请参考PaddleX多硬件使用指南