已合并
feat: support BoundingboxEncode ascend950 #1049
zhangyiyi创建于 6月25日
feat: support BoundingboxEncode ascend950 #1049
已合并
zhangyiyi创建于 6月25日
zhangyiyi
zhangyiyi
6月25日

描述

本 MR 支持 bounding_box_encode 算子,适配 Ascend 950(arch35)平台。

算子功能

计算锚框(anchor box)与真实边界框(ground truth box)之间的编码偏移量,生成目标检测回归目标。计算公式(含 +1 偏移,与 canndev 内置定义一致):

pw = px2 - px1 + 1,  ph = py2 - py1 + 1
pcx = (px1 + px2) * 0.5,  pcy = (py1 + py2) * 0.5
dx = (gcx - pcx) / pw,  dy = (gcy - pcy) / ph
dw = ln(gw / pw),  dh = ln(gh / ph)
delta_i = (raw_i - means_i) / stds_i,  i ∈ {x, y, w, h}

代码结构(commit dabe4550)

层级 文件 说明
op_graph bounding_box_encode_proto.h IR 原型定义:2 INPUT(anchor_box, ground_truth_box) + 2 ATTR(means/stds ListFloat) + 1 OUTPUT(delats),支持 FP16/FP32/BF16,与 canndev nn_detect_ops.h 内置定义保持一致
op_host bounding_box_encode_def.cpp OpDef 注册:Input/Output/Attr 声明,AICore 配置 ascend950,DynamicCompileStatic + DynamicRank + DynamicShape
bounding_box_encode_infershape.cpp InferShape:输出 shape = 输入 shape(anchor_box shape 透传)
arch35/bounding_box_encode_tiling_arch35.cpp Tiling 函数:从 attrs->GetListFloat(0/1) 读取 means/stds 属性,计算 invStds 写入 TilingData;UB 容量感知的 ubFactor 计算 + MAX_DATACOPY_BLOCKLEN(65535) 双重约束防 blockLen 截断
op_kernel arch35/bounding_box_encode.h Kernel 实现:FP16/BF16 输入 Cast→FP32 中间计算→Cast 回原 dtype;Scalar-Vector 交叉流水(S_V/V_S 同步 + FetchEventID);CopyIn/Compute/CopyOut 三级流水 + UB 分块循环
arch35/bounding_box_encode_tiling_data.h TilingData 结构:dim0/blockFactor/ubFactor + means0-3/invStds0-3(8 个 float)
bounding_box_encode_apt.cpp Kernel 入口:2 input(anchorBox, groundTruthBox) + 1 output(delats),REGISTER_TILING_DEFAULT + GET_TILING_DATA_WITH_STRUCT
examples test_geir_bounding_box_encode.cpp GEIR 通路示例:SetAttr("means"/"stds") 设置属性
CMakeLists CMakeLists.txt 算子构建配置:SUPPORT_COMPUTE_UNIT=ascend950, TILING_DIR=arch35
docs README.md 算子说明:功能/支持产品/数据类型/参数/约束
docs/zh/op_list.md 仓级算子清单条目

接口定义(与 canndev 一致)

// IR 原型(与 canndev nn_detect_ops.h 一致)
REG_OP(BoundingBoxEncode)
    .INPUT(anchor_box, TensorType({DT_FLOAT16, DT_FLOAT}))
    .INPUT(ground_truth_box, TensorType({DT_FLOAT16, DT_FLOAT}))
    .OUTPUT(delats, TensorType({DT_FLOAT16, DT_FLOAT}))
    .ATTR(means, ListFloat, {0.0, 0.0, 0.0, 0.0})
    .ATTR(stds, ListFloat, {1.0, 1.0, 1.0, 1.0})
    .OP_END_FACTORY_REG(BoundingBoxEncode)

关键设计决策

  1. means/stds 使用 ATTR 而非 INPUT:与 canndev 内置定义保持一致,确保 GEIR 图模式通路兼容(避免 IR 兼容性检查冲突)
  2. DataCopyExtParams:Kernel 使用 uint32_t blockLen 的 DataCopyExtParams,配合 tiling 侧 MAX_DATACOPY_BLOCKLEN 约束,防止大 UB 场景下 blockLen 截断
  3. +1 偏移pw = px2 - px1 + 1,与 canndev tbe 实现一致,保证宽高至少为 1

关联的Issue

https://gitcode.com/cann/ops-cv/issues/583

测试

  • 冒烟: 23091
  • UT 编译验证bash build.sh -u --ops=bounding_box_encode --soc=ascend950 --noexec,全部 target 编译通过(cv_op_host_ut / cv_op_api_ut / cv_op_kernel_ut)
    • tiling UT:5 例(fp32/fp16/empty/n1)
    • infershape UT:4 例(fp32/fp16/empty)
    • aclnn UT:4 例(nullptr/dtype/shape/mismatch 参数校验)
    • kernel UT:3 例(golden 计算:默认参数/非零参数/退化框)
  • TTK 精度验证:44/44 用例全部通过(fp16/fp32 × 多种 shape),通过率 100%
  • GEIR 图模式验证test_geir_bounding_box_encode.cpp 执行 Session run ir compute graph success + Precision is ok

