从ONNX转换后的OpenVINO输出键错误

问题描述

我已经将(修改后的)Darknet模型转换为onnx(尝试操作集10和11),然后使用documentation page

将此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.

当我尝试使用this (at the bottom)中提供的YOLO示例来加载此模型时,可以很好地加载,但是当我在调试模式下检查网络对象时,我看到的输出Transpose_231Transpose_237Slice_230/Split.1。 检查图层时,我看到它们包含Transpose_231Transpose_237Slice_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/SplitSlice_174/Split.1的同一件事才发生

解决方法

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

此Split操作将“数据” 输入张量沿“轴” 分成相同长度的片段。输出张量的第i个形状将等于“ data” 形状,除了沿尺寸“ axis” 的尺寸为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