| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat: support BoundingboxEncode ascend950 Co-authored-by: ugzhangyiyi<zhangyiyi4@huawei.com> # message auto-generated for no-merge-commit merge: !1049 merge master into master feat: support BoundingboxEncode ascend950 Created-by: ugzhangyiyi Commit-by: ugzhangyiyi Merged-by: cann-robot Description: ## 描述 本 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 一致) cpp // 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 条目 ## 类型标签 - [ ] 🐛 Bug修复 - [x] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [x] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: ## 重点说明 为了对齐原cann版本tbe接口,**其拼写错误**delats不进行修复,保持与原版一致。 See merge request: cann/ops-cv!1049 | 1 个月前 |