Ошибка ключа вывода OpenVINO после преобразования из ONNX

#python #openvino

#python #openvino

Вопрос:

Я преобразовал (модифицированную) модель Darknet в onnx (попробовал opset 10 и 11), а затем преобразовал эту модель onnx в IR, используя это (внизу)

Кажется, все в порядке

 C:Program Files (x86)IntelSWToolsopenvino_2020.3.194deployment_toolsmodel_optimizer>python mo.py --input_model C:devyoloweightsexport.onnx --progress --output_dir C:devyoloweights
Model Optimizer arguments:
Common parameters:
        - Path to the Input Model:      C:devyoloweightsexport.onnx
        - Path for generated IR:        C:devyoloweights
        - 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:devyoloweightsexport.xml
[ SUCCESS ] BIN file: C:devyoloweightsexport.bin
[ SUCCESS ] Total execution time: 10.24 seconds.
  

Когда я пытаюсь загрузить эту модель, используя предоставленный пример YOLO отсюда, загрузка идет нормально, но когда я проверяю сетевой объект в режиме отладки, я вижу, что выходные
Transpose_231 данные, Transpose_237 и Slice_230/Split.1 .
Когда я проверяю слои, я вижу, что он содержит Transpose_231 , Transpose_237 и Slice_230/Split (обратите внимание, отсутствует .1 в разделении)

Это приводит к сбою выборки с KeyError: 'Slice_230/Split.1' in

     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 amp; Slice_174/Split.1

Ответ №1:

Разделение-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