在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 模型
无法在具有307200字节的TensorFlowLite缓冲区和具有270000字节的Java缓冲区之间转换