用于人员检测的Emgu Train SVM - C#

时间:2016-05-04 12:53:00

标签: c# opencv image-processing svm emgucv

我在网上搜索了很多,找不到任何简单的解决方案。

我正在尝试创建一个人员检测器,对于这个项目我选择了Emgu库。

现在我能够发现人,但没有很好的成功率。

我正在尝试训练我的SVM,我在这篇文章中看到:SVM classifier based on HOG features for “object detection” in OpenCV我需要培训的过程:

  

步骤1)准备一些您想要检测的物体的训练图像(阳性样本)。此外,您还需要准备一些没有感兴趣对象的图像(负样本)。

     

步骤2)检测训练样本的HOG特征,并使用此功能训练SVM分类器(也在OpenCV中提供)。

     

步骤3)在HOGDescriptor :: setSVMDetector()方法中使用训练的SVM分类器的系数。

我有一些训练图像,我正在使用这行代码来提取HOG功能:

public static Image<Bgr, Byte> Resize(Image<Bgr, Byte> im)
    {
        return im.Resize(64, 128,   Inter.Linear);
    }
    public static float[] GetVector(Image<Bgr, Byte> im)
    {
        HOGDescriptor hog = new HOGDescriptor();    // with defaults values
        Image<Bgr, Byte> imageOfInterest = Resize(im);
        Point[] p = new Point[imageOfInterest.Width * imageOfInterest.Height];
        int k = 0;
        for (int i = 0; i < imageOfInterest.Width; i++)
        {
            for (int j = 0; j < imageOfInterest.Height; j++)
            {
                Point p1 = new Point(i, j);
                p[k++] = p1;
            }
        }

        return hog.Compute(imageOfInterest, new Size(8, 8), new Size(0, 0), p);
    }

但我无法找到如何训练我的SVM(上述步骤中的第2步)。

2 个答案:

答案 0 :(得分:1)

我已经能够做到这一点。 注意:它有一些问题我还没有解决过多的HoG功能。

代码是:

//GetVector - function from people detection file 
float[] hog = GetVector(new Image<Bgr, byte>(image));

 svm.TrainAuto(new TrainData(training_mat, Emgu.CV.ML.MlEnum.DataLayoutType.RowSample, lables));

答案 1 :(得分:0)

使用OpenCV进行人体检测并不简单(EmguCV只是C#包装器)。人们可以采取不同的姿势:正面,侧面,双手向上/向下等。这比使用HAAR级联(http://docs.opencv.org/3.1.0/d7/d8b/tutorial_py_face_detection.html#gsc.tab=0)检测面部更复杂。

你需要重新考虑你的方法,因为你有更好的机会使用XBox Kinect。 Kinect SDK具有检测人员的必要功能。看看这个答案:https://stackoverflow.com/a/10584231/1786034