【特征提取】Hog特征原理简介与代码实践

这篇具有很好参考价值的文章主要介绍了【特征提取】Hog特征原理简介与代码实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在【模式识别】SVM实现人脸表情分类一文中,我曾使用Hog特征+SVM的方式实现表情分类,但对于Hog特征的原理并未做深入整理。此篇将结合scikit-image来简单分析Hog特征的原理和维度关系。因为没看过原论文,因此自己的理解可能会有偏差,如有错误,欢迎评论区指正。

图像梯度

在进入到Hog之前,需要先了解图像中梯度的概念。
以下图为例(图源:[1]),黑色像素点值为0,白色像素点值为1,分别求X方向梯度和Y方向梯度,从后两幅图可以看出,当箭头从0突变到1时,梯度为正值,图像中以白色边缘表示,反之为负值,以黑色的阴影表示。
【特征提取】Hog特征原理简介与代码实践
更进一步,把X方向的梯度和Y方向的梯度进行融合,这样可以计算出每一个像素点的融合梯度大小和方向。
【特征提取】Hog特征原理简介与代码实践
例如,上图中选择了一个像素点,其相邻位置的像素大小如宫格所示,X方向梯度大小为50,Y方向梯度大小为50,那么其融合梯度大小为70.1,方向为45°。

计算公式的数学表达如下[2]:
【特征提取】Hog特征原理简介与代码实践

有了上面的概念之后,下面进入到Hog特征提取的流程。

标准化gamma空间和颜色空间(Gamma/Colour Normalization)

标准化gamma空间和颜色空间是Hog特征提取的第一步。
这一步主要做了3个操作:

  • 1、因为颜色信息影响不大,因此先转化为灰度图;

  • 2、进行gamma校正:
    gamma<1在高灰度值区域内,动态范围变小,图像对比度降低,图像整体灰度值变大,显得亮一些;gamma>1在低灰度值区域内,动态范围变小,图像对比度降低,图像整体灰度值变小,变得暗淡[3]
    【特征提取】Hog特征原理简介与代码实践
    校正公式如下:
    【特征提取】Hog特征原理简介与代码实践
    校正的好处在于:能够有效地降低图像局部的阴影和光照变化

  • 3、对图像尺寸进行重新调整,并让各像素进行归一化;

计算图像梯度

图像预处理之后,就要计算图中每一个像素点的梯度。之前已经给出了图像梯度的计算公式,但在实际使用中,两个方向上的梯度分量可以用卷积的方式来快速计算。

  • x方向的梯度分量gradscalx:用[-1,0,1]梯度算子对原图像做卷积运算
  • y方向的梯度分量gradscaly:用[1,0,-1]梯度算子对原图像做卷积运算

为每个细胞单元构建梯度方向直方图

下面就需要引入一个细胞单元(Cell)的概念,这里Cell的尺寸可以自由设定,我这里以8 X 8 的尺寸为例,如下图所示:
【特征提取】Hog特征原理简介与代码实践
这张猫选自VOC2012数据集,我对其进行了一定的裁剪。
这里的8 X 8指代一个Cell中包含8 X 8个像素点,例如图中的网格,每个网格代表一个像素点,对于每一个像素点可以计算出一个梯度值和方向。

下面就要统计每个Cell的梯度直方图,通常来说,直方图是用来统计频率的。这里也类似,因此,需要先把360°角度进行分类。按照原作者的说法,分成9份效果最好。于是就有了下面这张图[3]:
【特征提取】Hog特征原理简介与代码实践
这里表示的是每一块为20°,这里初次看可能会有个疑问:360°/9 = 40°,每一块是40°才对,为什么是20°呢?
这是由于角度只看了数值,因此正角度和负角度的符号进行忽略,因此180°/9 = 20°
举个例子,第一个像素点梯度方向为45°,40°<45°<60°,这样它就被划分到第三组。
以此类推,统计一个Cell中每个像素点的角度,就可以得到梯度方向直方图。

把细胞单元组合成大的块(block),并归一化梯度直方图

