首页 > 解决方案 > 从 ONNX 转换后 OpenVINO 输出密钥错误

问题描述

我已经将(修改的)Darknet 模型转换为 onnx,(尝试过 opset 10 和 11),然后使用这个(在底部)将此 onnx 模型转换为 IR

一切似乎都还好

C:\Program Files (x86)\IntelSWTools\openvino_2020.3.194\deployment_tools\model_optimizer>python mo.py --input_model C:\dev\yolo\weights\export.onnx --progress --output_dir C:\dev\yolo\weights\
Model Optimizer arguments:
Common parameters:
        - Path to the Input Model:      C:\dev\yolo\weights\export.onnx
        - Path for generated IR:        C:\dev\yolo\weights\
        - IR output name:       export
        - Log level:    ERROR
        - Batch:        Not specified, inherited from the model
        - Input layers:         Not specified, inherited from the model
        - Output layers:        Not specified, inherited from the model
        - Input shapes:         Not specified, inherited from the model
        - Mean values:  Not specified
        - Scale values:         Not specified
        - Scale factor:         Not specified
        - Precision of IR:      FP32
        - Enable fusing:        True
        - Enable grouped convolutions fusing:   True
        - Move mean values to preprocess section:       False
        - Reverse input channels:       False
ONNX specific parameters:
Model Optimizer version:
Progress: [....................] 100.00% done
[ SUCCESS ] Generated IR version 10 model.
[ SUCCESS ] XML file: C:\dev\yolo\weights\export.xml
[ SUCCESS ] BIN file: C:\dev\yolo\weights\export.bin
[ SUCCESS ] Total execution time: 10.24 seconds.

当我尝试使用此处提供的 YOLO 示例加载此模型时,加载很好,但是当我在调试模式下检查网络对象时,我看到输出是 Transpose_231,Transpose_237Slice_230/Split.1. 当我检查图层时,我看到它包含Transpose_231,Transpose_237和(注意,在拆分Slice_230/Split中丢失了).1

这会导致样本KeyError: 'Slice_230/Split.1'失败

    for layer_name, out_blob in output.items():
        out_blob = out_blob.buffer.reshape(net.layers[net.layers[layer_name].parents[0]].out_data[0].shape)

如果我检查 IR 的 .XML 文件,我看不到任何.1内容

        <layer id="214" name="Slice_230/Split" type="VariadicSplit" version="opset1">
            <input>
                <port id="0">
                    <dim>6</dim>
                    <dim>142191</dim>
                </port>
                <port id="1"/>
                <port id="2">
                    <dim>3</dim>
                </port>
            </input>
            <output>
                <port id="3" precision="FP32">
                    <dim>4</dim>
                    <dim>142191</dim>
                </port>
                <port id="4" precision="FP32">
                    <dim>1</dim>
                    <dim>142191</dim>
                </port>
                <port id="5" precision="FP32">
                    <dim>1</dim>
                    <dim>142191</dim>
                </port>
            </output>
        </layer>

有什么建议.1吗?

编辑

尝试使用 opset 9,同样的事情只发生在Slice_174/Split&Slice_174/Split.1

标签: pythonopenvino

解决方案


split-1 实际上是数据移动操作的一个类别。它拆分操作将输入张量沿某个轴拆分为相同长度的片段。

此拆分操作将“数据”输入张量沿“轴”拆分为相同长度的片段。输出张量的第 i 个形状将等于“数据”形状,但沿维度“轴”的形状将是 data.shape[i]/num_splits。split_lengths 的元素之和必须匹配 data.shape[axis]。

示例之一:

<layer id="1" type="Split" ...>
    <data num_splits="3" />
    <input>
        <port id="0">       <!-- some data -->
            <dim>6</dim>
            <dim>12</dim>
            <dim>10</dim>
            <dim>24</dim>
        </port>
        <port id="1">       <!-- axis: 1 -->
        </port>
    </input>
    <output>
        <port id="2">
            <dim>6</dim>
            <dim>4</dim>
            <dim>10</dim>
            <dim>24</dim>
        </port>
        <port id="3">
            <dim>6</dim>
            <dim>4</dim>
            <dim>10</dim>
            <dim>24</dim>
        </port>
        <port id="4">
            <dim>6</dim>
            <dim>4</dim>
            <dim>10</dim>
            <dim>24</dim>
        </port>
    </output>
</layer>

您可以参考此处了解更多信息:https ://docs.openvinotoolkit.org/latest/openvino_docs_ops_movement_Split_1.html


推荐阅读