HOG参数简介及Hog特征维数的计算(转)

HOG构造函数

CV_WRAP HOGDescriptor() :winSize(64,128), blockSize(16,16), blockStride(8,8),      cellSize(8,8),nbins(9), derivAperture(1), winSigma(-1), histogramNormType(HOGDescriptor::L2Hys),L2HysThreshold(0.2), gammaCorrection(true), nlevels(HOGDescriptor::DEFAULT_NLEVELS)

{}

CV_WRAP HOGDescriptor(Size_winSize, Size _blockSize, Size _blockStride,                 Size _cellSize, int _nbins, int_derivAperture=1, double _winSigma=-1, int _histogramNormType=HOGDescriptor::L2Hys,double _L2HysThreshold=0.2, bool _gammaCorrection=false, int_nlevels=HOGDescriptor::DEFAULT_NLEVELS) : winSize(_winSize),blockSize(_blockSize), blockStride(_blockStride), cellSize(_cellSize),nbins(_nbins), derivAperture(_derivAperture), winSigma(_winSigma),histogramNormType(_histogramNormType), L2HysThreshold(_L2HysThreshold),gammaCorrection(_gammaCorrection), nlevels(_nlevels)

{}

CV_WRAP HOGDescriptor(const String&filename)

{

load(filename);

}

HOGDescriptor(const HOGDescriptor& d)

{

d.copyTo(*this);

}

我们看到HOGDescriptor一共有4个构造函数,前三个有CV_WRAP前缀,表示它们是从DLL里导出的函数,即我们在程序当中可以调用的函数。

HOG基本概念

在构造函数中,有几个参数非常重要,分别为winSize(64,128),  blockSize(16,16),  blockStride(8,8), cellSize(8,8),  nbins(9)。在此,用几个示意图来表示。

a)       窗口大小winSize

b)      块大小blockSize

c)       胞元大小cellSize

d)       梯度方向数

nbins代表在一个胞元中统计梯度的方向数目。如:nbins=9表示一个胞元内统计9个方向的梯度直方图。

Hog特征维数的计算

首先给出一个hog

HOGDescriptor* hog = newHOGDescriptor(cvSize(64, 48), cvSize(8, 6), cvSize(8, 6), cvSize(4, 3), 9);

根据上面的概念可知,cvSize(64,48)表示窗口的大小,cvSize(8, 6)表示块(block)大小,cvSize(8,6)表示块滑动增量(blockStride)大小,cvSize(4, 3)表示胞元(cell)大小,9表示每个胞单元中梯度直方图的数量。

注:输入的图片尺寸为640×480。

据此,可知:

一个块(block)包含A=(blockSize.width/cellSize.width)*(blockSize.height / cellSize.height)个胞元(cell),所以一个块(block)含有9A个梯度直方图。按照所给出的数据,可得结果为36。

一个窗口包含B=((windowSize.width-blockSize.width)/(blockStrideSize.width)+1)* ((windowSize.height-blockSize.height)/(blockStrideSize.height)+1)个块(block),所以一个窗口包含9AB个梯度直方图。

按照所给出的数据,可得结果为2304。

其次,计算特征向量hog->compute(trainImg,descriptors, Size(64, 48), Size(0, 0))

此处,trainImg代表输入的图片(此处尺寸为640×480),descriptors表示保存特征结果的Vector,Size(64,48)表示windows的步进,第四个为padding,用于填充图片以适应大小。

当padding以默认状态Size(0,0)出现,滑动窗口window来计算图片时,

结果不一定为整数。

此时,查看compute()函数发现,其中有一段代码如下:

padding.width = (int)alignSize(std::max(padding.width,0), cacheStride.width);

padding.height = (int)alignSize(std::max(padding.height,0), cacheStride.height);

这段代码就是用来将padding的大小来适应stride的大小。

在我的实例中,由于取得数都事先设计好,都是整数。而当若结果不为整数时,则将其取值为比其大的最小整数。如若padding.width计算为7.8时,就取8.

所以一幅640×480的图片,按照前面的参数,则可以取的特征数为230400维。

在此,特别感谢几位,分别为:

http://www.cnblogs.com/tornadomeet/archive/2012/08/15/2640754.html

此篇博文总结了一些网上的参考资料,采用Hog特征训练的流程及对OpenCV中Hog代码进行了解释

http://blog.csdn.net/raocong2010/article/details/6239431

此篇博文对Hog中Block,Cell的概念进行了详细的解释。我此篇博客中的图片来自于这篇博文。非常感谢。

http://gz-ricky.blogbus.com/logs/85326280.html

此篇博文对Hog中的特征个数计算进行了详细的解释

时间: 2024-08-12 23:55:29

HOG参数简介及Hog特征维数的计算(转)的相关文章

维数灾难与PCA主成分分析

