2

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

该问题似乎类似于以下 stackoverflow 问题:tensorflow-lite - using tflite Interpreter to get an image in output

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

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

4

2 回答 2

1

试试这个代码:

    /**
     * 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;
    }

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

于 2019-02-22T16:07:16.920 回答
0

类似于以下内容:

  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));
        }

?

于 2018-12-16T10:04:02.570 回答