首页 > 编程知识 正文

python获取hog图像特征(python提取图像特征)

时间:2023-12-24 12:05:40 阅读:320729 作者:PGCS

本文目录一览:

hog怎么训练用到android

1、选定正负样本:正样本、行人库中正样本大小为96x160,比我们需要的64x128窗口要大,是因为每一个边有一个padding,16像素,因此保持中心不动,选取64x128窗口大小的图片作为训练的正样本。负样本、负样本大小不统一,在每一个负样本图像中随机选取10个64x128大小的patch作为训练的负样本(即用来训练的负样本个数是行人库中个数的10倍,每一个负样本产生10个patch);

2、提取hog特征(opencv完成);

3、将提取出来的hog特征投入到svm中训练,得到初始分类器;

4、利用初始分类器(其实就是支持向量以及对应的权值,还有一个偏移)的支持向量和对应的权值加权得到检测行人的检测子,再加上一维的偏移,整个检测子是3781维。但是,重点来了,这个初始检测子,效果很差很差,不信你可以试试,有很多错检的(有点hard example的味道,什么是hard example?别急),错检太多,是因为训练还没有完成;

5、利用这个初始的检测子去检测前面用来训练的负样本原图(不是随机提取出来的图,而是原图),检测方法是利用cvhog的多尺度检测detectMultiScale方法,检测出来一打一打的行人(但实际上是负样本,所以肯定是错的),这些检测出来的区域,就是hard example;

6、提取第5步中hard example的hog特征(如果训练样本数量太多的话,可以在选出来的hard example里二次抽样,即选取部分hard example提取hog特征);

7、将hard example的hog特征和第2步中正负样本的hog特征综合起来,再训练svm分类器,这样就得到了最终的分类器。

之前纠结过的地方:

1、负样本为何会大小不统一?因为整个负样本中是没有人的,随便在图像中选择64x128窗口大小的图像都可作为负样本进行训练,因此负样本原始图像的大小并不重要。

2、resize不能乱用。这里就迁出了为何要使用多尺度检测的问题。因为我们规定的窗口大小是64x128,太大或者太小的人都检测不到,因此我们利用尺度对图像进行缩放,在每一层中进行检测,最后在原图画矩形框,他的结果是把每一层的检测结果综合起来,可能有一层就检测不到了,resize的话没准就恰恰resize成了找不到行人或者把不是行人的判断为行人了。resize不能乱用,我最开始用resize的时候,支持向量和投入训练的数量一样多,这不坑爹么?所以不到万不得已,别用resize。

图像的特征提取都有哪些算法

图像的经典特征提取方法:

1 HOG(histogram of Oriented Gradient,方向梯度直方图)

2 SIFT(Scale-invariant features transform,尺度不变特征变换)

3 SURF(Speeded Up Robust Features,加速稳健特征,对sift的改进)

4 DOG(Difference of Gaussian,高斯函数差分)

5 LBP(Local Binary Pattern,局部二值模式)

6 HAAR(haar-like ,haar类特征,注意haar是个人名,haar这个人提出了一个用作滤波器的小波,为这个滤波器命名为haar滤波器,后来有人把这个滤波器用到了图像上,就是图像的haar特征)

图像的一般提取特征方法:

1 灰度直方图,颜色直方图

2 均值,方差

3 信号处理类的方法:灰度共生矩阵,Tamura纹理特征,自回归纹理特征,小波变换。

4 傅里叶形状描述符,小波描述符等,

在python怎么调用hog特征

1.对原图像gamma校正,img=sqrt(img); 2.求图像竖直边缘,水平边缘,边缘强度,边缘斜率。 3.将图像每16*16(取其他也可以)个像素分到一个cell中。对于256*256的lena来说,就分成了16*16个cell了。 4.对于每个cell求其梯度方向直方图。

【中级】图像特征工程:HOG 特征描述符

英文原文:

边翻译边学习

特征工程是机器学习算法领域重要的角色。这是进行最多次试验的地方:从现有特征中设计新特征并提高我们模型的性能。世界上一些顶级数据科学家们依靠特征工程来提高他们在黑客马拉松中的排行榜分数。我相信你甚至会在结构化数据上使用各种特征工程技术。

我们能否将此技术扩展到非结构化数据,比如图像?对于计算机视觉爱好者来说,这是一个有趣的问题,我们将在本文中解释它。准备好以特征提取的形式对图像数据进行特征工程吧!

我假设你已经阅读了: 【初级】使用 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五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。