| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(nms): 对齐 BatchMultiClassNonMaxSuppression 和 SortedNMS 的旧 InferShape 协议 Co-authored-by: ConanHuang<huangxiaobin1@huawei.com> # message auto-generated for no-merge-commit merge: !1508 merge fix/nms-infershape-compat into master fix(nms): 对齐 BatchMultiClassNonMaxSuppression 和 SortedNMS 的旧 InferShape 协议 Created-by: ConanHuang Commit-by: ConanHuang Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> BatchMultiClassNonMaxSuppression 的原 InferShape 固定输出 boxes [B,M,4]、count [B],与旧融合内部 transpose_box=true 需要的 boxes [B,4,M]、count [B,8] 不一致。本次按 transpose_box 恢复对应推导,并同步调整 Ascend950 tiling 的 scores 轴解析及 kernel 的 scores 索引、输出步长和 count padding 清零。正常 false 输入的计算协议和 NMS 筛选算法保持不变。 同时对齐 Batch 旧 GE 的动态 Shape 推导:batch 来自 scores,存在未知维度时保守推导为未知,浮点输出 dtype 跟随 scores;SortedNMS 保留输出 [-1]、ShapeRange [0,N],移除推导阶段过强的 rank/已知上界限制。具体输入合法性仍由 tiling 检查。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/ops-cv/issues/888 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> - 950 release kernel:BatchMultiClassNMS 208/208、SortedNMS 278/278,执行、精度和越界检查均通过。 - 定向 GEIR:Batch 1 例 false、SortedNMS 3 例静态/动态图精度均通过。 - A2兼容性问题验证通过 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [x] 🐛 Bug修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-cv!1508 | 4 天前 | |
feat: 新增 ascend950 BatchMultiClassNonMaxSuppression 算子 Co-authored-by: Huang-Peng<huangpeng98@huawei.com> # message auto-generated for no-merge-commit merge: !1176 merge feat/ascend950-batch-multiclass-nms into master feat: 新增 ascend950 BatchMultiClassNonMaxSuppression 算子 Created-by: Huang-Peng Commit-by: Huang-Peng Merged-by: cann-robot Description: ## 描述 为 BatchMultiClassNonMaxSuppression 新增 Ascend 950(arch35)后端实现,代码位于 objdetect/batch_multi_class_non_max_suppression/。 该算子用于目标检测后处理:对每个 batch、每个类别独立执行贪心 NMS,再跨类别按分数合并,最多保留 max_total_size 个检测框。 ### 主要改动 - **算子定义与图模式入口**:补充 OpDef、shape/dtype 推导,以及算子目录内的 op_graph/batch_multi_class_non_max_suppression_proto.h;Ascend950 图模式通过该 proto 构图。 - **Ascend950 Tiling 与 Kernel**:实现 arch35 tiling、workspace 规划和 AICore kernel,支持按 (batch, class) 处理候选框、阈值过滤、IoU 抑制和跨类别 TopK 合并。 - **ACLNN 接口**:提供两段式 GetWorkspaceSize + Execute 接口,支持可选 clip_window、num_valid_boxes,并处理非连续 Tensor。 - **构建接入**:新增 CMake、Ascend950 binary JSON、simplified key 和 AscendC 配置。 - **测试资产与样例**:新增 host infershape UT、TTK inputs/golden、CPU golden,以及 ACLNN/GE IR 调用样例。 - **文档**:补充算子 README 和 ACLNN 接口文档;文档中包含完整 ACLNN 调用示例。 ### 接口范围 - 支持 ND 格式的 FLOAT16/FLOAT boxes、scores 和可选 clip_window;num_valid_boxes 为 INT32。 - transpose_box=false 时,boxes 为 [B,N,q,4];为 true 时为 [B,q,4,N]。scores 为 [B,N,C],其中 q 为 1 或 C。 - 输出为 nmsed_boxes[B,M,4]、nmsed_scores[B,M]、nmsed_classes[B,M] 和 nmsed_num[B],其中 M 为 max_total_size。 - iou_threshold 取值范围为 [0,1];max_size_per_class、max_total_size 取值范围为 [1,1000]。 ## 关联的Issue 关联Issue #681 ## 测试 - cmake --build build --target cust_opmaster --parallel 2:通过,已编译本算子的 Ascend950 tiling 源文件。 - git diff --check:通过。 - Host infershape UT:覆盖公共输出 shape 推导和非法 boxes rank 拒绝。 - TTK inputs/golden 与 CPU golden:覆盖 fp16/fp32、transpose_box、clip_window、num_valid_boxes 和 change_coordinate_frame 语义。 - ACLNN 与 GE IR 样例:分别覆盖两段式 ACLNN 调用和算子 proto 构图流程。 ## 文档更新 - 新增 objdetect/batch_multi_class_non_max_suppression/README.md。 - 新增 objdetect/batch_multi_class_non_max_suppression/docs/aclnnBatchMultiClassNonMaxSuppression.md,包含接口约束和完整 ACLNN 调用示例。 ## 类型标签 - [ ] 🐛 Bug修复 - [x] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [x] 🧪 测试 - [x] 📦 构建/CI - [x] 🔧 配置变更 - [x] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-cv!1176 | 1 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 4 天前 | ||
| 1 个月前 |