Android TensorFlowLite缓冲区为76800字节,ByteBuffer为307200字节

Android TensorFlowLite缓冲区为76800字节,ByteBuffer为307200字节,android,firebase-mlkit,Android,Firebase Mlkit,我一直在尝试将facenet与ml_工具包一起使用,并且我能够生成下面的.tflite文件,但是当我尝试在Android上使用它时,我收到了这个错误消息 具有76800字节的TensorFlowLite缓冲区和具有307200字节的ByteBuffer 字节 我的模型和预期的一样 投入: [{'name': 'input', 'index': 451, 'shape': array([ 1, 160, 160, 3], dtype=int32), 'dtype': <class 'n

我一直在尝试将facenet与ml_工具包一起使用,并且我能够生成下面的.tflite文件,但是当我尝试在Android上使用它时,我收到了这个错误消息

具有76800字节的TensorFlowLite缓冲区和具有307200字节的ByteBuffer 字节

我的模型和预期的一样

投入:

[{'name': 'input', 'index': 451, 'shape': array([  1, 160, 160,   3], dtype=int32), 'dtype': <class 'numpy.uint8'>, 'quantization': (0.0078125, 128)}]
我的配置值

private val IMAGE_WIDTH : Int = 160
    private val IMAGE_HEIGHT : Int = 160

    private val DIM_BATCH_SIZE = 1
    private val DIM_PIXEL_SIZE = 3
    private val BYTES_PER_CHANNEL = 4

知道我做错了什么吗?

几个小时后,我发现ml\u kit无法处理量化的UINT8类型(或者至少我不知道该怎么做)。因此,我修改了.tflite文件,改为使用FLOAT

tflite_convert --output_file model_mobile/my_facenet.tflite --graph_def_file facenet_frozen.pb --input_arrays "input" --input_shapes "1,160,160,3" --output_arrays "embeddings" --output_format TFLITE --mean_values 128 --std_dev_values 128 --default_ranges_min 0 --default_ranges_max 6 --inference_type QUANTIZED_UINT8 --inference_input_type QUANTIZED_UINT8
此外,我还改变了将位图转换为ml_工具包可以使用的内容的方式

private fun bitmapToInputArray(originalBitmap: Bitmap, quantified : Boolean = true): Array<Array<Array<FloatArray>>> {
    var bitmap = originalBitmap
    // [START mlkit_bitmap_input]
    //be sure it's the right size
    bitmap = Bitmap.createScaledBitmap(bitmap, IMAGE_WIDTH, IMAGE_HEIGHT, true)

    val batchNum = 0
    val input = Array(DIM_BATCH_SIZE) { Array(bitmap.width) { Array(bitmap.height) { FloatArray(DIM_PIXEL_SIZE) } } }
    for (x in 0..bitmap.width-1) {
        for (y in 0..bitmap.height-1) {
            val pixelValue = bitmap.getPixel(x, y)
            var red:Float
            var green:Float
            var blue:Float
            if(quantified) {
                red = (pixelValue shr 16 and 0xFF) / 255f
                green = (pixelValue shr 8 and 0xFF) / 255f
                blue = (pixelValue and 0xFF) / 255f
            } else {
                red = ((pixelValue shr 16 and 0xFF) - IMAGE_MEAN) / IMAGE_STD
                green= ((pixelValue shr 8 and 0xFF) - IMAGE_MEAN) / IMAGE_STD
                blue= ((pixelValue and 0xFF) - IMAGE_MEAN) / IMAGE_STD
            }

            input[batchNum][x][y][0] = red
            input[batchNum][x][y][1] = green
            input[batchNum][x][y][2] = blue
        }
    }
    // [END mlkit_bitmap_input]

    return input
}
这些是我的最终配置设置

private val IMAGE_WIDTH : Int = 160
    private val IMAGE_HEIGHT : Int = 160

    private val DIM_BATCH_SIZE = 1
    private val DIM_PIXEL_SIZE = 3
    private val BYTES_PER_CHANNEL = 4

    private val IMAGE_MEAN = 127
    private val IMAGE_STD = 128.0f
private fun bitmapToInputArray(originalBitmap: Bitmap, quantified : Boolean = true): Array<Array<Array<FloatArray>>> {
    var bitmap = originalBitmap
    // [START mlkit_bitmap_input]
    //be sure it's the right size
    bitmap = Bitmap.createScaledBitmap(bitmap, IMAGE_WIDTH, IMAGE_HEIGHT, true)

    val batchNum = 0
    val input = Array(DIM_BATCH_SIZE) { Array(bitmap.width) { Array(bitmap.height) { FloatArray(DIM_PIXEL_SIZE) } } }
    for (x in 0..bitmap.width-1) {
        for (y in 0..bitmap.height-1) {
            val pixelValue = bitmap.getPixel(x, y)
            var red:Float
            var green:Float
            var blue:Float
            if(quantified) {
                red = (pixelValue shr 16 and 0xFF) / 255f
                green = (pixelValue shr 8 and 0xFF) / 255f
                blue = (pixelValue and 0xFF) / 255f
            } else {
                red = ((pixelValue shr 16 and 0xFF) - IMAGE_MEAN) / IMAGE_STD
                green= ((pixelValue shr 8 and 0xFF) - IMAGE_MEAN) / IMAGE_STD
                blue= ((pixelValue and 0xFF) - IMAGE_MEAN) / IMAGE_STD
            }

            input[batchNum][x][y][0] = red
            input[batchNum][x][y][1] = green
            input[batchNum][x][y][2] = blue
        }
    }
    // [END mlkit_bitmap_input]

    return input
}
@Throws(FirebaseMLException::class)
private fun createInputOutputOptions(): FirebaseModelInputOutputOptions {
    // [START mlkit_create_io_options]
    val inputOutputOptions = FirebaseModelInputOutputOptions.Builder()
        .setInputFormat(0, FirebaseModelDataType.FLOAT32, intArrayOf(DIM_BATCH_SIZE, IMAGE_WIDTH, IMAGE_HEIGHT, DIM_PIXEL_SIZE))
        .setOutputFormat(0, FirebaseModelDataType.FLOAT32, intArrayOf(DIM_BATCH_SIZE, 512))
        .build()
    // [END mlkit_create_io_options]
    return inputOutputOptions
}
private val IMAGE_WIDTH : Int = 160
    private val IMAGE_HEIGHT : Int = 160

    private val DIM_BATCH_SIZE = 1
    private val DIM_PIXEL_SIZE = 3
    private val BYTES_PER_CHANNEL = 4

    private val IMAGE_MEAN = 127
    private val IMAGE_STD = 128.0f