- 量化代码:
- rknn.config(mean_values=None, std_values=None, target_platform="rk3588",
- quantized_algorithm="mmse",
- quantized_method='channel',
- optimization_level=3)
- ret = rknn.load_onnx(model=ONNX_MODEL,
- input_size_list=[[3, 127, 127], [3, 255, 255]])
- ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET)
- ret = rknn.export_rknn(RKNN_MODEL)
复制代码
4. 该模型输入为FP16数据,输入数据分布为NHWC,但是没有进行量化- <font color="#ff00ff">query输出:</font>
- index=0, name=input_z, n_dims=4, dims=[1, 127, 127, 3], n_elems=48387, size=96774, fmt=NHWC, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000
- index=1, name=input_x, n_dims=4, dims=[1, 255, 255, 3], n_elems=195075, size=390150, fmt=NHWC, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000
复制代码
5. 也就是说,我只需要将输入改为FP16即可,这里为了方便对比,我把pass_through=0时的代码也放出来- v3_input[i].index = i;
- v3_input[i].type = RKNN_TENSOR_UINT8;
- v3_input[i].size = width_v3[i] * height_v3[i] * channel_v3[i] * sizeof(uint8_t);
- v3_input[i].fmt = RKNN_TENSOR_NHWC;
- v3_input[i].pass_through = 0;
- v3_input[1].buf = (void*)x_crop.data; // x_crop和z_mat是imread读取的CV_8UC3数据,未作处理
- v3_input[0].buf = (void*)z_mat.data;
- rknn_inputs_set(v3_ctx, v3_io_num.n_input, v3_input);
复制代码
pass_through = 1:- v3_input[i].index = i;
- v3_input[i].type = RKNN_TENSOR_FLOAT16;
- v3_input[i].size = width_v3[i] * height_v3[i] * channel_v3[i] * sizeof(float16_t);
- v3_input[i].fmt = RKNN_TENSOR_NHWC;
- v3_input[i].pass_through = 1;
- x_crop.convertTo(x_crop, CV_16FC3, 1.0); // 多了类型转换
- z_mat.convertTo(z_mat, CV_16FC3, 1.0);
- v3_input[1].buf = (void*)x_crop.data; // x_crop和z_mat是imread读取的CV_8UC3数据,未作处理
- v3_input[0].buf = (void*)z_mat.data;
- rknn_inputs_set(v3_ctx, v3_io_num.n_input, v3_input);
复制代码
- 26.7188 31.6562 36.5 43.0312 50.7812 53.0312 43.1875 41.6875 43.6875 // pass_through = 0
- 27.6094 34.0312 39.625 44.3125 44.75 47.0625 47.7188 49.125 49.8125 // pass_through = 1
复制代码
虽然数值上差距不大,但是应用上的结果全是错的。欢迎光临 Toybrick (https://t.rock-chips.com/) | Powered by Discuz! X3.3 |