在用于SVM分类的EmguCv中使用了哪种策略
本文关键字:策略 SVM 用于 分类 EmguCv | 更新日期: 2023-09-27 18:22:21
目前我正在做我的学术项目(社交媒体网站)。我的意图是,当用户发布图像时,系统应该识别人脸并用她的名字标记它。
作为之前的工作,我创建了5个用户。对于训练图像,当用户设置她的个人资料照片时,系统将使用EmguCv(DetectHaarCascade)进行检测,并将图像保存为文件夹中的位图。该面的标签将是用户的用户Id,标签保存在文件夹中的文本文件中。作为训练图像,我为每个用户上传并标记了10张图像。
下一部分是当用户发布照片时。系统应该识别这张脸,并用她的名字给它贴上标签。我正在使用支持向量机进行识别和分类。
我的检测代码:
//Face Detection
MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(
haar,
1.2,
4,
HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
new Size(20, 20));
foreach (MCvAvgComp f in facesDetected[0])
{
result = currentFrame.Copy(f.rect).Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
// at the beginning i am added all the existing images to an List<Image<Gray, byte>> trainingImages and labels to List<string> labels
trainingImages.Add(result );
labels.Add(Session["UserId"].ToString())
File.WriteAllText((Server.MapPath("~/TrainedFaces/TrainedLabels.txt")), trainingImages.ToArray().Length.ToString() + "%");
for (int i = 1; i < trainingImages.ToArray().Length + 1; i++)
{
//saving the trained images and labells
trainingImages.ToArray()[i - 1].Save(Server.MapPath("~/TrainedFaces/") + "face" + i + ".bmp");
File.AppendAllText(Server.MapPath("~/TrainedFaces/TrainedLabels.txt"), labels.ToArray()[i - 1] + "%");
}
}
我的SVM训练代码:
/*
1. Loaded all the images to trainingImages
2.Loaded all the labels to labels
*/
// Converting My labesl and images to Matrix for preparing training data and training label
Matrix<float> TrainindData = new Matrix<float>(trainingImages.Count, 100 * 100);
int ii = 0;
foreach (Image<Gray, float> img in trainingImages)
{
int jj = 0;
Matrix<float> Imagemtrx = new Matrix<float>(img.Width, img.Height);
img.CopyTo(Imagemtrx);
for (int k = 0; k < Imagemtrx.Rows; k++)
{
for (int j = 0; j < Imagemtrx.Cols; j++)
{
TrainindData.Data[ii, jj] = Imagemtrx[k, j];
jj++;
}
}
ii++;
}
Matrix<float> TrainedLabels = new Matrix<float>(labels.Count, 1);
int kk = 0;
foreach (int lab in labels)
{
TrainedLabels[kk, 0] = lab;
kk++;
}
SVM model = new SVM();
SVMParams p = new SVMParams();
p.KernelType = Emgu.CV.ML.MlEnum.SVM_KERNEL_TYPE.LINEAR;
//p.SVMType = Emgu.CV.ML.MlEnum.SVM_TYPE.ONE_CLASS;
p.SVMType = Emgu.CV.ML.MlEnum.SVM_TYPE.C_SVC;
p.C = 1;
p.TermCrit = new MCvTermCriteria(100, 0.00001);
bool trained = model.Train(TrainindData, TrainedLabels, null, null, p);
我的识别和分类代码:
MCvAvgComp[][] faces=grayFrame.DetectHaarCascade(haar,1.2,10,HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,new Size(20, 20));
foreach (MCvAvgComp face in faces[0])
{
InputFrame.Draw(face.rect, new Bgr(Color.Red), 1);
t = t + 1;
Image<Gray, float> result = InputFrame.Copy(face.rect).Convert<Gray, float>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
//result._EqualizeHist();
Matrix<float> TestImageMatix = new Matrix<float>(result.Width, result.Height);
result.CopyTo(TestImageMatix);
Matrix<float> TestData = new Matrix<float>(1, result.Width * result.Height);
int z = 0;
for (int k = 0; k < TestImageMatix.Rows; k++)
{
for (int j = 0; j < TestImageMatix.Cols; j++)
{
TestData.Data[0, z] = TestImageMatix[k, j];
z++;
}
}
//Here I will Get the UserId as class label. I can find name from database using this Id
float result1 = model.Predict(TestData);
现在的问题是,当我上传一个属于任何现有类的图像时,它会正确识别和识别这个人。但当我发布一张不同的照片(一个不在社交媒体上的人的照片)时,它就会被分配给现有的班级标签之一。
我的问题是:
我只想确定合适的人。剩余的可以标记为未知或其他什么(我不知道是否需要任何其他方法)
我读过关于一对一和一对所有策略的文章。我的代码中使用了哪一个?
如果没有人被使用,那么如何实现它们?。
Emgu CV已经包含SVM。它使用哪种类型?
我读过关于一对一和一对所有策略的文章。我的代码中使用了哪一个?如果没有人被使用,那么如何实现它们?Emgu CV已经包含SVM。里面用的是哪种类型?
您使用的是一对一策略,该策略在OpenCV中使用n*(n-1)/2
一对一分类器(n
是标签数)实现。
我只想找到合适的人。剩余的可以标记为未知或其他什么(我不知道是否需要任何其他方法)
您可以构建n*(n-1)/2
One-V-One分类器,然后从predict
获得原始响应(仅适用于2类问题)。大多数响应标识输出类。如果已分类类的最大响应低于阈值,则可以说该类中没有一个被正确识别。
或者,您可以使用n
一类分类器,并再次检查每个分类器的响应是否低于给定的阈值。