使用openCV图像运行推理

时间:2019-03-26 16:49:04

标签: android opencv tensorflow tensorflow-lite

我有一个装有OpenCV4.0.1和TFLite的Android项目。 我想对cv :: Mat的预训练MobileNetV2进行推断,我是从CameraBridgeViewBase(Android风格)中提取并裁剪的。 但这有点困难。

我遵循了this的示例。

这样就推断出一个名为“ imgData”的ByteBuffer变量(第71行,类:org.tensorflow.lite.examples.classification.tflite.Classifier)

该imgData看起来已填充在同一类的名为“ convertBitmapToByteBuffer”的方法上(第185行),并逐个像素地添加了一个位图,看起来似乎早就被裁剪了。

private int[] intValues = new int[224 * 224];
Mat _croppedFace = new Mat() // Cropped image from CvCameraViewFrame.rgba() method.

float[][] outputVal = new float[1][1]; // Output value from my MobileNetV2 // trained model (i've changed the output on training, tested on python)

// Following: https://stackoverflow.com/questions/13134682/convert-mat-to-bitmap-opencv-for-android
Bitmap bitmap = Bitmap.createBitmap(_croppedFace.cols(), _croppedFace.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(_croppedFace, bitmap);

convertBitmapToByteBuffer(bitmap); // This call should be used as the example one.
// runInference();
_tflite.run(imgData, outputVal);

但是,看来我的NN的input_shape不正确,但是我遵循的是MobileNet示例,因为我的NN是MobileNetV2。

1 个答案:

答案 0 :(得分:0)

我已经解决了该错误,但是我敢肯定这不是最好的方法。

Keras MobilenetV2 input_shape为:(nBatches,224、224,nChannels)。 我只想预测一个图像,所以nBaches == 1,而我正在RGB模式下工作,所以nChannels == 3

// Nasty nasty, but works. nBatches == 2? -- _cropped.shape() == (244, 244), 3 channels.
float [][][][] _inputValue = new float[2][_cropped.cols()][_cropped.rows()][3];

// Fill the _inputValue
for(int i = 0; i < _croppedFace.cols(); ++i)
    for (int j = 0; j < _croppedFace.rows(); ++j)
        for(int z = 0; z < 3; ++z)
            _inputValue [0][i][j][z] = (float) _croppedFace.get(i, j)[z] / 255; // DL works better with 0:1 values.

/*
Output val, has this shape, but I don't  really know why.
I'm sure that one's of that 2's is for nClasses (I'm working with 2 classes)
But I don't really know why it's using the other one.
*/
 float[][] outputVal = new float[2][2];
// Tensorflow lite interpreter
_tflite.run(_inputValue , outputVal);

在python上具有相同的形状: Python预测: [[XXXXXX,YYYYY]] <-当然可以,在我制作的最后一层中,这只是一个原型NN。

希望有人得到帮助,也希望有人可以改善答案,因为这不是很优化。