字节缓冲区的大小和形状不匹配(以前没有回答)

Posted

技术标签:

【中文标题】字节缓冲区的大小和形状不匹配(以前没有回答)【英文标题】:The size of byte buffer and the shape do not match (previously not answered) 【发布时间】:2021-08-15 15:13:01 【问题描述】:

我正在尝试创建一个使用 tensorflow 模型的应用程序。当inputFeature0.loadBuffer(byteBuffer) 被执行时,我的应用程序崩溃了。 (通过评论了解)

var img=Bitmap.createScaledBitmap(bmp,229,229,true)
val model = SkinDiseasesDetectionFitSizeFinal24120210504.newInstance(this)
val inputFeature0 = TensorBuffer.createFixedSize(intArrayOf(1, 229, 229, 3), DataType.FLOAT32)
var tensorimage=TensorImage.fromBitmap(img)
var byteBuffer=tensorimage.buffer
inputFeature0.loadBuffer(byteBuffer)

这是错误

FATAL EXCEPTION: main
Process: com.azsky.skincancerdetection, PID: 31954
java.lang.IllegalArgumentException: The size of byte buffer and the shape do not match.

有人可以帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

我有同样的问题。我不知道为什么会发生这种情况,但可能是因为DataType.FLOAT32。我打印了两个缓冲区,发现总大小不同。

Log.d("shape", byteBuffer.toString())
Log.d("shape", inputFeature0.buffer.toString())

我的inputFeature0.buffer4-timesbyteBuffer。通过划分两个缓冲区找到它。我从某个地方得到的解决方案是

您应该将缓冲区乘以 4。

根据他们的解释,我的缓冲区应该是这样的

buffer = image.width x image.height x colorChanels x 4

但我不知道如何更改总缓冲区,而是将 widthheight 加倍以产生相同的效果。

尝试使用458 x 458 图像大小。

【讨论】:

【参考方案2】:

在将 tensorflow 转换为 TfLite 的过程中,如果您使用优化,那么您应该先从这里阅读 https://www.tensorflow.org/lite/performance/post_training_quantization。据说优化版本要小 4 倍,因此您需要创建字节缓冲区以 [4 * 229 * 229 * 3] 所以它可以与 inputfeature0 匹配

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 请将其表述为一个解释性的有条件的答案,以避免给人一种提出澄清问题而不是回答的印象(应该使用评论而不是答案,比较meta.stackexchange.com/questions/214173/…)。例如像“如果你的问题是......那么解决方案是......因为......。”

以上是关于字节缓冲区的大小和形状不匹配(以前没有回答)的主要内容,如果未能解决你的问题,请参考以下文章

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

非阻塞方式socket send()返回大小和实际发送大小不一致

串口通信缓冲区大小上限是多少?默认是512字节。

在C和/或C ++中创建和管理内存中的字节缓冲区,可以根据需要自动调整大小

通过命名管道发送数据包?单字节缓冲区还是预先确定大小的?

VS警告:C6386 写入到“xxx”时缓冲区溢出: 可写大小为“xxx”个字节,但可能写入了“4294967295”个字节