问题:通过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);
}