背景 维数灾难是机器学习中常见的现象,具体是指随着特征维数的不断增加,需要处理的数据相对于特征形成的空间而言比较稀疏,由有限训练数据拟合的模型可以很好的适用于训练数据,但是对于未知的测试数据,很大几率距离模型空间较远,训练的模型不能处理这些未知数据点,从而形成“过拟合”的现象. 方案 既然维数灾难严重影响模型的泛化,那么如何解决呢?容易想到的解决办法是增加数据量,但是如果特征维数比较多,需要很大的数据量才能将整个特征空间“填满”,代价太大:还有一种比较容易实现而且效果还不错的解决办法就是特征的降

维数诅咒

介绍 在这篇文章中,我们将讨论所谓的"维数的诅咒",并解释为什么在设计分类器时它是很重要的.以下各节我会提供这个概念直观的解释,并用一个由于维数灾难导致的过拟合例子图解说明. 考虑这样一个例子,我们有一组图像,其中每个表示猫或狗.我们想创建一个分类器,它能够自动识别狗和猫.要做到这一点,我们首先需要考虑每个对象类的描述,该描述可以用数字来表示.这样的数学算法,即分类器,可以用这些数字来识别对象.例如,我们可以认为猫和狗有不同的颜色.区分这两个类的一种可能描述可以由三个数字组成:平均红色

Linux 内核引导参数简介

概述 内核引导参数大体上可以分为两类:一类与设备无关.另一类与设备有关.与设备有关的引导参数多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导参数.比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导参数,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导参数说明.大多数参数是通过"__setup(... , ...)"函数设置的,少部分是通过"early_param(..

维数灾难

Content 1 引言 2 维数灾难与过拟和 3 怎样避免维数灾难 4 总结 1 引言 本文章讨论的话题是“curse of dimension”,即维数灾难,并解释在分类它的重要性,在下面的章节我会对这个概念做一个直观的解释,并清晰的描述一个由维数灾难引起的过度拟合的问题. 下面不如正题,考虑我们有一堆猫和狗的图片,现在要做一个分类器,它可以把猫和狗自动并且正确分类.所以对这个两个类别,首先需要一组描述符,使这两个类别可以被表示为数字,分类器可以使用数字来决定类别(如Logistic Reg

Objective-C 下用 NSArray 和 NSMutableArray 定义二维数组跟多维数

Objective-C 下用 NSArray 和 NSMutableArray 定义二维数组跟多维数组 目录 问题描述 Objective-C 中的数组对像 NSArray 和 NSMutableArray 简介 二维数组:嵌套两次的 NSMutableArray 多维数组:嵌套多次的 NSMutableArray 问题描述 说实话,不太习惯面向对象编程,所以在操作 Objective-C 中数组对象时,总是忍不住跟 C 中的数组做比较,正好要建立一个二维数组,需要根据二维数组的下标来做相应的设

分类问题中的“维数灾难”

在看机器学习的论文时,经常会看到有作者提到“curse of dimensionality”,中文译为“维数灾难”,这到底是一个什么样的“灾难”?本文将通过一个例子来介绍这令人讨厌的“curse of dimensionality”以及它在分类问题中的重要性. 假设现在有一组照片,每一张照片里有一只猫或者一条狗.我们希望设计一个分类器可以自动地将照片中的动物辨别开来.为了实现这个目标,首先需要考虑如何将照片中的动物的特征用数字的形式表达出来.猫与狗的最大区别是什么?有人可能首先想到猫与狗的颜色不

Hive参数层面优化之一控制Map数

1.Map个数的决定因素 通常情况下,作业会通过input文件产生一个或者多个map数: Map数主要的决定因素有: input总的文件个数,input文件的大小和集群中设置的block的大小(在hive中可以通过set dfs.block.size命令查看,该参数不能自定义修改): 文件块数拆分原则:如果文件大于块大小(128M),那么拆分:如果小于,则把该文件当成一个块. 举例一: 假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和

Tensorflow描述张量的维度:阶,形状以及维数

张量 TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通. 阶 在TensorFlow系统中,张量的维数来被描述为阶.但是张量的阶和矩阵的阶并不是同一个概念.张量的阶(有时是关于如顺序或度数或者是n维)是张量维数的一个数量描述. 比如,下面的张量(使用Python中list定义的)就是2阶. t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]   你可以认

基、维数、子空间、维数下降

一.问题的提出 受到空间.平面.直线不同维数的影响,始终很难理解基(一组线性无关向量)的长短和维数的区别.基的长短=维数? 要知道空间的表示,基是三个自由度:平面则是两个自由度.在投影是维数下降... 看起来非常混沌!! 二.问题的分析 先分析几个结论: (1)子空间的维数≤原空间的维数 因为子空间的集合是原空间集合的子集,毫无疑问,子空间所需要的线性无关向量个数≤原空间所需要的线性无关向量个数,因此,结论得以证明. (2)基的长短≠维数 举个反例,显然(a1,a2,0),满足加法和数乘运算封闭