predict method
Predicts anonymized face landmarks from image
Implementation
Map<String, dynamic>? predict(image_lib.Image image) {
final tensorImage = TensorImage(TfLiteType.float32);
tensorImage.loadImage(image);
final inputImage = getProcessedImage(tensorImage);
// from https://drive.google.com/file/d/1tV7EJb3XgMS7FwOErTgLU1ZocYyNmwlf/preview
TensorBuffer outputLandmarks = TensorBufferFloat(outputsShapes[0]);
TensorBuffer outputLips = TensorBufferFloat(outputsShapes[1]);
TensorBuffer outputLeftEyeBrow = TensorBufferFloat(outputsShapes[2]);
TensorBuffer outputRightEyeBrow = TensorBufferFloat(outputsShapes[3]);
TensorBuffer outputLeftIris = TensorBufferFloat(outputsShapes[4]);
TensorBuffer outputRightIris = TensorBufferFloat(outputsShapes[5]);
TensorBuffer outputScores = TensorBufferFloat(outputsShapes[6]);
final inputs = <Object>[inputImage.buffer];
final outputs = <int, Object>{
0: outputLandmarks.buffer,
1: outputLips.buffer,
2: outputLeftEyeBrow.buffer,
3: outputRightEyeBrow.buffer,
4: outputLeftIris.buffer,
5: outputRightIris.buffer,
6: outputScores.buffer,
};
interpreter.runForMultipleInputs(inputs, outputs);
final score = outputScores.getDoubleList()[0];
if (score < 0) {
return null;
}
final landmarkPoints = outputLandmarks.getDoubleList().reshape([468, 3]);
var leftIrisPoints = outputLeftIris.getDoubleList().reshape([5, 2]);
var rightIrisPoints = outputRightIris.getDoubleList().reshape([5, 2]);
final landmarkResults = <List<double>>[];
for (var point in landmarkPoints) {
landmarkResults.add([point[0], point[1], point[2]]);
}
for (var point in leftIrisPoints) {
landmarkResults.add([point[0], point[1], 0]);
}
for (var point in rightIrisPoints) {
landmarkResults.add([point[0], point[1], 0]);
}
return {'facemesh': landmarkResults};
}