public static float[] PredictCoordinates(Bitmap image, FloatContour chainPoints, double scale) { Trace.WriteLine("Predicting coordinates with " + AppSettings.MLModelFilename + " model using Emgu.TF.Lite / TensorFlow Lite"); var model = new MLModel(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), AppSettings.MLModelFilename)); var mlImage = ConvertDatabaseFinToMLImage(image, chainPoints, scale); var directBmp = new DirectBitmap(mlImage.Image); //var floatArray = directBmp.ToScaledRGBFloatArray(); // This must match what the model expects. E.g., this is what Keras on TF for Resnet uses: var floatArray = directBmp.ToScaledTensorFlowRGBPreprocessInput(); var coordinates = model.Run(floatArray); Trace.WriteLine("Raw predicted coordinates:"); // Scale/translate the coordinates back to the original image for (int i = 0; i < coordinates.Length; i++) { Trace.Write(" " + coordinates[i]); if (i % 2 == 0) { coordinates[i] = (float)((coordinates[i] / mlImage.XRatio + mlImage.XMin) * scale); } else { coordinates[i] = (float)((coordinates[i] / mlImage.YRatio + mlImage.YMin) * scale); } } Trace.WriteLine(" "); // Rescale the coordinates back to the original return(coordinates); }