(逻辑递归)对图像数据进行执行训练的时候,一直报错

问题:通过opencvsharp的ML.LogisticRegreession(逻辑递归)对图像数据进行执行训练的时候,一直报错
报错信息:

OpenCvSharp.OpenCVException
  HResult=0x80131500
  Message=**check training parameters. Invalid training classifier**
  Source=OpenCvSharp
  StackTrace:
   在 OpenCvSharp.Internal.NativeMethods.<>c.<.cctor>b__1682_0(ErrorCode status, String funcName, String errMsg, String fileName, Int32 line, IntPtr userData)OpenCvSharp.Internal.NativeMethods.ml_StatModel_train2(IntPtr obj, IntPtr samples, Int32 layout, IntPtr responses, Int32& returnValue)
   在 OpenCvSharp.ML.StatModel.Train(InputArray samples, SampleTypes layout, InputArray responses)
   在 TargetMeasureObject.Program.Main(String[] args) 在 D:\Jay.Lee\Study\2023\OPCV_OBJECT\TargetMeasureObject\Program.cs 中: 第 143

img

源代码如下:

Mat trainData = new Mat(0, 0, MatType.CV_32FC1);
                    Mat trainLabel = new Mat(0, 0, MatType.CV_32FC1);
                    Mat validData = new Mat(0, 0, MatType.CV_32FC1);
                    Mat validActv = new Mat(0, 0, MatType.CV_32FC1);
                    string[] trainFiles = Directory.GetFiles(trainPath,"*.png");
                    string[] validFiles = Directory.GetFiles(validPath, "*.png");
                    foreach(var fname in trainFiles)
                    {
                        int label = fname[fname.IndexOf('_') - 1]-'0';
                        Mat temp = Cv2.ImRead(fname, ImreadModes.Grayscale).
                            Threshold(0, 255, ThresholdTypes.Otsu).
                            Resize(new Size(STAND_WIDTH, STAND_HEIGHT)).
                            Reshape(0, 1);
                        temp.ConvertTo(temp, MatType.CV_32FC1);
                        trainData.PushBack(temp);
                        trainLabel.PushBack((float)label);
                    }
                    foreach (var fname in validFiles)
                    {
                        int label = fname[fname.Length - 1] - '0';
                        Mat temp = Cv2.ImRead(fname, ImreadModes.Grayscale).
                            Threshold(0, 255, ThresholdTypes.BinaryInv).
                            Resize(new Size(STAND_WIDTH, STAND_HEIGHT)).
                            Reshape(0, 1);
                        temp.ConvertTo(temp, MatType.CV_32FC1);
                        validData.PushBack(temp);
                        validActv.PushBack((float)label);
                    }
                    using (var lg1 = OpenCvSharp.ML.LogisticRegression.Create())
                    {
                        lg1.LearningRate = 0.001;
                        lg1.IsEnabledDispose = true;
                        lg1.MiniBatchSize = 5;
                        lg1.Regularization = LogisticRegression.RegKinds.RegL1;
                        lg1.Iterations = 100;
                        lg1.TrainMethod = LogisticRegression.Methods.MiniBatch;
                        lg1.TermCriteria = TermCriteria.Both(1000, 1e-5) ;
                        lg1.Train(trainData, SampleTypes.RowSample, trainLabel);
                        Mat predict = new Mat();
                        lg1.Predict(validData, predict);
                    }

源于chatGPT仅供参考

根据提供的信息,你正在使用 OpenCvSharp 的 ML.LogisticRegression 对图像数据进行训练,并且遇到了一个错误。

错误信息显示为:**check training parameters. Invalid training classifier**。这意味着你的训练参数或分类器无效。

在你的代码中,训练参数和分类器是由 LogisticRegression 类的实例 `lg1` 控制的。请确保你提供的参数正确并适用于你的训练数据集。以下是一些可能导致问题的原因和建议的解决方案:

1. 检查训练数据的尺寸和类型:确保 `trainData``trainLabel` 的维度和数据类型与训练模型兼容。可通过打印它们的形状和数据类型来检查。

2. 确认你的标签是正确的:在你的代码中,你从文件名中提取了标签,但提取可能会出错。请确保正确提取到了正确的标签值,并将其添加到 `trainLabel` 中。

3. 调整训练参数:检查你设置的学习率、迭代次数、正则化方法等参数是否合适。有时候调整这些参数可以解决训练过程中的问题。

4. 检查图像处理步骤:确认你的图像预处理步骤(如二值化、大小调整等)是否正确,并且输出的图像尺寸和类型与训练模型兼容。

除了上述建议之外,你可以尝试使用更详细的错误追踪来确定问题所在。检查是否有其他错误信息提供了更具体的提示。

如果你仍然无法解决问题,请提供更多代码和错误信息,以便我能够更准确地帮助你找到解决方案。