下一步就要引入另一个新概念:块(block),一些博文中也称作窗口(windows),应该是同一个东西。
还是拿这张猫图举例,假设block的大小为2 X 2,那么就包含2 X 2个cell,所占据的尺寸为(16,16)个像素。
如图中的蓝框代表cell,黄框代表block,这里block的大小也是通过人为指定。
【特征提取】Hog特征原理简介与代码实践这样,一个block内所有cell的特征向量串联起来便得到该block的HOG特征,同时,需要在块内进行归一化。归一化的方法大致有四种:
【特征提取】Hog特征原理简介与代码实践
根据原作者描述,使用L2-Hys方法效果最好[3]。

至于这里的大小设置,个人理解是和目标的尺寸有关。例如,行人检测的最佳参数设置是:3×3细胞/区间、6×6像素/细胞、9个直方图通道[3]。

移动block,计算维度

下面就到最后一步,一张图里有多个像素,那么通过计算之后,整张图的hog特征的维度是多少呢?
这里我们进入实践,来通过实践来理解block是如何移动的。

首先导库,使用opencvskimage

import cv2
from skimage.feature import hog

定义数据预处理过程,调整图片尺寸为256x256,并将图片进行灰度化和归一化

def preprocessing(src):
    gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)  # 将图像转换成灰度图
    img = cv2.resize(gray, (256, 256))  # 尺寸调整g
    img = img/255.0    # 数据归一化
    return img

提取Hog特征

img = cv2.imread("test.jpg")
img_afterpro = preprocessing(img)
image_features = hog(img_afterpro, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(16, 16), block_norm='L2-Hys')

这里有多个参数,主要的四个参数解释和默认取值如下:

  • orientations:方向数
  • pixels_per_cell:胞元大小
  • cells_per_block:块大小
  • block_norm:可选块归一化方法L2-Hys(L2范数)

【特征提取】Hog特征原理简介与代码实践
这里图片的大小为(256,256),cell的大小选择为(8,8),block设置为(16,16),那么hog特征总的维度是多少呢?起初我的理解是多个block平铺整个图像,那么每个block大小为(8x16,8x16)=(128,128),即整幅图像有四个block,那么总维度应该是16x16x9x2x2=9216然而通过验证

image_features.shape

输出的实际维度应为665856,差得很远!

于是我想到了卷积神经网络中卷积核的滑动窗口的运动方式,假设这里block也是以滑动窗口的方式进行运动,每次运动的步长为一个cell的宽度,如下图所示:
【特征提取】Hog特征原理简介与代码实践
这里的block应该是(16,16),我这里为了作图方便,仍保留为(2,2),旨在领会传达的意思。
如图所示,每个block计算完成之后,向水平/垂直方向移动一个cell的宽度,这样前一部分的cell会和下一个block再次计算。
这样block总的个数可以这样计算:
水平方向block个数=(256-128)/8 + 1 =17
垂直方向block个数=水平方向block个数=17
那么总维度=16x16x9x17x17=665856

结果证实,该思路是正确的。

Reference

[1]https://www.bilibili.com/video/BV1dz411B7Rd
[2]https://blog.csdn.net/zouxy09/article/details/7929348
[3]https://blog.csdn.net/qq_37791134/article/details/81413758文章来源地址https://www.toymoban.com/news/detail-420775.html

