predict method

Map<String, dynamic>? predict(
  1. Image image
)

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};
}