使用opencv的hog实现

时间:2014-10-08 10:01:14

标签: c++ opencv

我想使用opencv的hog实现来检测图像中的物体。我在opencv的文件夹示例中找到了peopledetect.cpp,它们是使用预训练模型的hog算法的默认实现。通过一点谷歌搜索,我发现这种默认方法并不令人满意。我必须使用libSvm创建自己的模型。我的第一个问题是有没有解释此过程的教程或示例?第二,我的模特想要学习什么?什么是我训练样本?只包含人物的图片?

编辑问题:是否有机会训练一个单一的模型,只包含人体图像?我想了解代码in here。它计算数据库的生猪特征并训练svm模型。在评估过程中,它使用带有detectMultiScale的hog级联。 detectMultiScale与SVM的关系是什么?

我训练了一个带有线性内核的libsvm,其中提供的图像为from here。图像有两种,一种是人,另一种是人。火车结果接近98%(wuth svm_predict)。如何在测试图像中找到物体的位置?我可以为此目的使用detectmultiscale吗?使用svm模型提供多重功能?我注意到在我的svm模型中,一些支持向量在行的开始时没有标签而是只有符号。这是正常的,还是可能是一个错误?

Hogcascade似乎它对我不起作用(见image中):

CascadeClassifier body_cascade;
body_cascade.load("cascades/hogcascade_pedestrians.xml");    
Mat image, gray_image;
image = imread( fileName, 1 );
resize(image, image, Size(150, 200));

vector<Rect> bodies;
cvtColor(image, gray_image, CV_BGR2GRAY);
body_cascade.detectMultiScale( gray_image, bodies, 1.3, 5 );
cout << "size of detection" << bodies.size() << endl;

每次我得到0个尸体。

2 个答案:

答案 0 :(得分:2)

  1. 这个程序非常直截了当。从图像中提取HOG特征,创建训练向量,分配标签并将其提供给分类器以进行学习。 This将是一个很好的实验场所。我不确定this是多么有效,但它绝对是一个很好的来源。还有一些智慧here
  2. 您的模型应该了解人物的HOG特征。一个训练样本将是HOG特征向量(而不是直接图像本身)。对于否定类,它将再次成为不包含人物的图像的HOG功能。

答案 1 :(得分:2)

  1. 拍摄一堆包含人物的图片。你需要所有标有周围矩形的人。
  2. 将这些投资回报率转换为HOG功能(这些将是积极的培训数据)。还将非人物区域的图像转换为HOG特征(负面训练数据)。 HOG功能需要具有相同的维度。在相应的论文中查看最佳参数,即每个矩形有多少HOG细胞,每个HOG细胞的维数(通常为31)。这要求所有矩形具有相同的宽高比(我认为)。
  3. 训练分类器。您的训练数据是您在上一步中计算的所有功能,正面训练数据(HOG功能指人)的标签为+1,负面训练数据为-1。您可以将这两个传递给libsvm。再次,阅读论文,看看他们用于训练SVM的参数。我猜测它是一个线性SVM,可能具有L1距离测量,因为HOG是非常多的直方图,直方图不能很好地与L2规范一起使用。但那只是猜测。
  4. Libsvm将返回一个模型。您应该通过测量测试数据的精确度/召回率来测试它的好坏程度。 (或测量ROC,或任何你想要的)。 Libsvm也有这个功能。