Tensorflow lite-从量化模型输出中获取位图



我们正在使用tensorflow-lite在android中开发语义分割应用程序。使用的'.tflite'deeplabv3模型具有类型为(ImageTensor(uint8[1300,3]的输入和类型为(SemanticPredictions(uint8[300300]的输出。我们能够在tflite.run方法的帮助下成功运行该模型并获得ByteBuffer格式的输出。但是我们无法用java从这个输出中提取图像。该模型使用pascal voc数据集进行训练,并实际从TF模型转换为tflite格式:"mobilenetv2_dm05_coco-voc_trainval"。

这个问题似乎类似于下面的stackerflow问题:tensorflow lite-使用tflite解释器在输出中获得图像

处理浮点数据类型转换的相同问题似乎在github问题中得到了解决:https://github.com/tensorflow/tensorflow/issues/23483

那么,我们如何从UINT8模型输出中正确提取分割掩码呢?

试试这个代码:

/**
* Converts ByteBuffer with segmentation mask to the Bitmap
*
* @param byteBuffer Output ByteBuffer from Interpreter.run
* @param imgSizeX Model output image width
* @param imgSizeY Model output image height
* @return Mono color Bitmap mask
*/
private Bitmap convertByteBufferToBitmap(ByteBuffer byteBuffer, int imgSizeX, int imgSizeY){
byteBuffer.rewind();
byteBuffer.order(ByteOrder.nativeOrder());
Bitmap bitmap = Bitmap.createBitmap(imgSizeX , imgSizeY, Bitmap.Config.ARGB_4444);
int[] pixels = new int[imgSizeX * imgSizeY];
for (int i = 0; i < imgSizeX * imgSizeY; i++)
if (byteBuffer.getFloat()>0.5)
pixels[i]= Color.argb(100, 255, 105, 180);
else
pixels[i]=Color.argb(0, 0, 0, 0);
bitmap.setPixels(pixels, 0, imgSizeX, 0, 0, imgSizeX, imgSizeY);
return bitmap;
}

它适用于单色输出的模型。

类似的东西

Byte[][] output = new Byte[300][300];
Bitmap bitmap = Bitmap.createBitmap(300,300,Bitmap.Config.ARGB_8888);
for (int row = 0; row < output.length ; row++) {
for (int col = 0; col < output[0].length ; col++) {
int pixelIntensity = output[col][row];
bitmap.setPixel(col,row,Color.rgb(pixelIntensity,pixelIntensity,pixelIntensity));
}

相关内容

  • 没有找到相关文章

最新更新