1

我是新手,我正在使用 opencv2.4.4 和 Visual Studio 2010,我正在运行包中的示例 peopledetect.cpp 及其编译和运行,但我想详细了解源代码。在 peopledetect.cpp是否已经为 peopledetection 构建/训练了 hog 描述符 3780 个向量被输入到 svm 分类器中?当我尝试调试 peopledetect.cpp 时,我只能发现 HOGDescriptor 创建了 hog 描述符和检测器,我基本上不明白这个 API 做了什么HOGDescriptor因为我看到peopledetect.cpp没有经过 hog 处理的步骤,它加载了已经训练好的向量到 svm 分类器来检测人/没有人,我错了吗?因为没有关于此的文档。

任何人都可以请简要介绍一下。

4

4 回答 4

2

opencv中人物检测算法的实现是基于HOG描述符作为特征,SVM作为分类器。

1.训练数据库(正样本作为人,负样本作为非人)用于学习 SVM 参数(它计算和存储支持向量)。还执行交叉验证(我假设)以优化软边距参数 C 和内核参数(它可能是线性内核)。

2.为了检测测试视频数据的人,peopledetect.cpp加载预学习的 SVM,计算不同位置和尺度的 HOG 描述符,然后合并具有高检测分数的窗口(二进制 SVM 分类器的输出)。

这是一篇很好的论文(inria)。

于 2013-04-16T16:02:54.927 回答
2

为了得到更清晰的答案,peopledetect.cpp 经历了所有的猪步骤。深入挖掘我更清楚。基本上,如果你调试 peopledetect.cpp 会经历这些步骤。

在此处输入图像描述

最初图像被分成几个尺度,scale0(1.05)是检测窗口增加的系数。对于图像的每个尺度,从窗口中提取特征并运行分类器窗口,就像上面一样,它遵循尺度空间金字塔方法。所以它相当大的计算过程,非常昂贵,所以 opencv 团队试图为每个规模进行并行化。在为什么我无法调试/完成这些步骤之前,我感到很困惑,这个 parallel_for_(Range(0, (int)levelScale.size()),HOGInvoker()) 创建了几个线程,每个线程在每个规模上工作,取决于多少线程或创建了这样的东西。因此我无法调试,我所做的是冻结所有线程并仅调试主线程。对于不同尺度的图像 hog 处理步骤是

在此处输入图像描述

在 peopledetect.cpp hog 和分类器窗口有点结合。在单个窗口(64x128)中,特征提取和运行分类器都发生了。之后对图像的每个比例完成此操作。有许多不同尺度的行人窗口通常与这个区域相关联,这是使用 grouprectangle() 函数分组的

于 2013-04-25T14:31:10.393 回答
1

训练 SVM 包括找到正样本和负样本之间最大边距的参数。

如果对 1000 多个负样本和正样本进行相同的特征提取,那么一定有数百万个特征仪式吗?

是的。这些系数是从训练数据库中提取的。你没有它们。SVM 仅存储足以表征边距的支持向量。例如,参见对偶形式的线性 SVM。

许多不同尺度的行人窗通常与该区域相关联

真的。应用合并功能。可以使用不同的方法(例如groupRectangles(..))(请参见此处)并接受给定的参数参数detectMultiScale(..)

于 2013-04-19T11:49:08.860 回答
0

我从不同的论文中了解到,使用 hog 的特征提取是使用几个正负图像完成的,提取的这些特征被馈送到线性 SVM 来训练它们,所以 peopledetect.cpp 使用这个训练好的线性 SVM 样本,所以这个特征提取过程不是由 peopledetect.cpp 完成的,即 HOGDescriptor::getDefaultPeopleDetector() 由为人员检测训练的分类器的系数组成。从 hog detection/window(64x128) 中提取的特征总长度为 3780(4 个单元 x 9 个 bin x 7 x 15 个块 = 3780)个特征。然后使用这些特征来训练线性 SVM 分类器。如果对 1000 多个负样本和正样本进行相同的特征提取,那么必须有数百万个特征仪式吗?我们如何获得这些系数?

但是已知 HOG 描述符包含冗余信息,因为使用了不同的检测窗口大小。所以当 SVM 分类器将一个区域分类为“行人”时,往往会与该区域关联多个不同尺度的行人窗口。peopledetect.cpp 主要做的是 (hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 2);) 检测窗口在图像的所有位置进行扫描并且尺度,并且在输出金字塔上运行传统的非最大抑制来检测对象实例。

于 2013-04-18T14:36:44.643 回答