我正在尝试使用一个mediapipes预训练的tflite模型在android(java)中执行姿势地标检测,它为我提供了关于人体33个地标的信息。我知道有不同的方法,例如使用ML Kit,但为了获得更好的结果,使用一个mediapipes模型会更好。
我想使用(https://google.github.io/mediapipe/solutions/models.html)姿势地标模型。
要在android中使用这些模型,需要知道(尤其是理解)模型的输出形状,这些可以在java(或python)中读取:
- 五项产出:[195],[1],[256,256,1],[64,64,1],[117]如果我没弄错的话。
但在模型的模型卡中,输出阵列被定义为[33,5],这是有意义的,因为目标是检测33个界标,每个界标具有5个值。
有没有人能解释一下tflite模型的输出形状以及如何使用它们,或者给予我一个我错过的文档的线索。
所用代码由android studio自动生成,并由ml文件夹中模型的“示例代码部分”提供(遵循以下说明https://www.tensorflow.org/lite/inference_with_metadata/codegen#mlbinding,但使用以下方法获得相同形状https://www.tensorflow.org/lite/guide/inference#load_and_run_a_model_in_java):
try {
PoseDetection model = PoseDetection.newInstance(getApplicationContext());
// Creates inputs for reference.
TensorBuffer inputFeature0 = TensorBuffer.createFixedSize(new int[]{1, 224, 224, 3}, DataType.FLOAT32);
// imageBuffer is the image as ByteBuffer
inputFeature0.loadBuffer(imageBuffer);
// Runs model inference and gets result.
PoseDetection.Outputs outputs = model.process(inputFeature0);
TensorBuffer outputFeature0 = outputs.getOutputFeature0AsTensorBuffer();
TensorBuffer outputFeature1 = outputs.getOutputFeature1AsTensorBuffer();
TensorBuffer outputFeature2 = outputs.getOutputFeature2AsTensorBuffer();
TensorBuffer outputFeature3 = outputs.getOutputFeature3AsTensorBuffer();
TensorBuffer outputFeature4 = outputs.getOutputFeature4AsTensorBuffer();
// Releases model resources if no longer used.
model.close();
} catch (IOException e) {
// TODO Handle the exception
}
我通过使用调试器检查outputFeatures得到了形状。
多谢了。
1条答案
按热度按时间xu3bshqb1#
由于MediaPipe文档“免责声明:在Windows上运行MediaPipe是实验性的。”(https://developers.google.com/mediapipe/framework/getting_started/install#installing_on_windows),我按照google.github.io/mediapipe/getting_started/android.html@莫里森Chang建议的方法在www.example.com上进行了操作。这种方法需要花很多时间来理解,但赠款很高的可定制性和良好的效果。这解决了我的问题,旧的方法似乎并不适用。