Android TensorFlowLite缓冲区为76800字节,ByteBuffer为307200字节
我一直在尝试将facenet与ml_工具包一起使用,并且我能够生成下面的.tflite文件,但是当我尝试在Android上使用它时,我收到了这个错误消息 具有76800字节的TensorFlowLite缓冲区和具有307200字节的ByteBuffer 字节 我的模型和预期的一样 投入: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
[{'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