问题:通过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 行
源代码如下:
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. 检查图像处理步骤:确认你的图像预处理步骤(如二值化、大小调整等)是否正确,并且输出的图像尺寸和类型与训练模型兼容。
除了上述建议之外,你可以尝试使用更详细的错误追踪来确定问题所在。检查是否有其他错误信息提供了更具体的提示。
如果你仍然无法解决问题,请提供更多代码和错误信息,以便我能够更准确地帮助你找到解决方案。