Android:如何在Android中使用tensorflow lite扩展图像维度

Android: How to expand dimension of image using tensorflow lite in Android

问题本身是不言自明的。在 Python 中,用 tf.expand_dims(image, 0) 很简单。我怎样才能在 Android 中做同样的事情? 我在 运行ning 我准备的张量流模型时遇到错误。它说,

Cannot copy to a TensorFlowLite tensor (input_3) with X bytes from a Java Buffer with Y bytes.

我猜它来自少了一个维度的图像。我有 运行 另一个工作正常的模型。所以我需要知道该怎么做。 我的代码片段:

val contentArray =
        ImageUtils.bitmapToByteBuffer(
            scaledBitmap,
            imageSize,
            imageSize,
            IMAGE_MEAN,
            IMAGE_STD
        )

    val tfliteOptions = Interpreter.Options()
    tfliteOptions.setNumThreads(4)
    val tflite = Interpreter(tfliteModel, tfliteOptions)
    tflite.run(contentArray, segmentationMasks)

fun bitmapToByteBuffer(
  bitmapIn: Bitmap,
  width: Int,
  height: Int,
  mean: Float = 0.0f,
  std: Float = 255.0f
): ByteBuffer {
  val bitmap = scaleBitmapAndKeepRatio(bitmapIn, width, height)
  val inputImage = ByteBuffer.allocateDirect(1 * width * height * 3 * 4)
  inputImage.order(ByteOrder.nativeOrder())
  inputImage.rewind()

  val intValues = IntArray(width * height)
  bitmap.getPixels(intValues, 0, width, 0, 0, width, height)
  var pixel = 0
  for (y in 0 until height) {
    for (x in 0 until width) {
      val value = intValues[pixel++]

      // Normalize channel values to [-1.0, 1.0]. This requirement varies by
      // model. For example, some models might require values to be normalized
      // to the range [0.0, 1.0] instead.
      inputImage.putFloat(((value shr 16 and 0xFF) - mean) / std)
      inputImage.putFloat(((value shr 8 and 0xFF) - mean) / std)
      inputImage.putFloat(((value and 0xFF) - mean) / std)
    }
  }

  inputImage.rewind()
  return inputImage
}

TensorFlow API 中有 JVM/Android 个等价运算:https://www.tensorflow.org/jvm/api_docs/java/org/tensorflow/op/core/ExpandDims

但是,如果您使用 TfLite Interpreter API 对预训练模型进行 运行 推理,那么您很可能希望在构建和保存模型(即使用 Python)而不是当您从 Android 代码调用解释器时。