在android中运行TFLite模型[字节缓冲区的大小和形状不匹配]

Posted

技术标签:

【中文标题】在android中运行TFLite模型[字节缓冲区的大小和形状不匹配]【英文标题】:Running TFLite model in android [The size of byte buffer and the shape do not match] 【发布时间】:2021-10-28 13:33:54 【问题描述】:

我正在使用这个collab 来创建我的张量流模型。我在协作中添加此代码以将模型导出为 tflite 文件:

saved_model_dir = '/created_model'
model.save('/created_model')
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()
from google.colab import files
open("converted_model.tflite", "wb").write(tflite_model)
files.download('converted_model.tflite')

androidStudio 中导入模型后。我正在尝试使用位图运行模型,但出现此错误:

Caused by: java.lang.IllegalArgumentException: The size of byte buffer and the shape do not match.

这是我在android端使用的代码

val model = ConvertedModel.newInstance(requireContext())
val inputFeature0 = TensorBuffer.createFixedSize(intArrayOf(1, 180, 180, 3), DataType.FLOAT32)
//get the bitmap file
val bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(requireContext().contentResolver, data?.data!!))
// get the byte buffer from bitmap file

val stream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream)
val byteArray = stream.toByteArray()
// This line when the error happened
inputFeature0.loadBuffer(ByteBuffer.wrap(byteArray))
val outputs = model.process(inputFeature0)
val outputFeature0 = outputs.outputFeature0AsTensorBuffer
model.close()

任何帮助或线索将不胜感激。谢谢!

【问题讨论】:

【参考方案1】:

PNG 格式是压缩类型,但模型采用 (1 x 180 x 180 x 3) 大小的长未压缩 float32 图像。

请再次查看模型输入/输出规范,并找到一种方法将给定的 PNG 格式图像转换为模型的输入图像格式。

【讨论】:

【参考方案2】:

如果你输入的图片大小和inputfeature0不一样,你应该先调整图片的大小来匹配输入特征的大小:

val resize = Bitmap.createScaledBitmap(*input image*, 180, 180, true)

别忘了把数据类型匹配到float(32):

var tensorImage = TensorImage(DataType.FLOAT32)
tensorImage.load(resize)

根据我的经验,它可以工作,我使用位图作为输入。对不起,如果这对你来说不一样。

【讨论】:

以上是关于在android中运行TFLite模型[字节缓冲区的大小和形状不匹配]的主要内容,如果未能解决你的问题,请参考以下文章

无法在 android studio 的 Interpreter 上运行 tflite 模型

将 .tflite 转换为 .pb

无法在具有307200字节的TensorFlowLite缓冲区和具有270000字节的Java缓冲区之间转换

如何从 tflite 模型输出形状 [1, 28, 28,1] 的数组作为 android 中的图像

具有委托 gpu 的 TFlite 给出错误的结果

字节缓冲区的大小和形状不匹配。我在将我的 Ml 模型集成到 android 应用程序时遇到了这个错误