到了这里,关于【特征提取】Hog特征原理简介与代码实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Opencv 之ORB特征提取与匹配API简介及使用例程

    ORB因其速度较快常被用于视觉SLAM中的位姿估计、视觉里程、图像处理中的特征提取与匹配及图像拼接等领域 本文将详细给出使用例程及实现效果展示 创建 检测 计算 检测与计算 绘制特征点 绘制匹配点对 讲述特征点提取与描述子计算,实现如下: 暴力匹配实现: 其效果如

    2024年02月13日
    浏览(30)
  • 【机器学习】小波变换在特征提取中的实践与应用

    在信号处理与数据分析领域,小波变换作为一种强大的数学工具,其多尺度分析特性使得它在特征提取中扮演着至关重要的角色。本文将从小波变换的基本原理出发,结合实例和代码,深入探讨小波变换在特征提取中的应用,并着重分析几种常见的基于小波变换的特征提取方

    2024年04月22日
    浏览(24)
  • AI实践与学习1_NLP文本特征提取以及Milvus向量数据库实践

    随着NLP预训练模型(大模型)以及多模态研究领域的发展,向量数据库被使用的越来越多。 在XOP亿级题库业务背景下,对于试题召回搜索单单靠着ES分片集群普通搜索已经出现性能瓶颈,因此需要预研其他技术方案提高试题搜索召回率。 现一个方案就是使用Bert等模型提取试

    2024年01月24日
    浏览(34)
  • 【图像处理】SIFT角点特征提取原理

            提起在OpenCV中的特征点提取,可以列出Harris,可以使用SIFT算法或SURF算法来检测图像中的角特征点。本篇围绕sift的特征点提取,只是管中窥豹,而更多的特征点算法有: Harris Stephens / Shi–Tomasi 角点检测算法 Förstner角点检测器; 多尺度 Harris 算子 水平曲线曲率法

    2024年02月07日
    浏览(33)
  • 模式识别 第7、8章 特征的选择和提取

    目录 一、基本概念 1.问题的提出 2.基本概念 3.特征选择 4.特征的评价准则 二、类别可分离性判据 1.常用的特征判据 1. 基于类内类间距离的可分性判据  2. 基于概率分布的可分性判据  3. 基于熵的可分性判据 三、特征选择的最优和次优算法 1.特征选择的最优算法 1. 最优算法

    2024年02月03日
    浏览(25)
  • 特征检测之HOG特征算法详解及Opencv接口使用

    特征描述符是图像或图像补丁的表示形式,它通过提取有用信息并丢弃无关信息来简化图像。 通常,特征描述符将大小 W x H x 3 (通道)的图像转换为长度为 n 的特征向量/数组。对于 HOG 特征描述符,输入图像的大小为 64 x 128 x 3 ,输出特征向量的长度为 3780 。 在HOG特征描述

    2024年02月14日
    浏览(29)
  • LabVIEW开发高压配电设备振动信号特征提取与模式识别

    LabVIEW开发高压配电设备振动信号特征提取与模式识别 矿用高压配电设备是井下供电系统中的关键设备之一,肩负着井下供配电和供电安全的双重任务,其工作状态直接影响着井下供电系统的安全性和可靠性。机械故障占配电总故障的70%。因此,机械故障诊断对配电非常重要

    2024年02月13日
    浏览(28)
  • 【语音识别入门】特征提取(Python完整代码)

    1.1数字信号处理基础 在科学和工程中遇到的大多数信号都是连续模拟信号,例如电压随着时间变化,一天中温度的变化等等,而计算机智能处理离散的信号,因此必须对这些连续的模拟信号进行转化。通过 采样–量化 来转换成数字信号。 以 正弦波 为例: x ( t ) = s i n ( 2 Π

    2024年01月17日
    浏览(23)
  • 图片特征HOG/LBP/ORB存为npy文件

    例如需要分类器KNN、SVM等对图片特征进行分类,在这之前把图片特征转为npy文件。 可以实现文件夹内的所有图片获取hog特征后存npy文件。 SIFT的特征也可以参考这个处理 。 备忘。

    2024年02月13日
    浏览(28)
  • 【目标检测】(8) ASPP改进加强特征提取模块,附Tensorflow完整代码

    各位同学好,最近想改进一下YOLOV4的SPP加强特征提取模块,看到很多论文中都使用 语义分割中的ASPP模块 来改进,今天用Tensorflow复现一下代码。 YOLOV4的主干网络代码可见我上一篇文章:https://blog.csdn.net/dgvv4/article/details/123818580 将本节的ASPP代码替换原来的SPP模块代码即可 YO

    2024年02月06日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包