十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CANN ops-cv CheckValid 算子深度解析:候选框合法性校验的 GE 图模式调用与源码实现

CANN ops-cv CheckValid 算子深度解析:候选框合法性校验的 GE 图模式调用与源码实现 CANN ops-cv CheckValid 算子深度解析候选框合法性校验的 GE 图模式调用与源码实现【免费下载链接】ops-cv本项目是CANN提供的图像处理、目标检测相关的算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-cvCheckValid 是 CANN ops-cv 图像处理/目标检测算子库cann/ops-cv中服务于 FasterRcnn 等检测网络的定制算子用于逐框判断候选框坐标是否落在图像有效范围缩放后的有效边界之内输出 INT8 合法性掩码。本文以objdetect/check_valid目录下的算子文档为核心完整覆盖其产品支持情况、功能语义、输入输出参数、约束条件与 GE 图模式调用方法并结合算子原型注册、InferShape、Host 侧 Tiling 与 Kernel 侧实现源码深入剖析其工作原理与边界处理帮助读者在 Ascend 平台上正确接入并验证该算子。产品支持情况CheckValid 算子在当前仓库中的产品支持矩阵如下对应文档 objdetect/check_valid/README.md产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品√Atlas A2 训练系列产品/Atlas A2 推理系列产品√Atlas 200I/500 A2 推理产品×Atlas 推理系列产品×Atlas 训练系列产品×从 CMake 配置objdetect/check_valid/CMakeLists.txt可以看到该算子的SUPPORT_COMPUTE_UNIT为ascend950、SUPPORT_TILING_DIR为arch35与文档中Ascend 950 系列及 A3/A2 训练与推理产品支持、Atlas 200I/500 A2 推理产品不支持的结论一致。在接入前请先确认目标硬件平台避免在不支持的产品上调用。功能说明CheckValid 的功能是检查候选框是否在图像有效范围内。给定候选框bbox_tensor (x0, y0, x1, y1)与图像元信息img_metas (H, W, r)对每个候选框判断是否满足valid (x0 0) (y0 0) (x1 W * r - 1) (y1 H * r - 1)输入img_metas的前三个元素分别为图像高度H、宽度W和缩放比例rratio有效边界的计算方式为W * r - 1与H * r - 1即图像经比例r缩放后的有效宽度与有效高度输出valid_tensor为 INT8 类型1 表示合法、0 表示非法。这一逻辑与算子原型注释objdetect/check_valid/op_graph/check_valid_proto.h中的描述完全一致它是 FasterRcnn 的定制算子用于判断 anchor候选框是否位于图像内。在 Kernel 侧objdetect/check_valid/op_kernel/arch35/check_valid_kernel.h边界值在核函数入口处被解析并预计算为imgW W * r - 1.0fimgH H * r - 1.0f随后的逐元素比较x0 0、y0 0、x1 imgW、y1 imgH通过向量寄存器比较指令完成四个条件两两求与后得到最终合法性掩码与文档中的判定公式一一对应。参数说明CheckValid 算子共包含 2 个输入与 1 个输出全部采用 ND 数据格式参数明细如下完整继承自 objdetect/check_valid/README.md参数名输入/输出/属性描述数据类型数据格式bbox_tensor输入候选框坐标 (x0, y0, x1, y1)shape (N, 4)。FLOAT16、FLOATNDimg_metas输入图像元信息 (H, W, r)至少 3 个元素前 3 个有效。FLOAT16、FLOATNDvalid_tensor输出合法性掩码1 合法 / 0 非法shape (N, 1)。INT8ND其中N表示候选框数量末维固定为 4对应四个坐标分量 x0、y0、x1、y1。上述约束在算子定义中均有对应实现证据输入数据类型限定在 check_valid_def.cppbbox_tensor与img_metas均为{ge::DT_FLOAT16, ge::DT_FLOAT}输出为{ge::DT_INT8}格式均为FORMAT_ND算子原型注册check_valid_proto.h中REG_OP(CheckValid)声明的TensorType与上表完全一致并启用了动态 Shape、动态 Rank 支持DynamicRankSupportFlag(true)、DynamicShapeSupportFlag(true)。约束说明使用 CheckValid 算子时需要遵守以下约束bbox_tensor的 shape 必须为(N, 4)末维固定为 4即每个候选框必须完整提供 x0、y0、x1、y1 四个坐标bbox_tensor与img_metas的 dtype 必须一致支持 float16 / float32两输入不允许混用精度img_metas的元素数必须 ≥ 3前 3 个元素H、W、r有效多余元素被忽略输入仅支持 ND 数据格式不支持 NCHW / NHWC 等带布局的格式。约束 1、2 在 Tiling 侧有显式校验check_valid_tiling_host.cppComputePublicTiling会检查bbox_dtype必须为 FLOAT 或 FLOAT16、bbox_dtype与img_metas_dtype必须一致、格式必须均为 ND、bbox_rank必须为 2、bbox_cols必须为 4、img_metas_numel必须不小于 3任一条件不满足即返回CV_STATUS_FAILED。此外Shape 推导层check_valid_infershape.cpp也会对输入形状做强校验bbox_tensor必须为 2 维且第 1 维末维等于 4否则返回GRAPH_FAILED通过校验后输出 shape 推导为(N, 1)即输出行数与候选框数一致、每框一个合法/非法标志。调用说明GE 图模式CheckValid 算子支持通过GE 图模式调用即通过算子 IROperator IR构图方式构建计算图并提交给 GEGraph Engine执行文档给出的调用关系如下调用方式样例代码说明GE图模式test_geir_check_valid.cpp通过算子IR构图方式调用CheckValid算子样例程序的核心流程对应 examples/arch35/test_geir_check_valid.cpp如下初始化 GE调用ge::GEInitialize(global_options)其中配置{ge.exec.deviceId: 0, ge.graphRunMode: 1}构建计算图创建ge::Graph通过op::CheckValid(check_valid_1)构造算子节点用宏ADD_INPUT为bbox_tensorshape 取{2, 4}、img_metasshape 取{3}添加Data占位节点并生成全 2 输入数据用宏ADD_OUTPUT声明输出valid_tensorshape 为{2, 1}dtype 为DT_INT8构图与运行通过graph.SetInputs(inputs).SetOutputs(outputs)绑定图输入输出创建ge::Session调用session-AddGraph(graph_id, graph, graph_options)添加计算图再调用session-RunGraph(graph_id, input, output)执行结果落盘将输入输出数据分别写出为tc_ge_irrun_test_npu_input_*.bin与tc_ge_irrun_test_npu_output_*.bin二进制文件便于后续与 Golden 数据比对资源释放delete session后调用ge::GEFinalize()完成 GE 收尾并通过GEGetErrorMsgV2()/GEGetWarningMsgV2()打印错误与告警信息。样例中默认输入 dtype 为DT_FLOATFP32如改用 FP16 只需将inDtype替换为ge::DT_FLOAT16同时保持img_metas同 dtype 即可满足约束 2。源码实现原理算子原型与定义注册算子原型通过REG_OP(CheckValid)注册于 check_valid_proto.h定义了 2 个输入、1 个输出及各自允许的数据类型。Host 侧算子定义类ops::CheckValidcheck_valid_def.cpp则进一步细化输入输出均为ParamType(REQUIRED)必选参数AutoContiguous()开启OpAICoreConfig配置了DynamicCompileStaticFlag(true)、DynamicRankSupportFlag(true)、DynamicShapeSupportFlag(true)等动态化能力说明该算子支持动态 Shape/Rank 场景ExtendCfgInfo(opFile.value, check_valid_apt)关联 Kernel 侧算子入口文件check_valid_apt.cpp通过AICore().AddConfig(ascend950, aicoreConfig)绑定到 ascend950 计算单元与 CMake 中的SUPPORT_COMPUTE_UNIT ascend950呼应。Shape 推导InferShapeInferShape 回调 InferShapeForCheckValid 实现了输出 shape 推导与合法性校验常规场景校验bbox_tensor为 2 维且末维为 4输出 shape 置为(N, 1)空张量场景N 0时输出(0, 1)正常向下传播无需报错未知 Rank 场景当输入 shape 为未知维度UNKNOWN_DIM_NUM即 -2时输出退化为 1 维未知 shape交由后续动态解析处理非法输入rank 不为 2 或末维不为 4 时返回GRAPH_FAILED。该行为被单元测试 test_check_valid_infershape.cpp 覆盖包含 FP32/FP16 常规用例{8,4}→ 输出{8,1}、空张量用例{0,4}→ 输出{0,1}、大 N 用例{100000,4}→ 输出{100000,1}、以及 rank1、rank3、末维不为 4 三类失败用例和未知 rank 用例。Host 侧 TilingTiling 计算由 check_valid_tiling_host.cpp 完成分为公共校验与两条分支公共 TilingComputePublicTiling负责参数合法性校验并计算有效边界img_width_x W * r - 1、img_height_y H * r - 1正常分支ComputeBranch0Tiling当N 0时按可用 UB 空间ub_available均分 3 份并做 32 字节对齐确定每 tile 行数tile_nFP16 场景再做 16 行对齐、FP32 场景做 8 行对齐进而切分num_tiles并按可用核数available_cores将 tile 平均分配给各核tiles_main为基础分配数、cores_tail为多余 tile 数量空分支ComputeBranch1Tiling当N 0时直接产出tiling_key CV_KEY_EMPTY、block_dim 1的空任务配置核函数据此跳过全部计算。Tiling 结果以 CheckValidTilingData 结构体N、tile_n、num_tiles、num_cores、img_width_x、img_height_y 等字段传给核函数。Kernel 侧实现核函数 CheckValidKernel 的实现要点模板分派通过 check_valid_struct.h 中的ASCENDC_TPL_ARGS_DECL按 FP16 / FP32 两种模板参数实例化配合ISEMPTY模板参数区分空张量分支多核并行GetCoreRange依据num_cores、tiles_main、cores_tail计算当前核负责的 tile 区间实现核间负载均衡流水并行使用 3 个 VECCAL 缓冲区构成 2 级流水eid tileIdx % 2乒乓切换通过MTE2→V→MTE3事件标志WaitFlag/SetFlag同步搬运、计算与写出向量化比较CheckValidVF函数按向量长度FP32 下VL 64批量加载 x0/y0/x1/y1 四列数据FP16 输入先做DIST_UNPACK_B16解包并 Cast 到 FP32依次执行x0 0、y0 0、x1 imgW、y1 imgH四次比较两两求与后Select出 1.0 / 0.0最终 Cast 到 INT8 写出输出落位valid_tensor按行紧凑写出CopyOutTile与文档中(N, 1)的输出语义一致。整体来看CheckValid 是一个逻辑简单但工程完整的算子功能上仅做四条件逻辑与但在 GE 图模式调用、动态 Shape 支持、Host 侧 Tiling 切分、多核流水并行与向量化实现上都具备完整闭环并有对应单测test_check_valid_infershape.cpp、test_check_valid_tiling.cpp与 Golden 脚本golden.py佐证可作为了解 CANN 算子原型 → InferShape → Tiling → Kernel完整开发链路的一个良好参考样例。【免费下载链接】ops-cv本项目是CANN提供的图像处理、目标检测相关的算子库实现网络在NPU上加速计算。项目地址: https://gitcode.com/cann/ops-cv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表