使用Tensorflow lite时kotlin应用程序浮点类型转换

使用Tensorflow lite时kotlin应用程序浮点类型转换,tensorflow,kotlin,tensorflow-lite,Tensorflow,Kotlin,Tensorflow Lite,我对使用kotlin的tensorflow lite应用程序非常陌生。我已经使用mobilenet模型获取了一个用于图像分类的kotlin示例代码,它工作正常,现在我正在使用自己的自定义图像分类器模型进行尝试。 我正在使用输入形状为32x32x3的VGG体系结构,并将其转换为tflite,并且使用tflite解释器可以正常工作。 但是,当我在kotlin应用程序上尝试此操作时,我面临以下错误,我发现由于kotlin(自动类型转换)中的val类型,很难将其转换为float fun recogniz

我对使用kotlin的tensorflow lite应用程序非常陌生。我已经使用mobilenet模型获取了一个用于图像分类的kotlin示例代码,它工作正常,现在我正在使用自己的自定义图像分类器模型进行尝试。 我正在使用输入形状为32x32x3的VGG体系结构,并将其转换为tflite,并且使用tflite解释器可以正常工作。 但是,当我在kotlin应用程序上尝试此操作时,我面临以下错误,我发现由于kotlin(自动类型转换)中的val类型,很难将其转换为float

fun recognizeImage(位图:位图):列表{
val scaledBimat=Bitmap.createScaledBitmap(位图、inputSize、inputSize、false)
val byteBuffer=convertBitmapToByteBuffer(缩放位图)
val result=Array(1){ByteArray(labelList.size)}
explorer.run(byteBuffer,result)
返回getSortedResult(结果)
}
错误日志

E/Exception:java.lang.IllegalArgumentException:无法在类型为FLOAT32的TensorFlowLite张量和类型为[[B(与TensorFlowLite类型UINT8兼容)的java对象之间转换


我该如何解决它呢?

首先,您需要仔细检查您的模型所期望的输入类型

如果是量化的,则模型期望在范围
[0255]
内输入
UINT8

对于原始版本的
VGG
,我记得(不确定)它期望浮点值在
[0,1]
范围内,这意味着您需要手动规范化输入数据

 fun recognizeImage(bitmap: Bitmap): List<Recognition> {
        val scaledBitmap = Bitmap.createScaledBitmap(bitmap, inputSize, inputSize, false)
        val byteBuffer = convertBitmapToByteBuffer(scaledBitmap)
        val result = Array(1) { ByteArray(labelList.size) }
        interpreter.run(byteBuffer, result)
        return getSortedResult(result)
    }