Toybrick

量化问题,运行结果不对,运行时间和非量化差不多

xsky

中级会员

积分
388
楼主
发表于 2019-12-11 21:22:43    查看: 8390|回复: 0 | [复制链接]    打印 | 只看该作者
本帖最后由 xsky 于 2019-12-11 21:23 编辑

请问对于输入,rknn.config(batch_size=1, channel_mean_value='123 117 104 1', reorder_channel='0 1 2', epochs=100)
输入图片的数值没有归一化到0~1的时候,直接使用 rknn.build(do_quantization=True, dataset='dataset1.txt', rknn_batch_size=1)
而不是使用混合量化,是否可行,这样输入值的范围是 r:  [-123, 132], g:[-117, 138], b:[-104, 151],这样如果不使用混合量化,是不是不可行? 现在测试输出的结果不对。

另外,使用这种方式,怎么看出模型是不是量化的模型,build过程中有这样的信息输出:
D Quantize @Conv_79_24:bias to asymmetric_quantized.
D Quantize @Conv_79_24:weight to asymmetric_quantized.
D Packing Initializer_12_95 ...
D Packing Initializer_13_90 ...
I Build config finished.



模型转换的代码:
  1. rknn = RKNN(verbose=True)
  2. rknn.config(batch_size=1, channel_mean_value='123 117 104 1', reorder_channel='0 1 2', epochs=100)
  3. model_file = 'detector.pth.tar_op-v9.onnx'

  4. rknn.load_onnx(model=model_file)

  5.     print('done')
  6.     is_quantization = True

  7.     # 创建解析pb模型
  8.     # do_quantization=False指定不进行量化
  9.     # 量化会减小模型的体积和提升运算速度,但是会有精度的丢失
  10.     print('--> Building model')
  11.     rknn.build(do_quantization=True, dataset='dataset1.txt', rknn_batch_size=1)
  12.     print('done')

  13.     # 导出保存rknn模型文件
  14.     if is_quantization:
  15.         quant_suff = '_quant'
  16.     else:
  17.         quant_suff = '_un-quant'

  18.     rknn_file = model_file + quant_suff + '.rknn'
  19.     print('export:', rknn_file, '...')
  20.     rknn.export_rknn(rknn_file)

  21.     # Release RKNN Context
  22.     rknn.release()
复制代码


运行测试代码:
在预处理中先做了x-mean,通道顺序为RGB,  上一段build代码中开启量化能成功生成模型,但是推理的运行时间以下代码中使用onnx build 不量化应该是float16,和一段量化生成的.rknn模型运行差不多,甚至还多一点,这不应该啊,  在量化模型上传入的数据类型为float32,会不会有问题, ? 有问题的话,请问这个场景应该使用使用什么方式?  对于量化模型,如果输入的tensor是float32的,rknn  runtime不会转换成需要的int8输入吗?
  1. from PIL import Image
  2. import numpy as np
  3. import torch
  4. import time
  5. import os
  6. from rknn.api import RKNN

  7. def pre_process(image):
  8.     """
  9.     :param image: PIL numpy instance
  10.     :return:
  11.     """
  12.     # device = torch.device("cuda")pe
  13.     w, h = image.size
  14.     if w != 1920 and h != 1080:
  15.         image = image.resize((1920, 1080), Image.ANTIALIAS)

  16.     img = np.int16(image)
  17.     img -= (123, 117, 104)
  18.     img = img.transpose(2, 0, 1)
  19.     img = np.array(img, dtype=np.float32, order='C')
  20.     return img

  21. def load_images_tensor(path, suff='.jpg', max_num=0):
  22.     print('load images @%s  %s ...' % (path, suff))
  23.     img_files = os.listdir(path)
  24.     rm_files = []
  25.     for fn in img_files:
  26.         if os.path.splitext(fn)[1] != suff:
  27.             rm_files.append(fn)
  28.     for fn in rm_files:
  29.         img_files.remove(fn)

  30.     n = len(img_files)
  31.     if max_num <= 0:
  32.         max_num = n
  33.     n = min(max_num, n)
  34.     images = []
  35.     for i in range(n):
  36.         f_name = img_files[i]
  37.         f = path + f_name
  38.         im = Image.open(f)
  39.         im = pre_process(im)
  40.         images.append(im)
  41.     print('load images:', len(images))
  42.     return images

  43. if __name__ == '__main__':
  44.     # 创建RKNN执行对象
  45.     rknn = RKNN(verbose=True)
  46.     #图像通道顺序不做调整
  47.     rknn.config(batch_size=1, channel_mean_value='0 0 0 1', reorder_channel='0 1 2')  # , channel_mean_value='123 117 104 1', reorder_channel='2 0 1'

  48.     use_rknn = True
  49.     print('is rknn:', use_rknn)
  50.     if not use_rknn:
  51.         model_file = 'detector.pth.tar_op-v9.onnx'
  52.         #model_file = 'conv1_op-v9.onnx'
  53.         print('--> Loading model', model_file)
  54.         rknn.load_onnx(model=model_file)
  55.         print('--> Building model')
  56.         rknn.build(do_quantization=False, dataset='dataset.txt', rknn_batch_size=1)
  57.         print('done')

  58.     else:
  59.         model_file = 'XMC2-Det_student_detector.pth.tar_op-v9.onnx_quant.rknn'
  60.         rknn.load_rknn(model_file, load_model_in_npu=True)  # , load_model_in_npu=True

  61.     x_list = load_images_tensor('assets/images/', '.jpg', 20)
  62.     num = len(x_list)
  63.     run_cnt = num * 15
  64.     x = x_list[0]
  65.     t0 = time.time()
  66.     for i in range(run_cnt):
  67.         # idx = i % num
  68.         # x = x_list[idx]
  69.         outputs = rknn.inference(inputs=[x], data_type='float32', data_format='nchw')
  70.     t1 = time.time()
  71.     print(' times %d done: avg %.3f s' % (run_cnt, (t1 - t0) / run_cnt))

  72.     # Release RKNN Context
  73.     rknn.release()

复制代码





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表