Page 1 of 1

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

Posted: 2024-04-19 16:07
by ezreal
通过下面的代码测试了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。也就是说,我输入不同的图片,输出(预测)的结果都是一模一样的。这和模拟推理的结果完全不一样。我也查看过模拟推理的输出结果,每次都是不一样的。
分类模型的输出全部是同一个结果,不知道是哪里出了问题?还请不吝赐教,非常感谢!

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

Posted: 2024-04-20 3:42
by Crocodile
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 测试源码给我,不希望公开的话我们也理解。

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

Posted: 2024-04-20 5:41
by ezreal
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这一步。现在已经正常了,感谢!