类型为 UINT8 的 TensorFlowLite 张量和类型为 [[F 的 Java 对象(与 TensorFlowLite 类型 FLOAT32 兼容)

TensorFlowLite tensor with type UINT8 and a Java object of type [[F (which is compatible with the TensorFlowLite type FLOAT32)

我正在创建一个可以使用 flutter 识别图像的移动应用程序,但在测试该应用程序时遇到了这个运行时间错误。

Caused by: java.lang.IllegalArgumentException: Cannot convert between a TensorFlowLite tensor with type UINT8 and a Java object of type [[F (which is compatible with the TensorFlowLite type FLOAT32).

我使用 TensorFlow lite 图像分类和 运行 在 Google Colab

上训练我的自定义模型

阅读了一些文档之后。 TensorFlow Lite 模型应该有 Post-Training 量化。 See here at Image Classification with TensorFlow Lite

运行此命令定义量化配置。

config = QuantizationConfig.for_float16()

然后使用配置导出 TensorFlow Lite 模型。

model.export(export_dir='.', tflite_filename='model_fp16.tflite', quantization_config=config)

使用配置导出 TensorFlow Lite 模型标签

model.export(export_dir='.', quantization_config=config,export_format=ExportFormat.LABEL)

在您的代码中将输出从 float 更改为 byte 最后从字节数据中获取浮点值。

之前:

float[][] labelProb = new float[1][labels.size()];
 for (int i = 0; i < labels.size(); ++i) {
      float confidence = labelProb[0][i];
  }

之后:

byte[][] labelProb = new byte[1][labels.size()];
 for (int i = 0; i < labels.size(); ++i) {
      float confidence = (float)labelProb[0][i];
  }