rknn-toolkit onnx转rknn报错

本文介绍了一个从ONNX格式模型转换为RKNN格式过程中遇到的问题及可能的原因。作者尝试加载并转换一个deeplabv3模型,但在转换过程中遇到了关于模型版本和输入层属性的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码如下

from rknn.api import RKNN  
 
INPUT_SIZE = 64
 
if __name__ == '__main__':
    # 创建RKNN执行对象
    rknn = RKNN()
    # 配置模型输入,用于NPU对数据输入的预处理
    # channel_mean_value='0 0 0 255',那么模型推理时,将会对RGB数据做如下转换
    # (R - 0)/255, (G - 0)/255, (B - 0)/255。推理时,RKNN模型会自动做均值和归一化处理
    # reorder_channel=’0 1 2’用于指定是否调整图像通道顺序,设置成0 1 2即按输入的图像通道顺序不做调整
    # reorder_channel=’2 1 0’表示交换0和2通道,如果输入是RGB,将会被调整为BGR。如果是BGR将会被调整为RGB
    #图像通道顺序不做调整
    rknn.config(channel_mean_value='0 0 0 255', reorder_channel='0 1 2')
 
    # 加载TensorFlow模型
    # tf_pb='digital_gesture.pb'指定待转换的TensorFlow模型
    # inputs指定模型中的输入节点
    # outputs指定模型中输出节点
    # input_size_list指定模型输入的大小
    print('--> Loading model')
    # rknn.load_tensorflow(tf_pb='digital_gesture.pb',
    #                      inputs=['input_x'],
    #                      outputs=['probability'],
    #                      input_size_list=[[INPUT_SIZE, INPUT_SIZE, 3]])

    rknn.load_onnx("/home/roota/Desktop/AI/rknntools/deeplabv3model.pb.onnx")
    print('done')
 
    # 创建解析pb模型
    # do_quantization=False指定不进行量化
    # 量化会减小模型的体积和提升运算速度,但是会有精度的丢失
    print('--> Building model')
    rknn.build(do_quantization=False)
    print('done')
 
    # 导出保存rknn模型文件
    rknn.export_rknn('./digital_gesture.rknn')
 
    # Release RKNN Context
    rknn.release()

报错如下.

(rknntools) roota@ubuntu:~/Desktop/AI/rknntools/bin$ /home/roota/Desktop/AI/rknntools/bin/python3 /home/roota/Desktop/AI/rknntools/code/onnx2rknn.py
--> Loading model
/home/roota/Desktop/AI/rknntools/lib/python3.6/site-packages/onnx_tf/common/__init__.py:87: UserWarning: FrontendHandler.get_outputs_names is deprecated. It will be removed in future release.. Use node.outputs instead.
  warnings.warn(message)
E Catch exception when loading onnx model: /home/roota/Desktop/AI/rknntools/deeplabv3model.pb.onnx!
E Traceback (most recent call last):
E   File "rknn/api/rknn_base.py", line 556, in rknn.api.rknn_base.RKNNBase.load_onnx
E   File "rknn/base/RKNNlib/converter/convert_onnx.py", line 497, in rknn.base.RKNNlib.converter.convert_onnx.convert_onnx.__init__
E   File "rknn/base/RKNNlib/converter/convert_onnx.py", line 500, in rknn.base.RKNNlib.converter.convert_onnx.convert_onnx.__init__
E   File "/home/roota/Desktop/AI/rknntools/lib/python3.6/site-packages/onnx/checker.py", line 86, in check_model
E     C.check_model(model.SerializeToString())
E onnx.onnx_cpp2py_export.checker.ValidationError: Your model ir_version is higher than the checker's.
done
--> Building model
Traceback (most recent call last):
  File "/home/roota/Desktop/AI/rknntools/code/onnx2rknn.py", line 34, in <module>
    rknn.build(do_quantization=False)
  File "/home/roota/Desktop/AI/rknntools/lib/python3.6/site-packages/rknn/api/rknn.py", line 231, in build
    inputs = self.rknn_base.net.get_input_layers()
AttributeError: 'NoneType' object has no attribute 'get_input_layers'

这应该是没读取成功. 有可能是编码问题.
也有可能是onnx文件有问题.

另外rknn只能转换 jit 方式保存的pytorch模型,普通的权重pt文件是不能转换的。。。如何转换请参考rknntoolkit 下面的 pytorch 示例代码。

