Toybrick

caffe人形检测模型转换rknn之后精度降低

zxs

注册会员

积分
59
楼主
发表于 2019-11-4 16:30:23    查看: 10135|回复: 1 | [复制链接]    打印 | 只看该作者
caffe模型转成rknn未量化模型后,推理出来的结果出现了精度下降的问题。希望能够得到回复,谢谢。图片中为推理的误差,和图片结果差异,附上推理和转换模型代码。模型放在了附件
  1. # -*- coding: utf-8 -*-

  2. """
  3. detection head of caffe model by cv2.dnn
  4. """

  5. import numpy as np
  6. import cv2
  7. from cv2 import dnn
  8. from rknn.api import RKNN


  9. def caffe2rknn():
  10.     # 创建RKNN执行对象
  11.     rknn = RKNN(verbose=False)
  12.     rknn.config(batch_size=20,
  13.                 channel_mean_value='127.5 127.5 127.5 127.5',
  14.                 reorder_channel='2 1 0',
  15.                 epochs=10,
  16.                 quantized_dtype='asymmetric_quantized-u8'
  17.                 )
  18.     print('--> Loading Caffe model')
  19.     rknn.load_caffe(model='./ASSD-person.prototxt',
  20.                     proto='caffe',
  21.                     blobs='./ASSD-person.caffemodel')
  22.     print('done')

  23.     # 创建解析pb模型
  24.     print('--> Building model')
  25.     ret = rknn.build(do_quantization=False)
  26.     print('done')
  27.     # 导出保存rknn模型文件
  28.     rknn.export_rknn('./Person_ASSD_noquantization-caffe.rknn')

  29.     # Release RKNN Context
  30.     rknn.release()


  31. def detection_by_cv2(img):
  32.     img = cv2.imread(img)
  33.     img = cv2.resize(img, (1159, 655))
  34.     output_blob_name = ["conv10_3", "conv13_3", "conv15_3", "conv16_3"]
  35.     blob = dnn.blobFromImage(img, 1 / 127.5, (1159, 655), (127.5, 127.5, 127.5))
  36.     print("Caffe-Input:", blob.shape, blob.dtype)
  37.     net = dnn.readNetFromCaffe('./ASSD-person.prototxt',
  38.                                './ASSD-person.caffemodel')
  39.     net.setInput(blob)
  40.     outputs = net.forward(output_blob_name)
  41.     outputs = [i.ravel() for i in outputs]
  42.     print("Caffe-Output:", len(outputs), outputs[1].shape)
  43.     return outputs


  44. def rknn_detection(image):
  45.     rknn = RKNN()
  46.     print('--> Load RKNN Model')
  47.     ret = rknn.load_rknn('./Person_ASSD_noquantization-caffe.rknn')
  48.     if ret != 0:
  49.         print('load rknn model failed')
  50.         exit(ret)
  51.     else:
  52.         print('load rknn model done')
  53.     print('---->begin init runtime')
  54.     ret = rknn.init_runtime(target=None)
  55.     if ret == 0:
  56.         print('init run time success')
  57.     else:
  58.         print('init runtime failed')

  59.     print('Class Asssd successfully')
  60.     # Set inputs
  61.     img = cv2.imread(image)
  62.     img = cv2.resize(img, (1159, 655))
  63.     img = img.astype(np.float32)
  64.     input_image = img[np.newaxis, :, :, :]
  65.     # Inference
  66.     print('--> Running rknn model')
  67.     # outputs
  68.     outputs = rknn.inference(inputs=[input_image], data_type='float32')
  69.     print('rknn-outputs-->', len(outputs), outputs[0].shape)
  70.     rknn.release()
  71.     return outputs


  72. def check_caffe_rknn_output(img):
  73.     """4outputs"""
  74.     outputs_caffe = detection_by_cv2(img)
  75.     outputs_rknn = rknn_detection(img)
  76.     for ca_val, rk_val in zip(outputs_caffe, outputs_rknn):
  77.         print('========================================================')
  78.         print('caffe_model--->', ca_val)
  79.         print('rknn_model---->', rk_val)
  80.         print('rk - ca --->', ca_val - rk_val)
  81.         print('Max: %0.3f.' % np.max(np.abs(ca_val - rk_val)))
  82.         print('Sum: %0.3f ' % np.sum((ca_val - rk_val) ** 2))


  83. if __name__ == "__main__":
  84.     img = './a.jpg'
  85.     check_caffe_rknn_output(img)
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

Devin

中级会员

积分
452
沙发
发表于 2020-1-3 10:14:29 | 只看该作者
你好,请问精度差异解决了吗
回复

使用道具 举报

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

本版积分规则

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


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