我是新手,我正在使用opencv2.4.4和visual studio 2010,我正在运行包中的示例peopledetect.cpp及其编译和运行,但我想详细了解源代码。 peopledetect.cpp是构建/已经为人们检测训练的猪描述符3780个向量被送入svm分类器?当我尝试调试peopledetect.cpp我只能找到HOGDescriptor创建猪的描述符和检测器,我基本上不明白这个API做什么HOGDescriptor,因为我看到peopledetect.cpp没有经历生猪处理的步骤,它将已经训练好的矢量加载到svm分类器来检测人/没有人,我错了吗?由于没有关于此的文档。
任何人都可以对此进行简要介绍。
答案 0 :(得分:2)
opencv中人员检测算法的实现基于HOG描述符作为特征,SVM作为分类器。
1.
训练数据库(正面样本为人,负面样本为非人)用于学习SVM参数(它计算并存储支持向量)。交叉验证也是执行(我假设)优化软边距参数C和内核参数(它可能是线性内核)。
2.
为了检测测试视频数据的人,peopledetect.cpp
加载预先学习的SVM,计算不同位置和比例的HOG描述符,然后合并具有高检测分数的窗口(二进制输出) SVM分类)。
这是一个很好的paper(inria)。
答案 1 :(得分:2)
更明确的回答,peopledetect.cpp会经历所有的生猪步骤。 挖得更深我更清楚了。基本上,如果您调试peopledetect.cpp会执行这些步骤。
最初图像分为几个尺度,scale0(1.05)是检测窗口增加的系数。对于图像的每个比例,从窗口提取特征并运行分类器窗口,如上所述,它遵循尺度 - 空间金字塔方法。所以它非常庞大的计算过程,非常昂贵,所以opencv团队试图为每个规模进行并行化。 我之前感到困惑的是为什么我无法调试/完成这些步骤。这个parallel_for_(Range(0,(int)levelScale.size()),HOGInvoker())创建了几个线程,每个线程在每个比例上工作,取决于多少线程或创建这样的东西。 因为这个我无法调试,我所做的是冻结所有线程并仅调试主线程。对于不同尺度的图像生猪处理步骤
这里的peopledetect.cpp hog和classifier窗口有点结合。在单个窗口(64x128)中,都会进行特征提取和运行分类。在为每个图像比例完成此操作之后。有许多不同尺度的行人窗通常与这个区域相关联,这是使用grouprectangle()函数分组的
答案 2 :(得分:1)
训练SVM包括查找正样本和负样本之间的最大边距参数。
如果对1000+阴性和阳性样本进行相同的特征提取,那么必须有数百万个特征仪式吗?
是。这些系数从训练数据库中提取。你没有它们。 SVM仅存储足以表征边距的支持向量。例如,请参见线性SVM的dual form。
许多不同尺度的行人窗通常与该地区相关联
真。合并功能适用。可以使用不同的方法(例如groupRectangles(..)
)(参见here)并接受赋予detectMultiScale(..)
的参数参数。
答案 3 :(得分:0)
我从不同的论文中理解的是,使用猪的特征提取是使用几个正负图像完成的,这些提取的特征被提供给线性SVM来训练它们,所以peopledetect.cpp使用这个训练过的线性SVM样本,所以此功能提取过程不是由peopledetect.cpp完成的,即HOGDescriptor :: getDefaultPeopleDetector()由为人员检测而训练的分类器的系数组成。从猪检测/窗口(64x128)中提取的特征给出总长度3780(4个单元×9个箱子×7个×15个块= 3780个)的特征。然后,这些特征用于训练线性SVM分类器。如果对1000+阴性和阳性样本进行相同的特征提取,那么必须有数百万个特征仪式? 我们如何获得这些效率?
但由于使用了不同的检测窗口大小,已知HOG描述符包含冗余信息。因此,当SVM分类器将区域分类为“行人”时,不同尺度的多个行人窗通常与该区域相关联。 peopledetect.cpp主要做的是(hog.detectMultiScale(img,found,0,Size(8,8),Size(32,32),1.05,2);)检测窗口在所有位置扫描图像在输出金字塔上运行缩放和传统的非最大抑制以检测对象实例。