簡體   English   中英

EmguCv使用哪種策略進行SVM分類?

[英]Which strategy is used in EmguCv for SVM Classification?

目前,我正在做我的學術項目(社交媒體網站)。 我的意圖是,當用戶發布圖像時,系統應識別出該面部並為其貼上標簽。

作為先前的工作,我創建了5個用戶。 對於訓練圖像,當用戶設置她的個人資料照片時,系統將使用EmguCv(DetectHaarCascade)將其檢測出來並將圖像另存為位圖在文件夾中。 該臉部的標簽將是用戶的用戶ID,並且該標簽將保存在文件夾內的文本文件中。 作為訓練圖像,我為每個用戶上傳並標記了10張圖像。

下一部分是用戶發布照片的時間。 系統應識別該臉部並為其貼上名字。 我正在使用SVM進行識別和分類。

我的檢測代碼:

    //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);

現在的問題是,當我上傳屬於任何現有類別的圖像時,它將正確識別並識別該人。 但是,當我發布另一張(社交媒體中不存在的人的)照片時,會將其分配給現有班級標簽之一。

我的問題是:

  1. 我只想確定合適的人。 剩余的可以標記為“未知”或其他(我不知道是否需要其他方法)

  2. 我讀到了關於一對一的策略和一對一的所有策略。 我的代碼中使用了哪一個?

  3. 如果沒有人使用,那么如何實現呢?

  4. Emgu CV已包含SVM。 It中使用哪種類型?

我讀到了關於一對一的策略和一對一的所有策略。 我的代碼中使用了哪一個? 如果沒有人使用該如何實施? Emgu CV已包含SVM。 它使用哪種類型?

您使用的是“一對多”策略,該策略在OpenCV中使用n*(n-1)/2 1到1個分類器( n是標簽數)實現。

我只想確定合適的人。 剩余的可以標記為“未知”或其他名稱(我不知道是否需要其他方法)

您可以構建n*(n-1)/2 1對1個分類器,然后從predict獲得原始響應(僅適用於2類問題)。 大多數響應標識輸出類別。 如果分類類別的最大響應低於閾值,則可以說沒有一個類別被正確識別。

或者,您可以使用n個分類器,然后再次檢查每個分類器的響應是否在給定的閾值以下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM