Метаданные CenterFace указывают на то, что входные данные должны иметь значение 10, 3. , 32, 32, что уже не имеет смысла для обнаружения изображений — какой смысл кормить алгоритм 10 пакетами по 32x32 пикселя каждый?
Вот мой главный код:
Код: Выделить всё
string modelPath = "centerface.onnx";
var mlContext = new MLContext();
string imagePath = "photo1.jpg";
var img = Image.FromFile(imagePath);
var DH = (int)(Math.Ceiling((float)img.Height / 32) * 32);
var DW = (int)(Math.Ceiling((float)img.Width / 32) * 32);
var inputData = new[] { new ModelInput { ImagePath = imagePath } };
IDataView imageData = mlContext.Data.LoadFromEnumerable(inputData);
var pipeline = mlContext.Transforms.LoadImages(outputColumnName: "input.1", imageFolder: "", inputColumnName: nameof(ModelInput.ImagePath))
.Append(mlContext.Transforms.ResizeImages(outputColumnName: "input.1", imageWidth: DW, imageHeight: DH))
.Append(mlContext.Transforms.ExtractPixels(outputColumnName: "input.1"))
.Append(mlContext.Transforms.ApplyOnnxModel(
outputColumnNames: ["537", "538", "539", "540"],
inputColumnNames: ["input.1"],
modelFile: modelPath
));
var model = pipeline.Fit(imageData);
var predictionEngine = mlContext.Model.CreatePredictionEngine(model);
var prediction = predictionEngine.Predict(new ModelInput { ImagePath = imagePath });
Код: Выделить всё
public class ModelInput
{
public string ImagePath { get; set; }
}
public class ModelOutput
{
[ColumnName("537")]
public float[] HeatMap { get; set; }
[ColumnName("538")]
public float[] Scale { get; set; }
[ColumnName("539")]
public float[] Offset { get; set; }
[ColumnName("540")]
public float[] Landmarks { get; set; }
}
System.ArgumentException: 'Длина памяти (3686400) должно соответствовать произведению измерений (30720).'
30720 явно равно 10x3x32x32. Но опять же, какой в этом смысл?
Я думаю, что мой ONNX сломан, но у меня есть работающая реализация с использованием OpenCVSharp:
Код: Выделить всё
// Here is computer DW and DH same way as in ML.NET example
CenterFaceParams p = new(image, resizedSize.Width, resizedSize.Height, scoreThreshold, nmsThreshold);
Size size = new(p.DW, p.DH);
using Mat input = new();
Cv2.Resize(image, input, size);
using Mat blobInput = CvDnn.BlobFromImage(input, 1.0, size, new Scalar(0, 0, 0), true, false);
_net.SetInput(blobInput, "input.1");
using (Mat heatMap = new())
using (Mat scale = new())
using (Mat offset = new())
using (Mat landmarks = new())
{
_net.Forward([heatMap, scale, offset, landmarks], ["537", "538", "539", "540"]);
CenterFaceDecoder decoder = new(heatMap, scale, offset, landmarks, p);
return decoder.GetOutput();
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... -in-ml-net
Мобильная версия