结合多个特征向量,HOG和LBP

时间:2014-05-26 08:17:55

标签: matlab image-processing video-processing feature-extraction

我正在使用两个特征描述符,HOG和LBP进行人员检测。到目前为止,我使用简单的连接组合了这两个功能。但它有时会显示由于大矢量引起的问题。这是我的代码。

%extract features from negative and positive images

[HOGpos,HOGneg] = features(pathPos, pathNeg);  


% loading and labeling each training example
HOG_featV = HOGfeature(fpos,fneg);   


% get label of training data from HOG
HOGlabel  = cell2mat(HOG_featV(2,:));

% get the feature vector value from HOG
HOGfeatureVector = HOG_featV(3,:)';

C = cell2mat(HOGfeatureVector); % each row of P correspond to a training example 




%extract features from LBP
[LBPpos,LBPneg] = LBPfeatures(pathPos, pathNeg);


% loading and labeling each training example
LBP_featV = loadingV(LBPpos, LBPneg); 


% get label of training data from LBP
LBPlabel = cell2mat(LBP_featV(2,:));

% get feature vector value from LBP
LBPfeatureVector = LBP_featV(3,:);
M = cell2mat(LBPtP)'; % each row of P correspond to a training example


%concatenate HOG and LBP feature
featureVector = [C M];

我想知道,是否有任何方法可以将两个特征向量组合起来更可靠,更快速?如果是,请提供一些我可以参考的建议或链接。谢谢。

1 个答案:

答案 0 :(得分:5)

我从您那里了解到以下内容: 您正在选择图像中的1845个关键点。对于每个点,您计算长度为383的特征向量(LBP + HOG组合)。表示图像的总矢量长度约为100,000。

如果实际上你只有1845个图像,并且每个图像仅由383个特征表示,那么你注定要失败并且你的SVM将具有非常高的错误率。主要是因为(特征向量太短,训练图像量太小)。所以我认为情况并非如此

您的方法存在一些问题。

  1. 您似乎不了解探测器和分类器之间的区别,并且您正在尝试应用分类器来解决检测问题。有一个核心差异。分类器旨在区分2个(或更多)类。例如,这种水果和苹果'或者是橙色的'。你通过提供很多类的例子来训练它。但是,如果你给分类器一个香蕉,它将随机返回!结果。它可能会说苹果' 100%信心或橙色,100%信心。分类器不能处理不属于训练类(苹果,橙色)的示例(如香蕉)。另一方面,探测器没有2类。它有一个苹果'和其他一切'。培训课程之外没有任何例子,因为' apples'和其他一切'覆盖整个世界。你不能训练一个分类器来识别其他一切'因为有无数种对象不是苹果'。 '其他所有'不是可以通过分类器训练来识别的类。为此你需要一个探测器。探测器的训练过程略有不同,您提供的示例类型也不同。要训​​练探测器,你必须提供大量的非苹果。汽车,人类,椅子,airplains的图像。通常,您需要数百万个不同的“非苹果”的例子。只有几个苹果的例子(比如几千)。
  2. SVM不是检测问题的好方法。 SVM的核心思想是您可以选择几个具有代表性的示例(支持向量),并使用这些代表描述两个类之间的分离。但是,让我问你 - 有什么代表性的图像是什么,而不是苹果'?回答这个问题是不可能的。不是“苹果”的对象数量。是无限的,所以你不能为它们选择好的支持向量。很容易选择代表苹果' (红苹果,青苹果,烂苹果等的形象)但不是其他所有的东西'类。 不要误解我的意思 - 人们使用SVM来检测简单的对象(比如公司徽标),但是当你的任务很难被人检测时(你有很大的类内变异) - SVM是劣等的。即使您设法训练SVM进行检测,您也会遇到两个问题:运行时间慢,新示例的错误率很高(由于类内变化)。我建议使用增强方法来训练探测器。
  3. 我认为您的错误率很高,因为您用于培训的图像数量非常少。您的特征向量长度约为100,000,因此如果您使用数百万个图像进行训练,则需要几天的时间来训练SVM。记住:对于2类 - 分类问题,成千上万的图像可能就足够了。但是,对于检测问题,您需要数百万张图像。
  4. 您的功能数量太高(假设它是100,000)。我打赌你的图像样本少于特征向量的~100,000长度。对于检测问题,功能的数量应该相对较低(300-3000),但每个功能必须是好的!例如,您从一个包含60,000个不同功能的列表开始,并在培训过程中减少数量,说1,500个好功能,并仅使用它们进行检测。如果你开始使用较少的功能(例如383 = LBP直方图+ HOG直方图),那么大多数功能都是无用的,如果你做了PCA,你可能会感到惊讶,因为你只有~40个功能可以帮助检测,其余功能是无用。相反,如果你完成训练仍然需要100,000个功能,你将会疯狂过度拟合,这将导致SVM的高错误率。
  5. 实用建议:

    1. 您可以继续使用LBP / HOG功能,但首先要确保您拥有大量的非人群'示例(1-10百万)否则您的错误率会很高。尝试获得数千人的图像

    2. 训练一个级联探测器。它比SVM更容易理解,更快,更准确。为训练过程提供所有可能的HOG,LBP功能(无直方图)并让它选择好的功能。您可以在openCV中免费实现级联检测器培训。我的个人建议:不要使用SVM进行检测。这是一个错误的工具。一旦您在图像中检测到某个人,您可以使用SVM对其进行分类,无论是成人还是小孩,但不要使用SVM进行检测。