分类模型的输出全部是同一个结果

  • Crocodile wrote: 2024-04-20 3:38
    ezreal wrote: 2024-04-19 16:07 通过下面的代码测试了torch保存的.pth模型、.onnx、.rknn等三种模型在测试集上的分类准确率:

    Code: Select all

    
            class RKNNonSimulator:
                def __init__(self, onnx_path):
                    # Create RKNN object
                    rknn = RKNN(verbose=False)
                    # Pre-process config
                    rknn.config(mean_values=infer_mean, std_values=infer_std, target_platform='rv1103')
                    # Load model
                    print('--> Loading model')
                    ret = rknn.load_onnx(model=onnx_path)
    
                    self.rknn_path = onnx_path.replace('.onnx', '.rknn')
    
                    # Build model
                    DATASET_PATH = "test_list_wo_labels.txt"
                    ret = rknn.build(do_quantization='i8', dataset=DATASET_PATH)
    
                    print('--> Init runtime environment')
                    ret = rknn.init_runtime()
    
                    self.rknn = rknn
    
                def __call__(self, data, *args, **kwargs):
                    # data = data.squeeze(axis=1)
                    # data = data[..., None]
                    outputs = self.rknn.inference(inputs=[data], data_format=['nchw'])
                    return outputs[0]
    
                def export(self):
                    # Export rknn model
                    print('--> Export rknn model')
                    ret = self.rknn.export_rknn(self.rknn_path)
                    if ret != 0:
                        print('Export rknn model failed!')
                        exit(ret)
                    print('done')
    
                def byebye(self):
                    # Release
                    self.rknn.release()
    
    软件模拟的推理精度如下:
    The test acc is 93.320%
    The test acc of ONNX is 93.320%
    The test acc of RKNN is 92.105%
    看起来是正常的。但是当我使用下面的代码,
    Snipaste_2024-04-20_00-06-05.jpg

    把rknn模型部署到MINI B板子上,我测试了三张不同的图片,包括一张全黑、全白、混合,
    Snipaste_2024-04-20_00-03-39.jpg

    运行日志如下:
    # /data/RKNN/rknn_cls_demo /root/model.rknn /root/255.png
    model input num: 1, output num: 1
    input tensors:
    index=0, name=input, n_dims=4, dims=[1, 800, 800, 1], n_elems=640000, size=640000, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=-128, scale=1.000000
    output tensors:
    index=0, name=output, n_dims=2, dims=[1, 2, 0, 0], n_elems=2, size=2, fmt=UNDEFINED, type=INT8, qnt_type=AFFINE, zp=9, scale=0.038287
    input_attrs[0].size_with_stride=640000
    model is NHWC input fmt
    model input height=800, width=800, channel=1
    load image wxhxc=800x800x1 path=/root/255.png
    >>> Min value of input: 255.000000
    >>> Max value of input: 255.000000
    rknn_run...
    RKNN_TENSOR_INT8
    Original array:
    99 -87
    softmax with num_classes 2...
    get_topk_with_indices...
    inference done...
    Predictions:
    Class: 0, Score: 0.9992
    Class: 1, Score: 0.0008
    其中,Original array是模型输出的量化结果。

    问题出在,我输入了另外一种图片,结果完全一模一样,同样再次输出Original array是99 -87。也就是说,我输入不同的图片,输出(预测)的结果都是一模一样的。这和模拟推理的结果完全不一样。我也查看过模拟推理的输出结果,每次都是不一样的。
    分类模型的输出全部是同一个结果,不知道是哪里出了问题?还请不吝赐教,非常感谢!

    您好,目前根据您提供的信息我比较难判断问题在哪里,模型在转换前后的测试集结果可以排除模型训练的问题,不考虑输出结果反量化,激活函数和归一化处理等处理,核心问题就是 Rknn 输出结果没有变化,我觉得如果模拟推理阶段如果操作正确的话可能和图像的预处理有关,不清楚初始推理环境下的模型有没有做相关的输入预处理比如均值或者归一化。
    如果方便的话可以提供相应的rknn部署源码、模型权重文件(onnx 和 rknn)和 pytorch 测试源码给我,不希望公开的话我们也理解。
  • Crocodile wrote: 2024-04-20 3:42
    Crocodile wrote: 2024-04-20 3:38
    ezreal wrote: 2024-04-19 16:07 通过下面的代码测试了torch保存的.pth模型、.onnx、.rknn等三种模型在测试集上的分类准确率:

    Code: Select all

    
            class RKNNonSimulator:
                def __init__(self, onnx_path):
                    # Create RKNN object
                    rknn = RKNN(verbose=False)
                    # Pre-process config
                    rknn.config(mean_values=infer_mean, std_values=infer_std, target_platform='rv1103')
                    # Load model
                    print('--> Loading model')
                    ret = rknn.load_onnx(model=onnx_path)
    
                    self.rknn_path = onnx_path.replace('.onnx', '.rknn')
    
                    # Build model
                    DATASET_PATH = "test_list_wo_labels.txt"
                    ret = rknn.build(do_quantization='i8', dataset=DATASET_PATH)
    
                    print('--> Init runtime environment')
                    ret = rknn.init_runtime()
    
                    self.rknn = rknn
    
                def __call__(self, data, *args, **kwargs):
                    # data = data.squeeze(axis=1)
                    # data = data[..., None]
                    outputs = self.rknn.inference(inputs=[data], data_format=['nchw'])
                    return outputs[0]
    
                def export(self):
                    # Export rknn model
                    print('--> Export rknn model')
                    ret = self.rknn.export_rknn(self.rknn_path)
                    if ret != 0:
                        print('Export rknn model failed!')
                        exit(ret)
                    print('done')
    
                def byebye(self):
                    # Release
                    self.rknn.release()
    
    软件模拟的推理精度如下:

    看起来是正常的。但是当我使用下面的代码,
    Snipaste_2024-04-20_00-06-05.jpg

    把rknn模型部署到MINI B板子上,我测试了三张不同的图片,包括一张全黑、全白、混合,
    Snipaste_2024-04-20_00-03-39.jpg

    运行日志如下:


    其中,Original array是模型输出的量化结果。

    问题出在,我输入了另外一种图片,结果完全一模一样,同样再次输出Original array是99 -87。也就是说,我输入不同的图片,输出(预测)的结果都是一模一样的。这和模拟推理的结果完全不一样。我也查看过模拟推理的输出结果,每次都是不一样的。
    分类模型的输出全部是同一个结果,不知道是哪里出了问题?还请不吝赐教,非常感谢!

    您好,目前根据您提供的信息我比较难判断问题在哪里,模型在转换前后的测试集结果可以排除模型训练的问题,不考虑输出结果反量化,激活函数和归一化处理等处理,核心问题就是 Rknn 输出结果没有变化,我觉得如果模拟推理阶段如果操作正确的话可能和图像的预处理有关,不清楚初始推理环境下的模型有没有做相关的输入预处理比如均值或者归一化。
    如果方便的话可以提供相应的rknn部署源码、模型权重文件(onnx 和 rknn)和 pytorch 测试源码给我,不希望公开的话我们也理解。
    您好!在您的提醒下,我检查了图像的预处理函数,发现少了convert_image这一步。现在已经正常了,感谢!
    Last edited by ezreal on 2024-04-21 4:11, edited 1 time in total.