【问题标题】:Using hog implementation of opencv使用opencv的hog实现
【发布时间】:2014-12-02 22:52:11
【问题描述】:

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

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

我已经训练了一个带有线性内核的 libsvm,并提供了 from here 的图像。图像有两种,一种是包含人的,一种是没有人的。训练结果接近 98%(wuth svm_predict)。如何在测试图像中定位身体的位置?我可以为此目的使用detectmultiscale吗?用 svm 模型喂 multiscallefunction?我注意到在我的 svm 模型中,一些支持向量在行的开头没有标签,但只有符号。这是正常现象,还是可能是错误?

Hogcascade 似乎对我不起作用(f.e 在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 个尸体。

【问题讨论】:

  • 请注意,除了 svm 解决方案之外,您还可以为 persons 训练具有 HOG 特征的 CascadeClassifier。
  • 酷,我去看看! DetectmultiScale 仅适用于级联模型?
  • 我想是的。 (您是在问,是否可以从 svmdetector 获得 rects?)
  • 我觉得这个作品可以帮到你:geocities.ws/talh_davidc

标签: c++ opencv


【解决方案1】:
  1. 该过程在纸面上非常简单。从图像中提取 HOG 特征,创建训练向量,分配标签并将其提供给分类器进行学习。 This 将是一个很好的实验场所。我不确定this 的效果如何,但它绝对是一个很好的来源。还有一些智慧here
  2. 您的模型应该了解人物图像的 HOG 特征。一个训练样本将是 HOG 特征向量(而不是直接图像本身)。对于负类,它将再次是来自不包含人的图像的 HOG 特征。

【讨论】:

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

    【讨论】:

    • 我已经训练了一个带有线性内核的 libsvm,其图像从这里pascallin.ecs.soton.ac.uk/challenges/VOC 提供。图像有两种,一种是包含人的,一种是没有人的。训练结果接近 98%(wuth svm_predict)。如何在测试图像中定位身体的位置?我可以为此目的使用detectmultiscale吗?用 svm 模型馈送多尺度函数?
    • 训练结果完全没用知道。这就是为什么你总是在测试中评估!对于检测,您必须在多个尺度上评估您的模型/过滤器。我不知道哪些函数只是在多个尺度上使用非最大值抑制的滑动窗口方法。
    • 训练集必须有多干净?我的意思是,我的训练集,正样本非常嘈杂。这是个问题吗?
    • 1) 我不知道您所说的“嘈杂”是什么意思。图像是否因为高 ISO 而嘈杂,还是有很多误报训练数据? 2) 试试看怎么样?
    猜你喜欢
    • 2017-01-14
    • 1970-01-01
    • 2012-07-22
    • 2014-03-16
    • 2014-10-11
    • 1970-01-01
    • 2023-03-27
    • 2012-10-18
    • 2015-10-05
    相关资源
    最近更新 更多