计算机视觉学习笔记 (Computer Vision Learning Notes)
计算机视觉学习笔记 (Computer Vision Learning Notes)
数学(学科)背景知识
数据载体:张量 (Tensor)
什么是张量?
当我们谈论图像是矩阵时,仅仅触及了问题的表面。在现代深度学习框架中,数据在网络中流动的真实形态是张量。
从数学定义的严格性来看,张量是标量、向量和矩阵向更高维度的推广。
如果说零阶张量是一个独立的数值(标量),一阶张量是一排数值(向量),二阶张量是网格状数值(矩阵),那么三阶及以上的张量就是多维数据的集合体。对于程序员而言,将张量理解为具有严格几何一致性的多维数组最为精准,它要求每一个维度的元素数量必须对齐,这与可以随意嵌套的 JSON 结构有着本质区别。
为什么要引入张量?
引入张量这一概念并非是为了故弄玄虚,而是为了解决传统低维数据结构在处理复杂视觉任务时的局限性。普通的二维矩阵仅能完美表达灰度图像,一旦涉及到红绿蓝(RGB)三通道的彩色图像,二维结构就显得捉襟见肘。
更关键的是,在训练神经网络时,为了利用 GPU 的并行计算能力,我们通常不会一张一张地输入图片,而是将多张图片打包成一个批次(Batch)进行处理。如果继续沿用简单的矩阵或试图将多张图拍扁成一维向量,不仅会破坏图像像素间珍贵的空间邻域关系,也无法有效地组织批量数据。我们需要一个能够同时容纳色彩维度和批次维度的更高阶容器。
张量如何解决问题?
在计算机视觉的实际工程落地中,张量通常表现为 4D Tensor 的形态,其标准形状记为 。
这里的 代表批次大小(Batch Size),即一次性吞吐的图片数量; 代表通道数(Channel),在输入层通常是 RGB 的 3 通道,而在网络内部则代表被提取出的几十甚至上百个特征图; 和 则对应特征图的高和宽。这种四维结构使得数据像一块规整的“积木”,能够被高效地送入 GPU 进行大规模矩阵运算。在 AlexNet 这样的网络中,每一层操作本质上都是在这个四维张量上进行的线性或非线性变换,从而实现从原始像素到高层语义的逐级抽象。
CV 的 Hello World:全连接网络与 MNIST
几乎每一个深度学习初学者(包括看完 3Blue1Brown 视频的你)的入坑作都是其实是:手写数字识别 (MNIST)。
任务定义
- 输入:一张 像素的黑白图片(数字 0-9)。
- 目标:判断这张图是哪个数字。
用FNN 训练图片
采用非常符合直觉的用一个二维数组,一一映射图片每个像素的灰度值,然后转化成一列向量,此时就可以套用FNN的结构,开始训练
幻灭:为什么 FNN 做不了真正的 CV?
当你把图片从 换成 的猫狗照片时,FNN 瞬间崩塌了。
参数爆炸:
- 输入向量长度 = 1,000,000 (100万)。
- 第一层隐层如果只有 1000 个神经元。
- 权重参数 大小 = (10亿)。
- 结果:显存爆炸,根本练不动。
对位移极其敏感 (No Translation Invariance):
- FNN 记住了“像素点 (15, 15) 是黑色的”意味着“8”。
- 如果你把数字“8”向右平移 3 个像素,对于 FNN 来说,这就完全是另一张新图了(活跃的像素索引全变了)。它必须重新学习“向右平移版”的 8。
- 我们需要:一种不论物体在哪里,都能把它识别出来的机制——这就是卷积。
CV(Computer Vision)领域术语数学与直觉
在深入复杂的神经网络(如 AlexNet)之前,我们需要先理解计算机是如何“理解”图像的。这涉及到矩阵运算、张量以及最重要的——卷积。
图像即矩阵 (Image as Matrix)
对人类来说,一张图是风景;对计算机来说,一张图只是一个巨大的数字矩阵。
- 灰度图:这是一个 的二维矩阵,每个像素点代表亮度(0=黑,255=白)。
- 彩色图 (RGB):这是一个 的三维张量 (Tensor)。这里的“3”代表 Red, Green, Blue 三个通道叠加在一起。
在数学上,我们把一张高为 、宽为 、通道数为 的图像表示为张量 。
核心引擎:卷积 (Convolution)
这是计算机视觉最重要的基石。
什么是卷积?
卷积本质上是一种数学运算,它通过一个小的过滤器(即卷积核 Kernel)在图像上滑动,提取局部的特征。
直观理解:就像用一个小手电筒在图片上逐行扫描。
数学定义:
对于图像 和卷积核 ,在位置 的输出结果 为:这看起来很复杂,但本质上它只是在计算图像局部区域与卷积核的点积(相似度)。
什么是卷积核?
为什么要引入卷积?
在卷积神经网络 (CNN) 普及之前,我们面临着两个巨大的难题,使得传统的全连接层 (Fully Connected Layer) 无法处理图像:
- 难题一:参数爆炸 (Parameter Explosion)
假如通过全连接层处理一张 的图片,输入层就有 100 万个像素。如果隐藏层有 1000 个神经元,那么仅这一层的权重参数就高达 10亿 ()。这不仅通过现在的硬件难以训练,也极易过拟合。 - 难题二:空间信息的丢失 (Loss of Spatial Locality)
全连接层需要把图片“拉直”成一条长向量,这破坏了像素之间上下左右的邻里关系(例如“猫耳朵”通常在“猫头”上方),而这些空间结构对识别物体至关重要。
卷积如何解决问题?
卷积层通过以下巧思完美解决了上述挑战:
- 局部连接与特征匹配:
卷积核就像一个“特征探测器”(如探测垂直边缘、水平边缘)。它只关注手电筒光圈内的一小块区域,从而保留了空间结构。当它滑到与自己形状相似的区域时,点积结果最大,从而“激活”该特征。 - 参数共享 (Parameter Sharing):
这是卷积最天才的地方。无论图片多大,我们都用同一个卷积核(比如 的矩阵,仅有 9 个参数)去扫描全图。因为如果照片左上角有一个圆,右下角也有一个圆,我们应该可以用同一个探测器去识别它们。这极大地减少了参数量。
关键参数 (Hyperparameters)
决定卷积行为的三个旋钮:
- Kernel Size (卷积核大小):如 。决定了探测视野的大小。
- Stride (步长):手电筒滑动的间距。步长越大,输出的特征图越小(起到降维作用)。
- Padding (填充):在图片边缘补 0,防止图像在多次卷积后尺寸变得太小。
池化 (Pooling)
1. 什么是池化?
池化是一种下采样 (Downsampling) 操作。卷积负责“提取特征”,而池化负责“甚至压缩信息”。
2. 为什么要池化?
- 降低计算量:随着网络加深,如果我们一直保留原始分辨率,计算量会过大。
- 平移不变性 (Translation Invariance):也是最重要的原因。只要图中有猫,无论它在左边还是右边,我们都希望识别结果不变。
3. 具体实现:Max Pooling
最常用的是 Max Pooling (最大池化)。策略非常简单粗暴:
在比如 的窗口内,只保留最大值,其他的扔掉。
- 背后的逻辑:我们认为最大值代表了该区域最显著的特征(比如发现了“眼睛”)。只要这个特征存在,它的具体像素位置即使偏移一点点也没关系,我们只在乎“这里有眼睛”。
接下来,我们将看到 AlexNet 是如何把 5 个卷积层和 3 个池化层像搭积木一样堆叠起来,构建出强大的视觉系统的。