图像特征提取与深度学习:从SIFT到深度神经网络
在计算机视觉领域,图像特征提取一直是核心任务之一。早期,人们采用手动特征提取方法,如SIFT(尺度不变特征变换)和HOG(方向梯度直方图),而近年来,深度学习模型在这一领域取得了显著进展。
手动特征提取:SIFT和HOG
SIFT是一种经典的图像特征提取方法,其流程较为复杂。它从原始图像的感兴趣区域开始,首先将该区域划分为网格,每个网格单元再进一步划分为子网格。子网格中的每个像素都会产生一个梯度,通过对这些梯度进行加权估计,得到子网格的梯度方向直方图。最后,将所有子网格的直方图拼接起来,形成整个网格的特征向量。这个特征向量还需要经过归一化、阈值处理和再次归一化的过程,最终得到图像块的SIFT特征描述符。
HOG与SIFT类似,但步骤相对简单,同样包括创建梯度直方图和归一化等基本步骤。
深度学习与图像特征学习
虽然SIFT和HOG在定义良好的图像特征方面取得了很大进展,但计算机视觉的最新进展来自于深度神经网络模型。2012年,多伦多大学的研究人员在ImageNet大规模视觉识别挑战赛(ILSVRC)中取得了突破,他们的方法被称为“深度学习”。该方法与以往的神经网络模型不同,包含了多个堆叠的神经网络层和变换。当年的获胜模型AlexNet有13层,2014年的获胜模型GoogLeNet有22层。
从表面上看,堆叠神经网络的机制与SIFT和HOG的图像梯度直方图非常不同。但对AlexNet的可视化显示,其前几层实际上是在计算边缘梯度和其他简单模式,与SIFT和HOG类似。后续层则将局部模式组合成更全局的模式,最终形成了比以往更强大的特征提取器。
深度学习方法的成功依赖于大量的数据和计算能力。ImageNet数据集包含来自1000个类别的120万张标记图像,现代GPU加速了矩阵向量计算,为训练复杂的深度学习模型提供了支持。
深度学习架构的组成层
深度学习架构可以由多种类型的层组成,下面以AlexNet为例,介绍几种常见的层。
全连接层
全连接层是所有神经网络的核心,它是输入特征的一组线性函数。一个线性函数可以表示为输入特征向量与权重向量的内积加上一个常数项。多个线性函数可以表示为矩阵向量乘积,其中权重向量变成了权重矩阵(W)。
全连接层的数学定义为:$z = Wx + b$,其中W的每一行是一个权重向量,将整个输入向量x映射到z中的一个输出,b是一个标量向量,表示每个神经元的常数偏移(或偏置)。
全连接层之所以得名,是因为每个输入都可以用于每个输出,即矩阵W中的值没有限制。这种密集连接允许网络检测可能涉及所有输入的全局模式,但也意味着它包含了最大可能数量的参数,因此计算成本较高。AlexNet的最后两层是全连接层。
卷积层
与全连接层不同,卷积层每个输出只使用输入的一个子集。它通过在输入上“移动”,每次使用几个特征来产生输出。为了简化计算,可以对不同的输入集使用相同的权重,而不是为每个输入集学习新的权重。
卷积算子的数学定义为:$( f * g)(t) = \int_{-\infty}^{\infty} f (\tau)g(t - \tau)d\tau = \int_{-\infty}^{\infty} g(\tau) f (t - \tau)d\tau$,它表示将一个输入函数翻转并在另一个函数上移动,然后在每个点输出相乘曲线下的总面积。
在信号处理中,卷积可以理解为一个线性系统的响应。想象一个黑盒子,输入一个单位刺激,记录其输出,得到响应函数g(t)。当输入一个复杂信号f(t)时,在不同时间点,输入信号与响应函数相乘并求和,得到最终输出。
图像是二维信号,因此需要二维卷积滤波器。二维卷积滤波器通过对两个变量进行积分来扩展一维情况:$( f * g) {i,j} = \sum {u=0}^{m} \sum_{v=0}^{n} f_{u,v} g_{i - u,j - v}$。
在图像处理中,通常使用小的卷积滤波器,并在图像上移动应用。这样只需要定义少量的参数,但只能吸收小像素邻域内的信息,因此卷积神经网络更擅长识别局部模式。
下面是一个应用高斯滤波器对图像进行卷积的示例代码:
import numpy as np
# First create X,Y meshgrids of size 5x5 on which we compute the Gaussian
ind = [-1., -0.5, 0., 0.5, 1.]
X,Y = np.meshgrid(ind, ind)
print(X)
# G is a simple, unnormalized Gaussian kernel where the value at (0,0) is 1.0
G = np.exp(-(np.multiply(X,X) + np.multiply(Y,Y))/2)
print(G)
from skimage import data, color
cat = color.rgb2gray(data.chelsea())
from scipy import signal
blurred_cat = signal.convolve2d(cat, G, mode='valid')
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10,4),
sharex=True, sharey=True)
ax1.axis('off')
ax1.imshow(cat, cmap=plt.cm.gray)
ax1.set_title('Input image')
ax1.set_adjustable('box-forced')
ax2.axis('off')
ax2.imshow(blurred_cat, cmap=plt.cm.gray)
ax2.set_title('After convolving with a Gaussian filter')
ax2.set_adjustable('box-forced')
在这个示例中,我们使用高斯滤波器对猫的图像进行卷积,得到了模糊的猫图像。
AlexNet中的卷积层是三维的,操作的是前一层的体素(表示图像三维空间的数组中的值)。第一个卷积神经网络处理原始RGB图像,并学习跨所有三个颜色通道的局部图像邻域的卷积滤波器。后续层则以空间和内核维度上的体素为输入。
激活函数与归一化层
神经网络的输出通常会经过非线性变换,也称为激活函数。常见的激活函数有ReLU(修正线性单元)、tanh函数和sigmoid函数。
- ReLU是一个简单的线性函数变体,将负值部分归零,即$ReLU(x) = max(0, x)$。它的范围从0到∞。
- tanh函数是一个三角函数,在-1到1之间平滑增加,公式为$tanh(x) = \frac{sinh(x)}{cosh(x)} = \frac{e^x - e^{-x}}{e^x + e^{-x}}$。
- sigmoid函数在0到1之间平滑增加,公式为$sigmoid(x) = \frac{1}{1 + e^{-x}}$。
AlexNet使用ReLU而不是其他变换,因为它在训练过程中收敛更快。它将ReLU应用于每个卷积层和全连接层。
除了激活函数,AlexNet还使用了响应归一化层。归一化的概念是将单个输出除以集体总响应的函数,从而在邻居之间产生竞争。在AlexNet中,每个位置的输出会在不同的卷积核之间进行归一化。归一化公式为:$y_k = x_k /(c + \alpha\sum_{\ell\in neighborhood of k} x_{\ell}^2)^{\beta}$,其中$x_k$是第k个卷积核的输出,$y_k$是相对于邻域中其他卷积核的归一化响应。
池化层
池化层将多个输入合并为一个输出。卷积滤波器在图像上移动时,会为每个邻域产生一个输出。池化层强制局部图像邻域产生一个值而不是多个值,从而减少了深度学习网络中间层的输出数量,有效降低了网络过拟合训练数据的概率。
常见的池化方法有平均池化、求和池化(或计算广义范数)和最大池化。AlexNet使用重叠的最大池化,以2个像素(或输出)为步长在图像上移动,并对3个邻居进行池化。
AlexNet的结构
AlexNet总共包含五个卷积层、两个响应归一化层、三个最大池化层和两个全连接层,加上最终的分类输出层,模型中共有13个神经网络层,形成8个层组。
输入图像首先被缩放到256×256像素,实际输入是224×224的随机裁剪图像,具有3个颜色通道。前两个卷积层后面分别跟着一个响应归一化层和一个最大池化层,最后一个卷积层后面跟着最大池化层。原始论文将训练数据和计算分布在两个GPU上,层之间的通信大多限于同一个GPU,只有在层组2和3之间以及层组5之后例外。在这些边界点,下一层会将来自前一层的跨两个GPU的卷积核体素作为输入。每个中间层后面都应用了ReLU变换。
虽然图像特征化在近年来取得了巨大进展,但它仍然更像是一门艺术而非科学。早期人们通过手动组合图像梯度、边缘检测、方向、空间线索、平滑和归一化等步骤进行特征提取,而现在深度学习架构师构建的模型则封装了更多的信息。
综上所述,从SIFT和HOG到深度神经网络,图像特征提取技术不断发展,深度学习模型在计算机视觉领域展现出了强大的能力。未来,随着技术的不断进步,图像特征提取和计算机视觉领域有望取得更多的突破。
以下是AlexNet的架构流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A([输入图像]):::startend --> B(缩放至256x256像素):::process
B --> C(随机裁剪为224x224):::process
C --> D(卷积层1):::process
D --> E(响应归一化层1):::process
E --> F(最大池化层1):::process
F --> G(卷积层2):::process
G --> H(响应归一化层2):::process
H --> I(最大池化层2):::process
I --> J(卷积层3):::process
J --> K(卷积层4):::process
K --> L(卷积层5):::process
L --> M(最大池化层3):::process
M --> N(全连接层1):::process
N --> O(全连接层2):::process
O --> P(分类输出层):::process
P --> Q([输出结果]):::startend
以下是不同激活函数的比较表格:
| 激活函数 | 公式 | 范围 | 特点 |
| ---- | ---- | ---- | ---- |
| ReLU | $ReLU(x) = max(0, x)$ | $[0, +\infty)$ | 将负值归零,训练收敛快 |
| tanh | $tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}$ | $[-1, 1]$ | 平滑增加,输出范围对称 |
| sigmoid | $sigmoid(x) = \frac{1}{1 + e^{-x}}$ | $[0, 1]$ | 平滑增加,输出范围在0到1之间 |
图像特征提取与深度学习:从SIFT到深度神经网络
深入理解AlexNet各层协同工作原理
为了更清晰地了解AlexNet各层是如何协同工作的,我们可以详细分析其处理图像的流程。
当输入一张图像时,它首先会被缩放到 256×256 像素,这一步是为了统一输入图像的大小,便于后续处理。然后从中随机裁剪出 224×224 的图像块,这样做可以增加数据的多样性,提高模型的泛化能力。
接下来,图像进入第一个卷积层。卷积层的作用是提取图像的局部特征,就像我们在前面介绍的,它使用小的卷积滤波器在图像上滑动,通过卷积操作得到一系列的特征图。这些特征图包含了图像在不同尺度和方向上的边缘、纹理等信息。
第一个卷积层之后是响应归一化层。该层的主要目的是对卷积层的输出进行归一化处理,使得不同卷积核的输出之间具有可比性,同时也有助于增强模型的稳定性。归一化的过程就是根据前面提到的公式 $y_k = x_k /(c + \alpha\sum_{\ell\in neighborhood of k} x_{\ell}^2)^{\beta}$ 进行计算。
归一化层之后是最大池化层。池化层会对局部区域的特征进行汇总,减少数据的维度。在 AlexNet 中使用的是重叠的最大池化,以 2 个像素为步长在图像上移动,并对 3 个邻居进行池化,这样可以提取出每个局部区域的最大值,保留最重要的特征信息。
前两个卷积层都遵循这样的“卷积 - 响应归一化 - 最大池化”的流程。经过这两轮处理后,图像的特征得到了初步的提取和筛选。
然后图像进入后续的卷积层(第三、四、五层),这些层会进一步组合和抽象前面提取的局部特征,形成更高级的特征表示。随着卷积层的深入,特征图所表示的信息越来越抽象,从最初的边缘、纹理等低级特征逐渐过渡到物体的部分、整体等高级特征。
最后一个卷积层之后是最大池化层,进一步减少数据的维度。经过这些卷积和池化操作后,数据被传递到全连接层。
全连接层的作用是将前面提取的特征进行整合,建立全局的特征表示。在 AlexNet 中,有两个全连接层,它们包含了大量的参数,可以学习到非常复杂的模式。全连接层的输出会经过 ReLU 激活函数进行非线性变换,增强模型的表达能力。
最后,全连接层的输出会进入分类输出层,通过 softmax 函数将输出转换为每个类别的概率,从而实现图像的分类任务。
不同特征提取方法的优缺点对比
为了更好地理解从 SIFT、HOG 到深度神经网络这些特征提取方法的发展,我们可以对它们的优缺点进行对比。
| 方法 | 优点 | 缺点 |
|---|---|---|
| SIFT | 具有尺度不变性、旋转不变性等优点,能够在不同尺度和旋转角度下稳定地提取特征;对光照变化有一定的鲁棒性 | 计算复杂度高,处理速度慢;需要手动设计特征提取步骤,对不同的应用场景可能需要调整参数 |
| HOG | 步骤相对简单,计算效率较高;对目标的形状和边缘特征有较好的表示能力 | 缺乏尺度和旋转不变性,对光照变化比较敏感;同样需要手动设计特征提取步骤 |
| 深度神经网络(如 AlexNet) | 能够自动学习图像的特征,无需手动设计复杂的特征提取步骤;可以处理大规模的图像数据,在图像分类等任务上取得了很好的效果 | 需要大量的训练数据和计算资源;模型的可解释性较差,难以理解模型是如何学习和决策的 |
图像特征提取技术的应用场景
图像特征提取技术在很多领域都有广泛的应用,下面我们介绍几个常见的应用场景。
图像分类
图像分类是计算机视觉中最基本的任务之一,其目标是将图像分为不同的类别。深度神经网络在图像分类任务上表现出色,例如在 ImageNet 挑战赛中,AlexNet 等模型取得了很好的成绩。通过提取图像的特征,模型可以学习到不同类别图像的特征模式,从而对新的图像进行准确的分类。
目标检测
目标检测是在图像中找出特定目标的位置和类别。特征提取技术可以帮助检测目标的边缘、纹理等特征,从而确定目标的位置。在目标检测算法中,通常会结合卷积神经网络和一些后处理算法,如非极大值抑制等,来提高检测的准确性。
图像检索
图像检索是根据用户输入的查询图像,在图像数据库中找到与之相似的图像。特征提取技术可以将图像转换为特征向量,通过计算特征向量之间的相似度来实现图像的检索。例如,使用 SIFT 或 HOG 特征可以提取图像的局部特征,然后通过匹配这些特征来找到相似的图像。
人脸识别
人脸识别是通过提取人脸图像的特征,来识别不同的人。深度神经网络在人脸识别领域取得了巨大的成功,它可以学习到人脸的独特特征,如眼睛、鼻子、嘴巴等的形状和位置关系。在实际应用中,人脸识别技术被广泛应用于门禁系统、安防监控等领域。
未来发展趋势
随着技术的不断发展,图像特征提取技术也在不断进步。未来可能会朝着以下几个方向发展。
更高效的模型架构
目前的深度神经网络模型虽然在性能上表现出色,但计算复杂度较高,需要大量的计算资源。未来可能会出现更高效的模型架构,能够在保证性能的前提下,减少计算量和内存占用。例如,一些轻量级的卷积神经网络模型已经开始在移动设备上得到应用。
更强的可解释性
深度神经网络的可解释性一直是一个难题,难以理解模型是如何学习和决策的。未来的研究可能会致力于提高模型的可解释性,让人们能够更好地理解模型的工作原理,从而提高模型的可信度和可靠性。
多模态特征融合
除了图像特征,还有其他模态的数据,如音频、视频、文本等。未来的图像特征提取技术可能会与其他模态的数据进行融合,从而获得更全面的信息。例如,在视频分析中,可以将图像特征和音频特征结合起来,提高对视频内容的理解和分析能力。
以下是图像特征提取技术处理图像的流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A([输入图像]):::startend --> B(图像预处理):::process
B --> C{选择特征提取方法}:::process
C -->|SIFT| D(SIFT特征提取):::process
C -->|HOG| E(HOG特征提取):::process
C -->|深度神经网络| F(深度神经网络特征提取):::process
D --> G(特征匹配/分类等应用):::process
E --> G
F --> G
G --> H([输出结果]):::startend
总之,图像特征提取技术从手动方法到深度学习模型的发展,为计算机视觉领域带来了巨大的变革。未来,随着技术的不断创新和发展,图像特征提取技术将会在更多的领域得到应用,为我们的生活和工作带来更多的便利。
14万+

被折叠的 条评论
为什么被折叠?



