【问题标题】:TFlite Android bytebuffer creation for inferenceTFlite Android bytebuffer 创建用于推理
【发布时间】:2020-10-26 17:32:58
【问题描述】:

我有一个经过定制训练的 mobilenetV2 模型,它接受 FLOAT32 的 128x101x3 数组作为输入。 在 Android (Java) 中,调用 tflite 模型推理时,float[x][y][z] 输入必须转换为大小为 4128101*3 的 bytebuffer(4 为 float大小,其余为图像大小)。

问题是我有很多方法可以进行转换,但我找不到正确的方法。我可以考虑将每个 x 和 y 的所有 z 添加到字节缓冲区中,或者我可以为每个 x 和每个 z 添加所有 y。

例如,为了简单起见,我们假设第 3 维只是一个重复,即 [x][y][0] == [x][y][1] == [x][y] [2]。现在我可以像这样创建字节缓冲区:

    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(4 * 128 * 101 * 3);
        byteBuffer.order(ByteOrder.nativeOrder());
        for (int i=0; i<myArray.length; i++){
            for(int j=0; j<myArray[0].length; j++){
                byteBuffer.putFloat(myArray[i][j]); // z=0
                byteBuffer.putFloat(myArray[i][j]); // z=1
                byteBuffer.putFloat(myArray[i][j]); // z=2
            }
        }
    byteBuffer.rewind();

或者我可以像这样创建一个字节缓冲区:

    for (int i=0; i<myArray.length; i++){
            int [] inpShapeDim = {1, 1, myArray[0].length, 1};
            TensorBuffer valInTnsrBuffer = TensorBuffer.createDynamic(imageDataType); // imageDataType = FLOAT32
            valInTnsrBuffer.loadArray(myArray[i], inpShapeDim); //inpShapeDim=1x128x101x3
            byteBuffer.put(valInTnsrBuffer.getBuffer());
        }
        int oneDeltaBufferPosition = byteBuffer.position();
        for (int z=0; z<2; deltas++) {
            for (int i = 0; i < oneDeltaBufferPosition; i++) {
                byteBuffer.put(byteBuffer2.get(i));
            }
        }
        byteBuffer.rewind();

两者都是“有效”的转换,但随后推理没有按预期工作,这意味着识别准确度与python中的不同。

【问题讨论】:

    标签: android tensorflow-lite inference


    【解决方案1】:

    我遇到了同样的问题。你应该检查TensorFlow Lite Android Support Library

    或者您可以按照他的指示查看the answer of this post,我最终得到了不错的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多