使用atc命令将pb格式的模型转om格式模型时报错
收藏回复举报
使用atc命令将pb格式的模型转om格式模型时报错
t('forum.solved') 已解决
新人帖
发表于2025-11-24 15:00:29
0 查看

canntoolkit版本是:8.3.RC1

tensorflow版本是:2.10.0

numpy版本是:1.23.5

protobuf版本是:3.20.1

onnx版本是:1.12.0

yolov7_frozen_graph.pb获取方式:

方法1:

获取yolov7源码,然后通过export.py导出yolov7.onnx模型,使用onnx-tf工具将onnx模型转成yolov7_saved_model.pb文件夹,然后使用下边命令将yolov7_saved_model.pb文件夹转成atc命令可以识别的冻结图模型:

import tensorflow as tf

saved_model_dir='yolov7_saved_model'
converter=tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)

frozen_func=converter.convert()
with open('yolov7_frozen_graph.pb','wb')as f:
    f.write(frozen_func)

方法2: 直接使用tensorflow生成yolov7_saved_model文件夹代码如下:

import tensorflow as tf
import numpy as np

def build_yolov7_tf_model():
    """构建TensorFlow版本的YOLOv7模型"""
    
    # 输入层
    inputs = tf.keras.Input(shape=(640, 640, 3), name='input')
    
    # 简化的YOLOv7骨干网络
    def conv_bn(x, filters, kernel_size, strides=1):
        x = tf.keras.layers.Conv2D(
            filters, kernel_size, strides=strides, 
            padding='same', use_bias=False
        )(x)
        x = tf.keras.layers.BatchNormalization()(x)
        x = tf.keras.layers.LeakyReLU(alpha=0.1)(x)
        return x
    
    # 骨干网络
    x = conv_bn(inputs, 32, 3, 1)
    x = conv_bn(x, 64, 3, 2)
    x = conv_bn(x, 32, 1, 1)
    x = conv_bn(x, 64, 3, 1)
    
    # 添加更多层...
    for filters in [128, 256, 512]:
        x = conv_bn(x, filters//2, 1, 1)
        x = conv_bn(x, filters, 3, 2)
    
    # 输出层 - 简化的检测头
    outputs = tf.keras.layers.Conv2D(
        255, 1, activation='sigmoid', name='output'
    )(x)
    
    # 创建模型
    model = tf.keras.Model(inputs=inputs, outputs=outputs, name='yolov7_tf')
    return model

def save_as_pb(model, save_dir='yolov7_saved_model'):
    """将模型保存为.pb格式"""
    
    # 使用SavedModel格式保存
    tf.saved_model.save(model, save_dir)
    
    # 验证保存的模型
    loaded_model = tf.saved_model.load(save_dir)
    
    print(f"模型已保存到: {save_dir}")
    print("模型包含的文件:")
    for file in os.listdir(save_dir):
        print(f"  - {file}")
    
    return save_dir

# 构建并保存模型
model = build_yolov7_tf_model()
model.summary()

# 保存为.pb格式
save_dir = save_as_pb(model)

将上述生成的yolov7_saved_model.pb文件夹转成atc命令可以识别的东截图模型:

import tensorflow as tf

saved_model_dir='yolov7_saved_model'
converter=tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)

frozen_func=converter.convert()
with open('yolov7_frozen_graph.pb','wb')as f:
    f.write(frozen_func)

最后使用atc命令将yolov7_frozen_graph.pb转om格式的时候报错如下:

atc --model=yolov7_frozen_graph.pb     --framework=3     --output=yolov7 --soc_version=Ascend310B1

报错如下:

ATC start working now, please wait for a moment.
...
ATC run failed, Please check the detail log, Try 'atc --help' for more information
[PID: 43381] 2025-11-24-14:14:32.667.714 Failure_to_Parse_File(E19005): Failed to parse file [yolov7_frozen_graph.pb].
        Solution: Check that a matched Protobuf version is installed and try again with a valid file. For details, see section "--framework" in ATC Instructions.
        TraceBack (most recent call last):
        ATC model parse ret fail.[FUNC:ParseGraph][FILE:omg.cc][LINE:803]

此问题该如何解决?

本帖最后由 匿名用户2025/11/24 15:00:56 编辑

我要发帖子