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

Posted

技术标签:

【中文标题】Tensorflow-lite - 从量化模型输出中获取位图【英文标题】:Tensorflow-lite - Getting bitmap from quantized model output 【发布时间】:2019-05-16 23:37:14 【问题描述】:

我们正在使用 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'。

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

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

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

【问题讨论】:

【参考方案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;
    

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

【讨论】:

【参考方案2】:

类似的东西:

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

?

【讨论】:

我不得不在第一行使用“字节”而不是字节(因为它显示了一些数据类型错误)。此外,由于输出是图像掩码,像素位置的值是像素类值(0 -21 用于 PASCAL VOC)。所以,我必须相应地设置像素值!!!但是,由于其他一些问题,整体速度和准确性似乎较低

以上是关于Tensorflow-lite - 从量化模型输出中获取位图的主要内容,如果未能解决你的问题,请参考以下文章

物体检测4:Android上应用物体监测(TF1)

用Word2Vec词向量化的数据训练Seq2Seq翻译模型的问题?

PIE-Basic 栅格矢量化

sh Tensorflow-lite bazel编译

地平线量化方案QAT原理介绍及实践,包含源代码

地平线量化方案QAT原理介绍及实践,包含源代码