使用hog实现opencv

Using hog implementation of opencv

本文关键字:opencv 实现 hog 使用      更新时间:2023-10-16

我想使用opencv的hog实现来检测图像中的身体。我在opencv的文件夹中发现了peopledetect.cpp样本,这是使用预训练模型的hog算法的默认实现。通过一点谷歌搜索,我发现这种默认方法并不能令人满意地工作。我必须使用libSvm创建自己的模型。我的第一个问题是,有什么教程或例子可以解释这个过程吗?第二个问题,我的模型应该学习什么?我的训练样本是什么?只包含人的图像?

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

我已经用这里提供的图像训练了一个具有线性内核的libsvm。图像有两种,一种是有人的图像,另一种是没有人的图像。训练结果接近98%(wuth svm_predict)。如何在测试图像中定位身体的位置?我可以使用detectmultiscale吗?用svm模型馈送多个cadlefunction?我在我的svm模型中注意到,一些支持向量在开始时没有标签,但只有符号。这是正常的吗,还是可能是错误?

Hoggcascade似乎对我不起作用(如图所示):

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个尸体。

  1. 拍摄一组包含人物的图像。你需要用一个矩形标记所有人
  2. 将这些ROI转换为HOG特征(这些将是积极的训练数据)。还将图像的非人物区域转换为HOG特征(负训练数据)。HOG特征需要具有相同的尺寸。在各自的论文中查看最佳参数,即每个矩形有多少HOG单元,每个HOG单元的维度(通常为31)。这要求所有矩形都具有相同的纵横比(我认为)
  3. 训练分类器。您的训练数据是您在上一步中计算的所有特征,正面训练数据(指人的HOG特征)的标签为+1,负面训练数据的标签为-1。您可以将这两者都传递给libsvm。再次,阅读论文,看看他们使用了哪些参数来训练SVM。我猜这是一个线性SVM,可能具有L1距离度量,因为HOG是非常多的直方图,而直方图与L2范数不太匹配。但这只是猜测
  4. Libsvm将返回一个模型。你应该通过测量你的测试数据的精确度/召回率来测试它有多好。(或者测量ROC,或者任何你想要的)。Libsvm也有这个功能
  1. 这个程序在纸面上很直接。从图像中提取HOG特征,创建训练向量,分配标签并将其交给分类器进行学习。这将是一个很好的实验场所。我不确定这有多有效,但它绝对是一个很好的来源。这里也有一些智慧
  2. 你的模型应该了解一个人的图像的HOG特征是什么样子的。一个训练样本将是HOG特征向量(而不是直接图像本身)。对于负面类,它将再次是不包含人的图像中的HOG特征