В этой
статье показывается использования предобученный модели tinyyolov2-8.onnx в c# с помощью ML.Net. И я хочу обучить её на своих данных, чтобы она могла определять лебедей, а в дальнейшем и их подвиды. Я использовал программу vott чтобы сделать датасет с лебедями и экспортировать его в csv формате.
Но после обучения
Data = context.Data.LoadFromTextFile<InputData>(DataPath, separatorChar: ',');
var model = pipeline.Fit(Data);
Нейросеть ошибается даже на тех же самых данных, что были в датасете.
Вот мой пайплайн:
var pipeline = context.Transforms.LoadImages(
outputColumnName: "image",
imageFolder: "",
inputColumnName: nameof(InputData.ImagePath))
.Append(context.Transforms.ResizeImages(
outputColumnName: "image",
imageWidth: ImageNetSettings.imageWidth,
imageHeight: ImageNetSettings.imageHeight,
inputColumnName: "image"))
.Append(context.Transforms.ExtractPixels(outputColumnName: "image"))
.Append(context.Transforms.ApplyOnnxModel(
modelFile: OnnxModel,
outputColumnNames: new[] { TinyYoloModelSettings.ModelOutput },
inputColumnNames: new[] { TinyYoloModelSettings.ModelInput }));
Вот сам метод predict()
if (imputImage != "")
{
Data = context.Data.LoadFromTextFile<InputData>(DataPath, separatorChar: ',');
var model = pipeline.Fit(Data);
Data = context.Data.LoadFromEnumerable(new List<InputData>() { new InputData() { ImagePath = imputImage } });
var predictions = model.Transform(Data);
var predictedData = context.Data.CreateEnumerable<OutputData>(predictions, reuseRowObject: false);
var originalImage = Image.FromFile(imputImage);
var resultImage = new Bitmap(originalImage);
var resultGraphics = Graphics.FromImage(resultImage);
resultGraphics.SmoothingMode = SmoothingMode.AntiAlias;
List<float[]> probabilities = new List<float[]>();
foreach (var prediction in predictedData)
probabilities.add(prediction.PredictedLabels);
YoloOutputParser parser = new YoloOutputParser();
var boundingBoxes =
probabilities
.Select(probability => parser.ParseOutputs(probability))
.Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F));
IList<YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(0);
var drawing = new YoloBoundingBox();
return (drawing.ToImageSource(drawing.DrawBoundingBox(imputImage, outputImage, "Лебедь", detectedObjects)), detectedObjects.Count());
}
return (null, 0);
Почему
pipeline.Fit(Data)
не работает?