用于推理的TFlite Android字节缓冲区创建

问题描述

我有一个经过专门培训的mobilenetV2模型,该模型接受FLOAT32的128x101x3数组作为输入。 在Android(Java)中,调用tflite模型推断时,必须将float [x] [y] [z]输入转换为大小为4 128 101 * 3的字节缓冲区(浮点数为4尺寸,其余为图片尺寸。

问题是我有很多方法可以进行转换,而我找不到正确的方法。我可以考虑将每个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中的不同。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)