【问题标题】:tflite uint8 quantization model input and output float conversiontflite uint8 量化模型输入输出浮点转换
【发布时间】:2019-07-24 16:51:10
【问题描述】:

我已经成功地转换了一个量化的 8 位 tflite 模型来进行物体检测。我的模型最初是在通过除以 255 归一化的图像上训练的,因此原始输入范围是 [0, 1]。由于我的量化 tflite 模型需要输入为 uint8,如何将我的图像(最初为 [0, 255])转换为适合我的网络? 另外,如何将输出转换为浮点数以将结果与浮点模型进行比较?

以下代码没有给我正确的结果。

'''python
im = cv2.imread(image_path)
im = im.astype(np.float32, copy=False)
input_image = im
input_image = np.array(input_image, dtype=np.uint8)
input_image = np.expand_dims(input_image, axis=0)

interpreter.set_tensor(input_details[0]['index'], input_image)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
output_data2 = interpreter.get_tensor(output_details[1]['index'])
output_data3 = interpreter.get_tensor(output_details[2]['index'])

min_1 =  -8.198164939880371
max_1 = 8.798029899597168
scale = (max_1 - min_1)/ 255.0

min_2 = -9.77856159210205
max_2 = 10.169703483581543
scale_2 = (max_2 - min_2) / 255.0

min_3 = -14.382895469665527 
max_3 = 11.445544242858887
scale_3 = (max_3 - min_3) / 255.0

output_data = (output_data ) * scale + min_1
output_data2  = (output_data2) * scale_2 + min_2
output_data3 = (output_data3) * scale_3 + min_3

'''

【问题讨论】:

  • 对于输入,应该是input_image = im / 256 但是对于输出,你从哪里获取这些最小值/最大值?
  • 它来自 tf.lite.create_train_graph() 添加的 fakequantization 节点,它跟踪每个层的最小最大激活以进行量化
  • 在某些情况下您碰巧获得的输出值可能无法正确缩放输出到 unit8
  • 我不确定我是否理解正确。但是 tflite 量化会跟踪最小值和最大值,并在该范围内执行统一量化,因此浮动输出应该在 uint8 中正确表示。我用假量化节点测试浮点模型,输出是正确的。
  • 也许如果你提供正确缩放的输入,输出会变得更好

标签: tensorflow tensorflow-lite quantization


【解决方案1】:

我遇到了同样的问题,但在姿态估计中。

你的问题解决了吗?

您使用量化意识训练

我认为您可以获得关于输入图像的 q 和 z 值(因为当您使用 tflite api 或 toco commonad 来获得量化的 8 位 tflite 模型时,您必须给出均值和 std-err)。

试试这些代码:

  image = q_input* (image - z_input)

  output_data  = q_output(image - z_output)

等等

(对于不同的层你可以访问不同的q和z)

如果你尝试过这种方式,请告诉我

【讨论】:

    【解决方案2】:

    我已通过 OpenCV 将图像转换为“CV_8UC3”,这对我有用:

      // Convert to RGB color space
      if (image.channels() == 1) {
        cv::cvtColor(image, image, cv::COLOR_GRAY2RGB);
      } else {
        cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
      }
    
      image.convertTo(image, CV_8UC3);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-08
      • 2020-12-27
      相关资源
      最近更新 更多