<think>好的,用户在使用我之前提供的RKNN换代码时遇到了错误,具体是关于mean_values的格式问题。我需要仔细分析错误原因,并给出正确的解决方案。首先,用户提供的错误信息是:“E config: Themean_values[[[0.1307]]]is invalidformat!”,这表明在配置mean_values参数时格式不正确。我之前在代码中将mean_values设置为[[[0.1307]]],可能是因为我参考了某些旧版本的RKNN Toolkit或者误解了参数格式要求。接下来,我需要查阅RKNN Toolkit1.6.0的官方文档,确认mean_values的正确格式。根据文档,mean_values应该是一个列表,每个元素对应输入通道的均值。例如,对于单通道输入,应该是[value]或者[[value]],而不是三层嵌套的列表。用户的三层嵌套导致格式错误。然后,我需要考虑用户的具体情况。用户处理的是MNIST模型,输入是单通道的灰度图像,训练时使用的Normalize参数是mean=0.1307,std=0.3081。因此,正确的mean_values应该调整为[[0.1307]],这样符合每个通道一个均值的格式要求。同样,std_values也应该调整为[[0.3081]]。此外,可能还需要检查其他参数是否符合RKNN Toolkit的最新版本要求,比如是否某些参数在1.6.0版本中已被弃用或修改。例如,quantized_dtype和float_dtype的设置是否正确,是否需要调整。同时,确保输入形状与模型预期一致,比如MNIST的输入是1x28x28,是否需要调整维度顺序。最后,需要验证修正后的代码是否能够正确运行,包括预处理参数的调整,以及可能的其他配置项。确保用户按照正确的步骤安装RKNN Toolkit,并且环境变量设置正确。可能还需要提醒用户检查ONNX模型的输入节点名称,确保与代码中的输入名称一致,避免其他潜在错误。</think>以下是对RKNN配置错误的详细分析及修正方案: ### 错误原因分析 ```python E config: The mean_values [[[0.1307]]] is invalid format! ``` 该错误是由于mean_values参数的三维嵌套格式不符合RKNN Toolkit 1.6.0的规范要求导致的。MNIST模型需要特定的预处理格式配置。 ### 修正后的配置代码 ```python # 修正后的预处理配置 rknn.config( mean_values=[[0.1307]], # 改为二维结构(对应通道维度) std_values=[[0.3081]], # 与训练时的Normalize参数保持一致 target_platform='rk3588', quantized_dtype='asymmetric_affine-u8', float_dtype='float16', batch_size=1 # 明确指定batch_size ) ``` **修正说明**: 1. **参数格式调整**: ```python # 错误格式 mean_values=[[[0.1307]]] # 三维数组 # 正确格式 mean_values=[[0.1307]] # 二维数组 ``` - RKNN 1.6.0要求mean/std参数格式为:[[channel_mean]](二维数组) - 每个内层数组对应一个输入源的通道参数 2. **通道维度适配**: ```python # MNIST输入形状(NCHW) input_shape = [1, 1, 28, 28] # 对应预处理参数结构 mean_values=[[0.1307]] # 第一个1对应输入源索引,第二个1对应通道数 ``` 3. **完整验证代码**: ```python def convert_to_rknn(): rknn = RKNN(verbose=True) try: # 新增输入形状验证 input_shape = [1, 1, 28, 28] if not os.path.exists(ONNX_MODEL): raise FileNotFoundError(...) # 修正后的配置 print('--> Config model') rknn.config( mean_values=[[0.1307]], # 正确格式 std_values=[[0.3081]], target_platform='rk3588', quantized_dtype='asymmetric_affine-u8', float_dtype='float16', batch_size=1 ) # 后续流程保持不变... ``` ### 错误验证流程 ```bash # 运行前检查 python -c "import numpy as np; print(np.array([[0.1307]]).shape)" # 应输出:(1, 1) # 验证换脚本 python minist_onnx_to_rknn.py # 预期输出: # --> Config model # Config done # --> Loading ONNX... ``` ### 常见错误排查表 | 错误现象 | 解决方案 | |---------|----------| | 输入形状不匹配 | 检查input_shape是否与ONNX模型一致 | | 预处理参数维度错误 | 使用np.array(mean_values).shape验证维度 | | 量化参数冲突 | 当do_quantization=False时移除dataset参数 | | 芯片平台不支持 | 确认target_platform参数是否拼写正确 |
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值