AIMO转换yolo26n出错

用ONNX转换的,日志如下,请帮忙看看。

2026-04-12 17:18:29,081 - INFO : [COMPILE-QNN] Compile model is done. Begin to create serialization file. 2026-04-12 17:18:29,954 - ERROR : 302.2ms [ ERROR ] QnnBackend_validateOpConfig failed 3110 302.2ms [ ERROR ] Failed to validate op _model_23_Mod with error 0xc26 [ ERROR ] QnnModel::addNode() validating node _model_23_Mod failed. [ ERROR ] model.addNode(QNN_OPCONFIG_VERSION_1, “_model_23_Mod”, “qti.aisw”, “ElementWiseBinary”, params__model_23_Mod, 1, inputs__model_23_Mod, 2, outputs__model_23_Mod, 1 ) expected MODEL_NO_ERROR, got MODEL_GRAPH_OP_VALIDATION_ERROR [ ERROR ] addNode__model_23_Mod(yolo26n_qcs6490) expected MODEL_NO_ERROR, got MODEL_GRAPH_OP_VALIDATION_ERROR 302.4ms [ ERROR ] Failed in composeGraphs() 302.4ms [ ERROR ] ComposeGraphs Failed with error = 1

我今天遇到了一样的问题,已解决,希望我的经验能有帮助

报错的原因是YOLO后处理部分的Mod(取余)算子没有被QNN推理引擎支持,编译器没法转换
模型仓库里官方的做法是把YOLO26切成了主干模型和一个小的后处理模型,主干的稠密计算部分编译到QNN推理引擎上加速、后处理部分留在CPU上跑。对于yolo26s的话,切分的位置如图

所以我们也只需要把YOLO模型这样切成两部分,只把主干模型扔进AIMO那里转换就行了
这是我拆分模型时用的python脚本

import onnx

def split_yolo_model(input_model_path, split_node_name):

# 1. 加载原始模型

model = onnx.load(input_model_path)

# 2. 找到分割节点的输入和输出 Tensor 名

# 这一步很关键:我们需要拿到那个“断点”处的 Tensor 名称

split_input_tensors =

for node in model.graph.node:

if node.name == split_node_name:

split_input_tensors = node.input # 这是前段的输出,后段的输入

break

if not split_input_tensors:

print(f":cross_mark: 找不到节点: {split_node_name}")

return

# 假设分界点只有一个输入 Tensor (通常是这种情况)

boundary_tensor = split_input_tensors[0]

# 获取原始模型的总输入和总输出名称

original_inputs = [i.name for i in model.graph.input]

original_outputs = [o.name for o in model.graph.output]

# 3. 拆分前半部分:model.onnx

# 输入:原模型输入;输出:断点 Tensor

onnx.utils.extract_model(

input_model_path, “model.onnx”, original_inputs, [boundary_tensor]

)

# 4. 拆分后半部分:post_process.onnx

# 输入:断点 Tensor;输出:原模型输出

onnx.utils.extract_model(

input_model_path, “post_process.onnx”, [boundary_tensor], original_outputs

)

print(“:white_check_mark: 拆分完成:”)

print(f"- 前半部分: model.onnx (输出为 {boundary_tensor})")

print(f"- 后半部分: post_process.onnx (输入为 {boundary_tensor})")

if _name_ == “_main_”:

# 使用你生成的固化尺寸后的 onnx 文件

split_yolo_model(“best.onnx”, “/model.23/Split”)

(不过yolo26n的节点名可能不太一样,可能需要你自己看了)
希望能帮到你!

1 个赞