如何将图像位图传递给Tensorflow Mobile模型?

时间:2019-04-19 09:15:18

标签: android tensorflow android-bitmap

我已使用KerasTransfer Learning中创建了一个模型。 我将InceptionV3模型用作base,并将初始52层用作non-trainable。 然后,在其顶部添加我的custom层。 对其进行了训练,并保存到hdf5文件中。 该模型在我的A.png上预测了laptopCorrect

我使用pb工具将其转换为Github文件。 然后,我根据A.png上的pb模型预测了laptop。是correct

然后,我将pb文件移到了android asset文件夹中。 我对其添加了Tensorflow Mobile依赖性(不是TensorflowLite)。 我还向A.png添加了相同的asset。 我加载了模型并将A.png传递给pb模型。 输出为wrong类。 我尝试了其他图像。它始终指向same wrong classOutput never changed

因此,我认为hdf5pb模型是正确的,但是我的mistake中有一些code which is passing the A.png to pb model。请帮帮我!

resized_image-> A.png的位图 inferenceInterface->张量流模型接口 INPUT_NODE->输入节点的名称 OUTPUT_NODE->输出节点的名称 1,128,128,3->图片为128x128和3个频道

imageValuesFloat = normalizeBitmap(resized_image,128,127.5f,1.0f);
              inferenceInterface.feed(INPUT_NODE,imageValuesFloat,1,128,128,3);

inferenceInterface.run(OUTPUT_NODES);

//declare array to hold results obtained from model
float[] result = new float[OUTPUT_SIZE];

//copy the output into the result array
inferenceInterface.fetch(OUTPUT_NODE,result);

这里是normalizeBitmap函数

public float[] normalizeBitmap(Bitmap source,int size,float mean,float std){
        float[] output = new float[size * size * 3];
        int[] intValues = new int[source.getHeight() * source.getWidth()];
        source.getPixels(intValues, 0, source.getWidth(), 0, 0, source.getWidth(), source.getHeight());
        for (int i = 0; i < intValues.length; ++i) {
            final int val = intValues[i];
            output[i * 3] = (((val >> 16) & 0xFF) - mean)/std;
            output[i * 3 + 1] = (((val >> 8) & 0xFF) - mean)/std;
            output[i * 3 + 2] = ((val & 0xFF) - mean)/std;
        }
        return output;
    }

0 个答案:

没有答案