Как использовать CenterFace в ML.NET? Модель ожидает форму (10, 3, 32, 32)C#

Место общения программистов C#
Ответить
Anonymous
 Как использовать CenterFace в ML.NET? Модель ожидает форму (10, 3, 32, 32)

Сообщение Anonymous »

Я пытаюсь использовать CenterFace ONNX в ML.NET и постоянно получаю различные ошибки, в основном связанные с размером входных данных.
Метаданные 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();
}
И эта реализация дает мне все 4 слоя, после моделирования я получаю нужные значения.

Подробнее здесь: https://stackoverflow.com/questions/791 ... 10-3-32-32
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»