C# EmguCv中使用哪种策略进行SVM分类?

C# EmguCv中使用哪种策略进行SVM分类?,c#,opencv,svm,emgucv,face-recognition,C#,Opencv,Svm,Emgucv,Face Recognition,目前我正在做我的学术项目(社交媒体网站)。我的意图是,当用户发布一张图像时,系统应该识别该人脸并在其上贴上她的名字 作为之前的工作,我创建了5个用户。 对于训练图像,当用户设置其个人资料照片时,系统将使用EmguCv(DetectHarCascade)检测它,并将图像保存为文件夹中的位图。该面的标签将是用户的用户Id,标签保存在文件夹中的文本文件中。 作为培训图片,我上传并为每个用户标记了10张图片 下一部分是当用户发布照片时。系统应该识别人脸,并在其上贴上她的名字。我正在使用支持向量机进行识别

目前我正在做我的学术项目(社交媒体网站)。我的意图是,当用户发布一张图像时,系统应该识别该人脸并在其上贴上她的名字

作为之前的工作,我创建了5个用户。 对于训练图像,当用户设置其个人资料照片时,系统将使用EmguCv(DetectHarCascade)检测它,并将图像保存为文件夹中的位图。该面的标签将是用户的用户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] + "%");
       }
   }
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);
//人脸检测
MCvAvgComp[][]面检测=灰色。检测ARCASCADE(
哈尔,
1.2,
4.
HAAR_检测类型。DO_CANNY_修剪,
新尺寸(20,20));
foreach(检测到面中的MCvAvgComp f[0])
{
结果=currentFrame.Copy(f.rect).Convert().Resize(100100,Emgu.CV.CvEnum.INTER.CV\u INTER\u CUBIC);
//开始时,我将所有现有图像添加到列表中培训图像和标签以列出标签
培训图像。添加(结果);
labels.Add(会话[“UserId”].ToString())
File.WriteAllText((Server.MapPath(“~/TrainedFaces/TrainedLabels.txt”)),trainingImages.ToArray().Length.ToString()+“%”;
对于(int i=1;i
我的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);
/*
1.将所有图像加载到trainingImages
2.将所有标签加载到标签
*/
//将我的labesl和图像转换为矩阵以准备训练数据和训练标签
矩阵TrainindData=新矩阵(trainingImages.Count,100*100);
int ii=0;
foreach(培训图像中的图像img)
{
int jj=0;
矩阵Imagemtrx=新矩阵(img.宽度,img.高度);
图像复制到(图像MTRX);
对于(int k=0;k
我的识别和分类代码:

    //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] + "%");
       }
   }
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);
MCvAvgComp[]faces=grayFrame.detectsaarcascade(haar,1.2,10,haar_检测类型。DO_CANNY_修剪,新大小(20,20));
foreach(面[0]中的MCvAvgComp面)
{
InputFrame.Draw(face.rect,新Bgr(颜色.红色),1);
t=t+1;
Image result=InputFrame.Copy(face.rect).Convert().Resize(100100,Emgu.CV.CvEnum.INTER.CV\u INTER\u CUBIC);
//结果;
矩阵TestImageMatix=新矩阵(结果.宽度,结果.高度);
结果:复制到(Testimagmatix);
矩阵TestData=新矩阵(1,结果.宽度*结果.高度);
int z=0;
对于(int k=0;k
现在的问题是,当我上传一张属于任何一个现有类别的图片时,它会正确识别这个人。但是当我发布一张不同的照片(社交媒体上没有的人的照片)时,它就会被分配到一个现有的类别标签上

我的问题是:

  • 我只想识别正确的人。剩余的可以标记为未知或其他(我不知道是否需要任何其他方法)

  • 我阅读了关于一对一和一对所有策略的文章。我的代码中使用了哪一种策略

  • 如果没有人使用,那么如何实现它们

  • Emgu CV已经包含SVM。它使用哪种类型

  • 我读过关于一对一和一对所有策略的文章。我的代码中使用了哪种策略?如果没有使用,那么如何实现它们?Emgu CV已经包含了SVM。它使用了哪种类型

    您使用的是一对所有策略,该策略在OpenCV中使用
    n*(n-1)/2
    One-vs-One分类器实现(
    n
    是标签的数量)

    我只想识别正确的人。剩余的可以标记为未知或其他(我不知道是否需要任何其他方法)

    您可以构建
    n*(n-1)/2
    One Vs One分类器,然后从
    predict
    获取原始响应(仅适用于2类问题)。大多数响应识别输出类。 如果分类类的最大响应低于阈值,则如果正确识别,可以说该类没有响应

    或者您可以使用