第13章
计算机视觉
让机器自己学会“看”
本章导航:从“会学”到“会看”
导入:分拣线上的一双眼睛
📦 包装破损了吗
分拣线上,摄像头每天要“看”成千上万件包裹,先判断外包装有没有破损。
🏷️ 这是什么货
纸箱、编织袋、塑料筐……类别要在包裹通过的瞬间认出来。
🚗 车牌号是多少
闸口车辆鱼贯而入,车牌要自动定位并读出号码。
这些事对人轻而易举,对计算机却极具挑战——
因为图像在机器眼里,只是一堆像素数值。
机器眼中的图像:一堆没有语义的数字
神经网络的本质:一个参数巨大的函数
和线性回归 \(y=wx+b\) 一样,神经网络也是一个函数:输入一组数,输出一组数。区别在于它的参数(权重)不是人按业务逻辑推导的,而是用大量样本让机器自己“试”出来的——参数动辄成千上万。
🎯 万能逼近能力
结构足够复杂(层数、神经元足够多)再配上非线性激活,理论上可逼近任意复杂的输入输出映射——判破损、预测运单时长,同一套框架。
🧪 参数由数据驱动
适合“规则说不清、样本给得出”的问题:人写不出“纸箱 vs 编织袋”的规则,但能轻易备好上万张标注图。
两种范式:人写规则 vs 机器学参数
| 对比维度 | 规则驱动(第 9 章决策树等) | 神经网络 |
|---|---|---|
| 判断逻辑从哪来 | 人凭经验事先设计每个分裂点与规则 | 从标注样本中自动学出(权重) |
| 人的角色 | 规则设计者 | 数据与目标的提供者 |
| 擅长的数据 | 结构化、特征可枚举的表格数据 | 高维、非结构化数据(图像/语音/文本) |
| 场景变化时 | 规则失效,需人工重新设计 | 换数据重新训练即可适应 |
| 典型失效 | 边界情况写不全 | 样本不够或标注质量差 |
人工特征的时代:为什么撑不下去
🛠️ 老办法:人工设计特征
先用边缘检测、纹理提取等算法把图像变成一组人为定义的特征数值,再交给决策树、支持向量机等分类器判断。
💥 脆弱点
高度依赖设计者经验;光照、角度一变,原有特征规则就失效,得重新设计——泛化差、成本高。
让函数“学”起来:三个前置条件
🗂️ 规模化标注数据
样本常需数千到百万级,每个都要有人工给出的正确答案。标注质量决定效果上限——这句话在 §13.4 还会回来。
🖥️ 强计算能力
训练是海量矩阵运算,靠 GPU 或专用 AI 芯片并行加速——与条码识别、数据库查询的算力需求完全不是一个量级。
🎯 明确的优化目标
用损失函数量出“预测与真实答案差多少”;训练就是不断调参让它变小(§13.1.5 细讲)。
神经元:一次加权求和加一次变形
激活函数:没有它,叠多少层都是直线
Sigmoid(式 13-3)
$$\sigma(z) = \frac{1}{1 + e^{-z}}$$早期常用于二分类输出层;两端导数趋 0,深层网络易梯度消失,输出均值不为 0。
ReLU(式 13-4)
$$\mathrm{ReLU}(z) = \max(0, z)$$当今最常用:计算极快、正半区导数恒为 1,大幅缓解梯度消失;代价是负半区神经元可能永久失活(Dying ReLU)。
多层感知机:神经元排成层
前向传播:一层一层往后算
🧮 读法(式 13-5 / 13-6)
第 \(l\) 层:拿上一层的输出 \(\mathbf{a}^{(l-1)}\),乘本层权重矩阵、加偏置,再过激活,得到本层输出。输入层进、输出层出,单向走完一遍就是一次预测。
💻 伪代码
for 每一层 layer:
z = W · 上层输出 + b
a = 激活函数(z)
输出 最后一层的 a
Softmax:把得分翻译成概率
输出层先给出一组原始得分(logits)——可正可负、没有统一尺度,不能直接当“可能性”。Softmax 做两件事:取指数(变正、放大差距)+归一化(总和为 1)。
互动:Softmax 计算器
🎚️ 三个类别的原始得分(拖动滑杆)
📊 Softmax 概率
训练是怎么发生的:四步循环
损失函数:给预测打分的尺子
📏 均方误差 MSE(式 13-8)· 回归
$$\mathcal{L}_{\mathrm{MSE}} = \frac{1}{N}\sum_{i=1}^{N} (y_i - \hat{y}_i)^2$$用于连续值预测,如货物尺寸测量、坐标定位:差得越远,平方罚得越重。
🎯 交叉熵 CE(式 13-9)· 分类
$$\mathcal{L}_{\mathrm{CE}} = -\sum_{k=1}^{K} y_k \log(\hat{y}_k)$$\(y_k\) 是 one-hot 真标签,\(\hat{y}_k\) 是 Softmax 概率:真类别概率越低,罚得越狠——与上一页正好衔接。
链式法则:把“责任”一层层传回去
看一个最小例子:输入 \(x\) 经权重 \(w\) 得 \(z=wx\),再经激活得 \(y=f(z)\),最后算出损失 \(\mathcal{L}(y)\)。损失对 \(w\) 的导数,按链式法则就是三段相乘:
梯度下降:沿最陡方向迈一小步
动画:《梯度下降与反向传播》(2 分 09 秒)
把图像喂给全连接网络:两个病
💣 病一:参数爆炸
200×200 彩色图展开有 120,000 个输入;首层设 1000 个神经元,仅这一层权重就达 1.2 亿——训练数据与算力随之膨胀,还极易过拟合。
🧩 病二:空间结构被打散
图像展平成一维后,像素的二维邻接关系消失:相邻像素与远端像素在网络眼里无区别——可包裹的轮廓、纹理恰恰由相邻像素的关系构成。
CNN 的两剂药:局部感受野 + 权重共享
MLP 与 CNN:一张表看清差别
| 维度 | MLP | CNN |
|---|---|---|
| 输入形式 | 一维向量,需先展平 H×W×C | 三维张量,保留原始结构 |
| 首层参数量级(224×224×3 输入) | 1000 个隐藏单元 ≈ 1.5×10⁸ | 64 个 3×3 卷积核 ≈ 1.8×10³ |
| 空间拓扑关系 | 完全丢失 | 完整保留,核在平面上滑动 |
| 平移不变性 | 不具备 | 具备(权重共享+池化) |
| 典型输出形态 | 单一的类别得分向量 | 多通道特征图,可接检测/分割头 |
CNN 的流水线:卷积—激活—池化,反复堆叠
卷积运算:核滑过图像,逐点乘加
🧮 一步的算例
窗口[2 0 1 / 1 3 0 / 0 1 2]与核[1 0 −1 / 0 1 0 / −1 0 1]对应相乘再求和:2+0−1+0+3+0+0+0+2 = 6——这就是特征图上一个点的诞生。
🔍 它到底在算什么
本质是在问:“这块局部区域像不像核所代表的模式?”像,响应就大;不像,响应就小甚至为负。核的数值不是人设的,是训练学出的“模式模板”。
卷积核即模式检测器:边缘是怎么被“看见”的
🌓 左暗右亮的图像块
10 10 90
10 10 90
10 10 90
🎛️ 垂直边缘核
−1 0 1
−1 0 1
−1 0 1
⚡ 响应对比
边缘块:每行 −10+90=80,三行共 240(强响应);
全 50 的平坦块:每行 −50+50=0,共 0(无响应)。
互动:卷积步进演示
步长、填充与输出尺寸公式
👣 步长 Stride
核每次滑动的像素数。步长越大,输出越小、计算越省——相当于隔点采样。
🖼️ 填充 Padding
在图像边缘补零圈:让边缘像素也被充分利用,并可控制输出尺寸不缩水。
池化:留最强的,扔冗余的
多核与特征层级:越深越抽象
经典架构演进:LeNet → AlexNet → VGG → ResNet
动画:《卷积与池化》(2 分 42 秒 · 修正版)
从分类到检测:问题变难在哪
🏷️ 分类只答一问
“这张图是什么?”——默认图里只有一个主体,输出一个固定长度的概率向量即可。
🎯 检测要答一组问
传送带画面里同时有若干包裹、叉车、行人:有几个、各在哪、分别是什么——三个问题一起答。
边界框:把“位置”变成四个数
| 表示法 | 四个数 | 适合 |
|---|---|---|
| 角点式 | (x_min, y_min, x_max, y_max):左上+右下 | 标注与 IoU 计算直观 |
| 中心式 | (x_center, y_center, w, h):中心+宽高 | 网络回归预测常用(YOLO) |
IoU:框得准不准的尺子
候选区域:从穷举到“先粗筛、再精判”
NMS:同一个目标,只留最有把握的那个框
检测网络全景:分类与回归一起练
动画:《NMS 与 YOLO 网格》(1 分 52 秒)
YOLO:把检测压成一次前向计算
🐢 两阶段为什么慢
候选区常达上千个,还要逐一分类精修——串行两步走。分拣线、闸口要的是每秒数十帧,延迟直接卡住后续的分流、放行动作。
⚡ YOLO 的答案
You Only Look Once:整图一次送进网络,一次前向就同时给出所有目标的类别与位置——检测被改写成一个单阶段回归问题。
网格输出:数量不定的问题,固定尺寸的答案
YOLO 的演进:一直在补精度的短板
YOLO 在物流的四个主场
📦 分拣中心 · 包裹定位
传送带上方摄像头逐帧检测包裹位置与边界框,为机械臂抓取、自动分流提供坐标输入。
🏭 出入库 · 货物核验
识别托盘编号与外包装类别标识,与条码/RFID(第 2、3 章)多模态互验。
🚗 园区闸口 · 车辆识别
车型识别与车牌定位,配合闸口系统自动放行。
⛑️ 作业安全 · 行为监测
检测安全帽、反光背心佩戴与禁行区闯入(如叉车作业区),实时预警。
效果从哪来:精度不在模型里,在数据里
✅ 相对传统方案
一台摄像头同时认多目标并给出类别与位置,减少固定传感器阵列;无人值守不知疲倦,漏检错检不再随班次波动;单阶段速度跟得上产线节拍,不成瓶颈。
⚠️ 部署的实话
精度与训练数据的规模与标注质量直接挂钩;换到新场景(特定光照、特定包装)通常要采集本场数据再微调,拿通用模型直接上产线,效果多半不稳。
实操路线:从一张包裹照片开始
results = model("package_conveyor.jpg") # box.cls / box.conf / box.xyxy 逐框可读
一句话带走本章:特征不用人设计,让数据教机器看
📌 本章带走的六件事
- 神经网络=参数由数据学出的函数;规则写不清、样本给得出时用它
- 神经元=加权求和+激活;Softmax 把得分变成可比的概率
- 训练=前向预测、算损失、反向传播求梯度、梯度下降改参,四步循环
- CNN 两机制:局部感受野+权重共享;卷积提特征、池化压缩并稳平移
- 检测=定位+分类:边界框、IoU 分样本、NMS 去冗余、分类+回归联合损失
- YOLO 单阶段一次前向出全部结果,为实时物流视觉而生;精度靠数据
✍️ 课后思考
- 习题 2:全网去掉激活函数会发生什么?用式 (13-1) 说清
- 习题 5:32×32 输入、5×5 核卷积再 2×2 池化,尺寸剩多少?(第 27—28 页)
- 习题 7:为一个物流场景列全 YOLO 落地的条件清单
下一章预告:第 14 章 大模型应用基础 —— 从“看懂图像”到“读懂语言”。