已确认这是一个有效问题。
在 9.2.0-beta.2 分支的 commit 902202c68246f41b0efa06a3a3a849b426c5d372 上核对到,experimental/objdetect/roi_align_v2/README.md:14-17 和参数说明 48-64 将 features 定义为 [N,C,H,W],将 rois 定义为 [numRois,5],输出为 [numRois,C,pooled_height,pooled_width]。
但 InferShape 入口没有对这两个输入做 rank/坐标维校验。experimental/objdetect/roi_align_v2/op_host/roi_align_v2_infershape.cpp:39-44 直接读取 rois 第 0 维和 features 第 1 维:
const gert::Shape* features_shape = context->GetInputShape(0);
const gert::Shape* rois_shape = context->GetInputShape(1);
gert::Shape* output_shape = context->GetOutputShape(0);
uint32_t numRois = rois_shape->GetDim(0);
uint32_t channels = features_shape->GetDim(1);
后续同文件 60-64 直接据此设置 4D 输出,因此 features rank 不足或 rois 不是 [numRois,5] 时,也可能被静默推导为成功输出。
tiling 侧问题更直接。experimental/objdetect/roi_align_v2/op_host/roi_align_v2_tiling.cpp:65-73 未检查 GetInputShape 返回值,也未检查 storage shape rank,就读取固定维度:
auto features_shape = context->GetInputShape(0)->GetStorageShape();
auto rois_shape = context->GetInputShape(1)->GetStorageShape();
uint32_t batch = features_shape.GetDim(0);
uint32_t channels = features_shape.GetDim(1);
uint32_t height = features_shape.GetDim(2);
uint32_t width = features_shape.GetDim(3);
uint32_t numRois = rois_shape.GetDim(0);
uint32_t roiLength = rois_shape.GetDim(1);
因此非法 rank 下会继续生成 featureTotalSize、featureMapSize、roiLength、numRois 等 tiling 字段,与 README 中的输入契约不一致,并存在读取不存在维度的风险。当前仓库在该 commit 下 experimental/objdetect/roi_align_v2/tests/ut 只有 .gitkeep,没有看到已提交的 infer-shape/tiling 回归用例覆盖这些非法 rank 边界。
建议按缺陷处理:在 InferShape 和 tiling 入口统一补充 features.GetDimNum()==4、rois.GetDimNum()==2、rois.GetDim(1)==5 的校验;同时补充 features rank-2、rois rank-1、rois 第二维非 5、合法 [1,3,4,4]/[1,5] 对照用例,确保非法输入稳定返回 GRAPH_FAILED,不再读取不存在的维度或生成有效 tiling 数据。


您好,对应PR麻烦在编译前先本地解决precommit问题后重新提交编译。
precommit可以参考如下配置:precommit配置指南
修改后需要重新执行compile跑CI门禁


一、问题描述
在
cann/ops-cv的 commit902202c68246f41b0efa06a3a3a849b426c5d372中,experimental/objdetect/roi_align_v2/README.md明确要求features为[N,C,H,W]、rois为[numRois,5]。但是roi_align_v2_infershape.cpp只读取features的第 1 维和rois的第 0 维,roi_align_v2_tiling.cpp直接读取固定的0 至 3 维/0 至 1 维,两个入口均没有检查输入 rank。
因此 rank-2 的
features=[1,3]和 rank-1 的rois=[5]都被返回成功。tiling 对rank-2 feature 继续读取不存在的 H/W 维度,生成的
featureTotalSize、featureMapSize等字段在重复运行中变化,说明非法输入没有被拒绝且存在未定义维度读取。二、环境信息
cann/ops-cv/902202c68246f41b0efa06a3a3a849b426c5d372NPU 端到端结果
三、重现步骤
使用上述 commit 的
ops-cv源码,在已配置 CANN Toolkit 的环境执行:env ASCEND_INSTALL_PATH="${CANN_ROOT}/cann-9.1.0" \ bash build.sh --experimental --ophost_test --ops=roi_align_v2 \ --soc=ascend910b --noexec构建退出码为 0。
使用仓库 Host UT 上下文,设置
pooled_height=2、pooled_width=2、spatial_scale=1.0、sampling_ratio=1,分别运行以下输入:features=[1,3,4,4],rois=[1,5]features=[1,3],rois=[1,5]features=[1,3,4,4],rois=[5]对比 infer-shape 返回值和 tiling 的
blockDim/RoiAlignV2TilingData字段。四、预期结果
合法对照应返回
GRAPH_SUCCESS并生成[1,3,2,2]输出。违反 README 约束的features/rois rank 应返回明确的失败状态,不应生成 tiling 数据;至少不能读取输入
不存在的维度。
五、实际结果
GRAPH_SUCCESS、输出[1,3,2,2];tiling 返回成功、blockDim=1、featureTotalSize=48、featureMapSize=48、roiLength=5。features=[1,3]:infer-shape 返回GRAPH_SUCCESS、输出[1,3,2,2]。rois=[5]:infer-shape 返回GRAPH_SUCCESS、输出[5,3,2,2]。GRAPH_SUCCESS、blockDim=5,并生成numRois=5、roiLength=0。rank-2 feature 不存在的 H/W 被读取为非零值,featureTotalSize/featureMapSize/H/W 在重复运行中变化。日志摘要:
六、影响与规避方式
当上层 shape 校验未执行或 Host tiling 被直接调用时,非法输入会被静默接受,rank-1
ROI 会被错误解释为 5 个 ROI,rank-2 feature 会产生未定义的 H/W 和内核配置。建议
调用方暂时确保
features为 4D、rois为[numRois,5];实现侧应在 infer-shape和 tiling 入口统一校验 rank 与 ROI 坐标维,并返回明确错误。
七、建议的回归测试
保留合法
[1,3,4,4]/[1,5]对照,并新增featuresrank-2、roisrank-1、rois二维但第二维不是 5 的用例;非法用例在 infer-shape 和 tiling 阶段均应断言GRAPH_FAILED,不得读取不存在的维度或设置有效blockDim。