扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
hog描述子在opencv中为HOGDescriptor。
专注于为中小企业提供成都网站设计、网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业泰安免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
2. 可以调用该描述子setSVMDetector方法给用于对hog特征进行分类的svm模型的系数赋值,这里的参数为HOGDescriptor::getDefaultPeopleDetector()时表示采用系统默认的参数,因为这些参数是用很多图片训练而来的。
3. 对输入图片进行行人检测时由于图片的大小不一样,所以要用到多尺度检测。这里是用hog类的方法detectMultiScale。参数解释如下:
HOGDescriptor::detectMultiScale(const GpuMat img, vectorRect found_locations, doublehit_threshold=0, Size win_stride=Size(), Size padding=Size(), double scale0=1.05, int group_threshold=2)
该函数表示对输入的图片img进行多尺度行人检测 img为输入待检测的图片;found_locations为检测到目标区域列表;参数3为程序内部计算为行人目标的阈值,也就是检测到的特征到SVM分类超平面的距离;参数4为滑动窗口每次移动的距离。它必须是块移动的整数倍;参数5为图像扩充的大小;参数6为比例系数,即滑动窗口每次增加的比例;参数7为组阈值,即校正系数,当一个目标被多个窗口检测出来时,该参数此时就起了调节作用,为0时表示不起调节作用。
4. 最后对检测出来的目标矩形框,要采用一些方法处理,比如说2个目标框嵌套着,则选择最外面的那个框。
5. 因为hog检测出的矩形框比实际人体框要稍微大些,所以需要对这些矩形框大小尺寸做一些调整。
features = extractHOGFeatures(I);
[features,validPoints] = extractHOGFeatures(I,Points);
[_,visualization] = extractHOGFeatures(I,_);
[_] = extractHOGFeatures(_,Name,Value);
其中,I为3-D彩色图像或2-D灰度图像,features为1xN的HOG描述子向量,N为描述子的长度,该描述子是输入图像区域的局部形状信息编码。当指定Points(同extractFeatures函数输入Points)时,则获取指定点附近的HOG描述子,visualization表示可用于任何可视化的函数的输入参数,例如plot(visualization),Name为用一对单引号包含的字符串,Value为对应Name的值。
Name Value
'CellSize'HOG单元(HOG cell)大小,默认值为[8,8],为捕获大尺度空间信息,可以增加‘CellSize'的取值
’BlockSize'块中单元的大小,默认值为[2,2],当取值较大时将降低抑制局部亮度变化的能力,当取值较小时,能够抑制亮度变化
‘BlockOverlap'相邻块(block)之间的重叠HOG单元的个数,默认值为ceil(BlockSize/2),该参数只在从区域(region)获取HOG特征时有用。
’NumBins'方向直方图分段(orientation histogram bins)的数目,默认值为9,必须为正整数,如果想要获取精细的方向信息,该值可以设置大一些,但是将增加处理时间和HOG特征长度
‘UseSignedOrienation'默认值为false,当该值置为true时,方向直方图中所取方向的范围为[-180,180],若置为false,方向的取值范围为[0,180],此时,方向角度小于0的将统计如+180bins中,利用带符号的方向,可以区分区域中从light-to-dark和dark-to-light
英文原文:
边翻译边学习
特征工程是机器学习算法领域重要的角色。这是进行最多次试验的地方:从现有特征中设计新特征并提高我们模型的性能。世界上一些顶级数据科学家们依靠特征工程来提高他们在黑客马拉松中的排行榜分数。我相信你甚至会在结构化数据上使用各种特征工程技术。
我们能否将此技术扩展到非结构化数据,比如图像?对于计算机视觉爱好者来说,这是一个有趣的问题,我们将在本文中解释它。准备好以特征提取的形式对图像数据进行特征工程吧!
我假设你已经阅读了: 【初级】使用 Python 从图像数据中提取特征
在本文中,我将向您介绍一种流行的图像特征提取技术——定向梯度直方图( Histogram of Oriented Gradients 或 HOG)。我们将了解什么是 HOG 特征描述符,它的工作原理(算法背后的完整数学),最后,将会在 Python 中实现它。
下面的两个图像。你能区分图像中的物体吗?
我们可以清楚地分辨右图有一只狗,左图有一辆汽车。现在让这个任务稍微复杂一点,识别下图中显示的物体:
我想你还是可以分辨出吧?图1 有包含很多信息,比如物体的形状、颜色、边缘、背景等。而图2 的信息相对少得多(只有形状和边缘),但足以区分两个图像。
我想你已经对特征描述符有一些感觉了吧?在图2 中,我们很容易区分对象,因为它具有识别对象所需的必要信息。这正是特征描述符的作用: 它是图像的简化表示,仅包含有关图像的最重要信息 。
以下是一些最受欢迎特征描述符的:
在本文中,我们将重点介绍 HOG (定向梯度直方图)特征描述符及其工作原理。让我们开始吧!
HOG,是一种特征描述符,常用于从图像数据中提取特征。它广泛用于计算机视觉任务中的目标检测。
让我们看一下 HOG 与其他特征描述符不同的一些重要方面:
对此进行正式定义: HOG 特征描述符是计算图像局部梯度方向的出现次数 。
我们现在应该对 HOG 特征描述符是什么有了一个基本的了解。是时候深入研究其背后的核心思想了。让我们开始讨论计算 HOG 的分步过程。
考虑以下尺寸 (180 x 280) 的图像。让我们详细了解一下如何为该图像创建 HOG 特征:
这是大多数人都非常熟悉的步骤。预处理数据是任何机器学习项目中的关键步骤,处理图像时也不例外。
我们需要对图像进行预处理并将宽高比降低到 1:2。图像大小最好是 64 x 128。这是因为我们将把图像分成 8 8 和 16 16 块来提取特征。具有指定的大小 (64 x 128) 将使我们所有的计算变得非常简单。事实上,这是 原始论文 中使用的确切值。
回到我们的例子,让调整原图像为 64 x 128。这是调整后的图像:
下一步是计算图像中每个像素的梯度。梯度是 x 和 y 方向的微小变化。这里将从图像中取出一小块并计算其梯度:
我们将获得此区域的像素值。假设我们在给定的区域生成以下像素矩阵(此处显示的矩阵仅用作示例,这些不是给定区域的原始像素值):
这里突出显示了像素值 85。首先确定 x 方向的梯度(或变化),我们需要从右侧的像素值中减去左侧的值。同样,为了计算 y 方向的梯度,我们将从所选像素上方的像素值中减去下方的像素值。
因此,该像素在 x 和 y 方向上的梯度为:
这个过程会给我们两个新矩阵——一个存储 x 方向上的梯度,另一个存储 y 方向上的梯度。这类似于使用大小为 1 的 Sobel Kernel。 当强度发生急剧变化时,例如边缘周围,幅度会更高 。
我们分别计算了 x 和 y 方向的梯度。对图像中的所有像素重复相同的过程。下一步是使用这些值找到大小和方向。
使用我们在上一步中计算的梯度,我们现在将确定每个像素值的大小和方向。在这一步中,我们将使用毕达哥拉斯定理,如下图所示:
梯度分为是水平和竖直,对于前面的示例,我们将 和 设为 11 和 8。应用勾股定理来计算总梯度幅度:
接下来计算其方向:
因此,角度的值将是:
计算结果是 36。对于每个像素值,我们都能计算出其梯度值和方向。我们需要使用这些梯度值和方向生成直方图。
直方图是显示一组连续数据的频率分布的图。x 轴表示数据值,y 轴表示其频率。在这里,我们将用x 轴表示角度,用y 轴表示频率。
让我们从最简单的生成直方图的方法开始。我们将获取每个像素值,找到像素的方向并更新频率表。还是讨论图三中的红色像素 85。由于该像素的方向是 36,我们将在角度值 36 上添加一个数字,表示频率:
对所有像素值做重复相同的操作,我们最终得到一个频率表,表示角度和这些角度在图像中的出现次数。此频率表可用于生成 x 轴上的角度值和 y 轴上的频率的直方图。这是创建直方图的一种方法。由于每个桶的是1,所以此处生成了180个大小相同的桶。
这种方法与前面的方法类似,不同之处在于这里的每个桶的大小为 20。因此,在这里得到的桶数为 9。同样,对于每个像素,我们将检查方向,并以 9 x 1 矩阵的形式存储方向值的频率。绘制这将为我们提供直方图:
在这里,我们将像素梯度的贡献添加到像素梯度任一侧的 bin 中。更高的贡献应该是对更接近方向的 bin 值。
在 HOG 特征描述符中创建的直方图不是为整个图像生成的。相反,图像被分成 8×8 个单元格,并为每个单元格计算定向梯度的直方图。通过这样做,我们获得了较小块的特征(或直方图),这些块又代表了整个图像。我们当然可以在这里将这个值从 8 x 8 更改为 16 x 16 或 32 x 32。如果我们将图像分成 8×8 个单元格并生成直方图,我们将为每个单元格得到一个 9 x 1 的矩阵。该矩阵是使用我们在上一节中讨论的方法 3 生成的。
一旦我们为图像中的 8×8 块生成了 HOG,下一步就是对直方图进行归一化。
我们在了解这是如何完成之前,首先了解为什么要这样做很重要。尽管我们已经为图像的 8×8 单元创建了 HOG 特征,但图像的梯度对整体照明很敏感。这意味着对于特定图片,图像的某些部分与其他部分相比会非常亮。我们无法从图像中完全消除这一点。但是我们可以通过采用 16×16 块对梯度进行归一化来减少这种光照变化。这是一个可以解释如何创建 16×16 块的示例:
在这里,我们将组合四个 8×8 的单元格来创建一个 16×16 的块。我们已经知道每个 8×8 单元格都有一个 9×1 的直方图矩阵。因此,我们将有四个 9×1 矩阵即一个 36×1 矩阵。为了标准化这个矩阵,我们将这些值中的每一个除以这些值的平方和的平方根进行归一化,结果将是大小为 36×1 的归一化向量。
我们现在处于为图像生成 HOG 特征的最后一步。到目前为止,我们已经为图像的 16×16 块创建了特征。现在,我们将结合所有这些来获得最终图像的特征。
您能猜出给定图像的特征总数是多少吗?我们首先需要找出一张 64×128 的图像有多少这样的 16×16 块?我们将有 105 (7×15) 个 16×16 的块。这 105 个块中的每一个都有一个 36×1 的向量作为特征。因此,图像的总特征将为 105 x 36×1 = 3780 个特征。我们现在将为单个图像生成 HOG 特征,并验证我们最终是否获得相同数量的特征。
我们将看到如何在单个图像上生成 HOG 特征,以及是否可以将其应用于更大的数据集。
如果不进行 resize,结果如下:
这时我们就提取出了对象识别时输入到机器学习中的图片HOG特征了。
1.对原图像gamma校正,img=sqrt(img); 2.求图像竖直边缘,水平边缘,边缘强度,边缘斜率。 3.将图像每16*16(取其他也可以)个像素分到一个cell中。对于256*256的lena来说,就分成了16*16个cell了。 4.对于每个cell求其梯度方向直方图。
C#开发语言中 params 是关键字,可以指定在参数数目可变处采用参数的方法参数。在函数的参数数目可变而执行的代码差异很小的时候很有用!
params关键字表示函数的参数是可变个数的,即可变的方法参数,例如Console.WriteLine( "{0},{1} ",i,j); 就像DELPHI 里 WRITELN 函数一样,用于表示类型相同,但参数数量不确定.
在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
关于参数数组,需掌握以下几点。
(1)若形参表中含一个参数数组,则该参数数组必须位于形参列表的最后;
(2)参数数组必须是一维数组;
(3)不允许将params修饰符与ref和out修饰符组合起来使用;
(4)与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量;
(5)若实参是数组则按引用传递,若实参是变量或表达式则按值传递。
(6)用法:可变的方法参数,也称数组型参数,适合于方法的参数个数不知的情况,用于传递大量的数组集合参数;当使用数组参数时,可通过使用params关键字在形参表中指定多种方法参数,并在方法的参数表中指定一个数组,形式为:方法修饰符 返回类型 方法名(params 类型[] 变量名)
{
方法体
}
希望对你有用
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流