| feat: support to_absolute_b_box(Ascend950/arch35) Co-authored-by: ugzhangyiyi<zhangyiyi4@huawei.com> # message auto-generated for no-merge-commit merge: !1126 merge to_absolute_b_box into master feat: support to_absolute_b_box(Ascend950/arch35) Created-by: ugzhangyiyi Commit-by: ugzhangyiyi Merged-by: cann-robot Description: ## 描述 新增目标检测后处理算子 **ToAbsoluteBBox**(Ascend 950PR/950DT,arch35 / DAV_3510)。 **功能**:将归一化边界框坐标(相对坐标,值域 [0, 1])按图像高宽转换为绝对像素坐标,常用于 Faster R-CNN、SSD、YOLO 等检测模型推理后处理阶段。bbox 的 4 个坐标分量 [ymin, xmin, ymax, xmax] 中,ymin/ymax 乘以图像高度 H、xmin/xmax 乘以图像宽度 W(H=shape_hw[1]、W=shape_hw[2],shape_hw 布局 [batch, H, W, C])。 **接口规格**(与 canndev nn_detect_ops.h 对齐): - 输入 normalized_boxes:FLOAT16/FLOAT,ND,3D - 输入 shape_hw:INT32,ND,shape 固定 (4,) - 可选属性 reversed_box:BOOL,默认 false,控制布局与坐标维位置 - 输出 y:dtype/shape 与 normalized_boxes 一致 **实现方法**: - **范式**:Elementwise 逐元素乘法(无 reduce / 无累加),CopyIn → Compute → CopyOut 三段流水 + double buffer。 - **两条 kernel 分支**(reversed_box):false(末轴交替 scale [H,W,H,W],Duplicate mask 逐 bit 构造);true(次轴分离 [H,H,W,W],按全局相位逐段 Muls)。 - **dtype 路线**:FLOAT16 直接在半精度下完成缩放,不做 FLOAT32 中转(逐元素乘误差可控)。 - **TilingKey 采用 def 驱动 dtype 模式**:dtype 维度由 op_def DataType 列表驱动(-DDTYPE_NORMALIZED_BOXES 宏注入),TilingKey 仅编码 reversed_box 一个算法维度,避免冗余 dtype 编码。 - 支持动态 shape(DynamicShapeSupportFlag(true))与动态 rank。 ## 关联的Issue https://gitcode.com/cann/ops-cv/issues/622 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> - **精度验收**:PyTorch L0+L1 全量用例真实 NPU 上板通过,精度满足商用双千双万(FLOAT32 双万分之一 / FLOAT16 双千分之一)标准,golden 以 CPU 为基准。 - **ST 测试**:L0 功能 / L1 功能 / L2 异常 + 白盒用例,覆盖 reversed_box 双分支、FLOAT16/FLOAT32、H/W=0 退化、边界值(0 与 1)等场景(上板 ≥200 条)。 - **双通路端到端**:torch 适配层 + GEIR 构图两条通路端到端验证通过。 - **图模式**:静态 shape [2,5,4] 与动态 shape [-1,-1,4](5 组不同 shape)真实 NPU 验证通过,确认 DynamicShapeSupportFlag 生效。 - **编译验证**:build.sh --ops=to_absolute_b_box --soc=ascend950 opkernel 编译通过,正确生成 FLOAT16/FLOAT32 两个 dtype 二进制。 - **代码检视**:全量代码检视 + 设计实现一致性检查通过;魔鬼数字命名化、内存资源成对释放(GE 资源早退路径补齐 GEFinalize)核查通过。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> - 新增算子 README.md(功能说明、参数表、约束、调用说明)。 - 新增 aclnn 接口文档 docs/aclnnToAbsoluteBBox.md(两段式接口原型、参数说明、错误码、调用示例)。 - 新增 docs/static_vs_dynamic_shape.md(静态/动态 shape GEIR 用例对比)与 docs/TEST.md(测试设计)。 - 更新 docs/zh/op_list.md 算子清单。 - 新增调用示例:examples/arch35/ 下 aclnn 调用、GEIR 静态/动态 shape 三份示例代码。 - 文档已通过 Markdown 格式规范性检查(UTF-8、标题层级、HTML 标签配对、代码块语言标记、产品名称枚举、中英文/数字无多余空格)。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug修复 - [x] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [x] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-cv!1126 | 21 天前 |