Tensorflow-lite - Получение растрового изображения из выходных данных квантованной модели

Мы работаем над приложением семантической сегментации в Android с использованием tensorflow-lite. Используемая модель deeplabv3 '.tflite' имеет входные данные типа (ImageTensor) uint8 [1,300,300,3] и выходные данные типа (SemanticPredictions) uint8 [300,300]. удалось запустить модель и получить результат в формате ByteBuffer с помощью метода tflite.run, но нам не удалось извлечь изображение из этого вывода в java. Модель, которая обучена с помощью набора данных pascal voice и была фактически преобразована в Формат tflite из модели TF: 'mobilenetv2_dm05_cocoval_voc.

Проблема похожа на следующий вопрос о переполнении стека: tensorflow-lite - использование интерпретатора tflite для получения изображения на выходе

Та же проблема, которая связана с преобразованием типов данных с плавающей запятой, кажется, исправлена ​​в проблеме с github: https://github.com/tensorflow/tensorflow/issues/23483

Итак, как мы можем правильно извлечь маску сегментации из выходных данных модели UINT8?


person anilsathyan7    schedule 16.12.2018    source источник


Ответы (2)


Попробуйте этот код:

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

Это работает для модели с монохромным выводом.

person Vasil Li    schedule 22.02.2019

Что-то вроде:

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

?

person Jcov    schedule 16.12.2018
comment
Мне пришлось использовать `` byte '' вместо Byte в первой строке (поскольку она показывала некоторую ошибку типа данных) .Также, поскольку вывод представляет собой маску изображения, значения в позициях пикселей были значениями класса пикселей (0-21 для PASCAL VOC). , мне пришлось соответственно установить значения пикселей !!! Однако общая скорость и точность кажутся низкими из-за некоторых других проблем. - person anilsathyan7; 16.12.2018