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

Ind*_*ach 1 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];
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*HsH 5

我从你的意见中评论如下: 你在图像中选择了1845个关键点.对于每个点,您计算长度为383的特征向量(LBP + HOG组合).表示图像的总矢量长度约为100,000.

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

你的方法有一些问题.

  1. 您似乎无法理解探测器和分类器之间的区别,并且您正在尝试应用分类器来解决检测问题.有一个核心差异.分类器旨在区分2个(或更多)类.例如,这种水果和'苹果'或'橙'.你通过提供很多类的例子来训练它.但是,如果你给分类器一个香蕉,它将随机返回!结果.它可能会说100%有信心的'苹果'或100%有信心的橙色.分类器不能处理不属于训练类(苹果,橙色)的示例(如香蕉).另一方面,探测器没有2类.它有一个'苹果'和'其他'.培训课程之外没有任何例子,因为"苹果"和"其他一切"涵盖了整个世界.你无法训练分类器来识别"其他所有东西",因为有无数种不是"苹果"的物体."其他所有"都不是一个可以通过分类器识别的类.为此你需要一个探测器.探测器的训练过程略有不同,您提供的示例类型也不同.要训​​练探测器,你必须提供大量的"非苹果".汽车,人类,椅子,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的高错误率.

实用建议:

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

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