为量化的 Tensorflow Lite 模型创建位图字节缓冲区
Creating a Bitmap ByteBuffer for quantized Tensorflow Lite Model
我想使用量化的 tensorflow lite 模型,但我当前的 ByteBuffer 使用的是浮点数。我希望这是整数表示。现在模型需要 270000 字节,而我正试图将 1080000 字节传递给它。是不是把float转int那么简单?
public ByteBuffer convertBitmapToByteBuffer(Bitmap bitmap) {
// Preallocate memory for bytebuffer
ByteBuffer byteBuffer = ByteBuffer.allocate(inputSize*inputSize*pixelSize);
byteBuffer.order(ByteOrder.nativeOrder());
// Initialize pixel data array and populate from bitmap
int [] intArray = new int[inputSize*inputSize];
bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0 , 0,
bitmap.getWidth(), bitmap.getHeight());
int pixel = 0; // pixel indexer
for (int i=0; i<inputSize; i++) {
for (int j=0; j<inputSize; j++) {
int input = intArray[pixel++];
byteBuffer.putfloat((((input >> 16 & 0x000000FF) - imageMean) / imageStd));
byteBuffer.putfloat((((input >> 8 & 0x000000FF) - imageMean) / imageStd));
byteBuffer.putfloat((((input & 0x000000FF) - imageMean) / imageStd));
}
}
return byteBuffer;
}
感谢您提供的任何提示。
将 float 转换为 int 不是正确的方法。好消息是模型期望的量化输入值(8 位 r、g、b 值顺序)与 Bitmap 像素表示完全相同,只是模型不期望 alpha 通道,因此转换过程实际上应该比使用浮点输入更容易。
以下是您可以尝试的方法。 (我假设 pixelSize
是 3
)
int pixel = 0; // pixel indexer
for (int i=0; i<inputSize; i++) {
for (int j=0; j<inputSize; j++) {
int input = intArray[pixel++]; // pixel containing ARGB.
byteBuffer
.put((byte)((input >> 16) & 0xFF)) // R
.put((byte)((input >> 8) & 0xFF)) // G
.put((byte)((input ) & 0xFF)); // B
}
}
我想使用量化的 tensorflow lite 模型,但我当前的 ByteBuffer 使用的是浮点数。我希望这是整数表示。现在模型需要 270000 字节,而我正试图将 1080000 字节传递给它。是不是把float转int那么简单?
public ByteBuffer convertBitmapToByteBuffer(Bitmap bitmap) {
// Preallocate memory for bytebuffer
ByteBuffer byteBuffer = ByteBuffer.allocate(inputSize*inputSize*pixelSize);
byteBuffer.order(ByteOrder.nativeOrder());
// Initialize pixel data array and populate from bitmap
int [] intArray = new int[inputSize*inputSize];
bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0 , 0,
bitmap.getWidth(), bitmap.getHeight());
int pixel = 0; // pixel indexer
for (int i=0; i<inputSize; i++) {
for (int j=0; j<inputSize; j++) {
int input = intArray[pixel++];
byteBuffer.putfloat((((input >> 16 & 0x000000FF) - imageMean) / imageStd));
byteBuffer.putfloat((((input >> 8 & 0x000000FF) - imageMean) / imageStd));
byteBuffer.putfloat((((input & 0x000000FF) - imageMean) / imageStd));
}
}
return byteBuffer;
}
感谢您提供的任何提示。
将 float 转换为 int 不是正确的方法。好消息是模型期望的量化输入值(8 位 r、g、b 值顺序)与 Bitmap 像素表示完全相同,只是模型不期望 alpha 通道,因此转换过程实际上应该比使用浮点输入更容易。
以下是您可以尝试的方法。 (我假设 pixelSize
是 3
)
int pixel = 0; // pixel indexer
for (int i=0; i<inputSize; i++) {
for (int j=0; j<inputSize; j++) {
int input = intArray[pixel++]; // pixel containing ARGB.
byteBuffer
.put((byte)((input >> 16) & 0xFF)) // R
.put((byte)((input >> 8) & 0xFF)) // G
.put((byte)((input ) & 0xFF)); // B
}
}