文档更新

  • 新增 objdetect/bounding_box_encode/README.md:算子说明文档
  • 更新 docs/zh/op_list.md:添加 bounding_box_encode 条目

类型标签

重点说明

为了对齐原cann版本tbe接口,其拼写错误delats不进行修复,保持与原版一致。

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 zhangyiyi 的贡献)
zhangyiyizhangyiyi
6月25日 创建了 pull request,commit 5651b9f5
CANN-robotCANN-robot成员
6月25日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
6月25日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here
You can get sig-info at here


PR Approval Progress

Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
*/*/README.md 陈娇, zhangzijie, 周奇龙 (3/2) 陈娇 (1/1)
*/*/op_graph/*_proto.h 汤磊, 周奇龙, zhangzijie (3/2) 汤磊 (1/1)
*/*/op_host/*_def.cpp zhangzijie, 周奇龙, 汤磊 (3/2) 汤磊 (1/1)
repo-cann/ops-cv zhangzijie, 周奇龙 (2/2) zhangzijie, 周奇龙 (2/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

ugzhangyiyi, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
zhangyiyizhangyiyi
6月25日 修改标题为 “feat: support BoundingboxEncode ascend950”,原标题为“support BoundingboxEncode ascend950”
atomgit-bot
atomgit-bot
6月25日 评论:

变更摘要

本 PR 为 Ascend 950(arch35)平台新增 BoundingBoxEncode 算子支持。该算子计算锚框与真实边界框之间的编码偏移量,用于目标检测的回归目标生成。整体实现遵循 CANN 算子开发规范,涵盖 IR 原型定义、OpDef 注册、InferShape、Tiling 策略以及 AICore 内核四个层次,支持 FP16/FP32/BF16 三种数据类型,并启用动态编译、动态 Rank 和动态 Shape 特性。

主要改动

  • 新增 IR 原型定义:在 bounding_box_encode_proto.h 中通过 REG_OP 注册 BoundingBoxEncode 算子,声明 anchor_boxground_truth_box 两个输入、delats 一个输出,以及 meansstds 两个 ListFloat 属性(默认值分别为 {0,0,0,0}{1,1,1,1}),支持 FP16/FP32/BF16。

  • 新增 OpDef 注册与 AICore 配置:在 bounding_box_encode_def.cpp 中实现 BoundingBoxEncode 的 OpDef 类,明确输入输出的数据类型、格式(FORMAT_ND)及 AutoContiguous 策略;为 ascend950 配置 DynamicCompileStaticDynamicRankSupportDynamicShapeSupport 等特性,并关联内核文件 bounding_box_encode_apt

  • 新增 Tiling 策略:在 bounding_box_encode_tiling_arch35.cpp 中实现 BoundingBoxEncodeTilingFunc,根据输入数据量、UB 大小和多核数量动态计算分块因子(blockFactor/ubFactor),从属性中读取 means/stds 并预计算其倒数(invStds)写入 BoundingBoxEncodeTilingData,完成多核调度配置。

  • 新增 AICore 内核实现:在 bounding_box_encode.h 中实现 BoundingBoxEncode<T> 模板类,包含 CopyIn/Compute/CopyOut/Process 四个核心方法,使用 AscendC 的 DataCopyExtParams 避免大数据拷贝时的截断问题;Compute 中完成编码公式计算(含 +1 偏移、对数运算及 (delta - mean) / std 归一化);通过 bounding_box_encode_apt.cpp 作为内核入口将模板实例化。

  • 新增 Tiling 数据结构与类型分发:在 bounding_box_encode_tiling_data.h 中定义 tiling 数据结构(含维度、分块因子、means 和 invStds);在 bounding_box_encode_tiling_key.h 中通过 ASCENDC_TPL_ARGS_DECL 声明 FP32/FP16/BF16 三种类型的模板参数分发。

  • 新增 InferShape 与测试用例bounding_box_encode_infershape.cpp 中将输出 shape 直接透传为输入 anchor_box 的 shape。同时提供了 aclnn 和 GEIR 两种推理方式的示例测试代码(通用版和 arch35 专版共 4 个文件)。

likedislike
此处折叠了216条消息 查看更多
zhangzijie成员
7月9日 评论:

/lgtm

likedislike
zhangzijie成员
7月9日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
7月9日 添加了label:lgtm
CANN-robotCANN-robot成员
7月9日 关闭了关联的issue
CANN-robotCANN-robot成员
7月9日 合入了pull request