圆圆的棕色一团,上面有三个黑点。无论用单个像素、平均颜色还是像素距离来衡量,吉娃娃和松饼都是彼此最相像的。我们会看到寻找暗点的低层特征在两张照片上作出完全相同的反应,确认降低分辨率时什么最先消失,以及像素规则为什么会挑中毫不相干的背景格子。最后,整理模型出错的三种方式,并总结整个系列。
圆圆的棕色一团,上面有三个黑点。两只眼睛和鼻子,与三颗蓝莓几乎在同样的位置。用数字来看,这两者也相像吗?
这一对是展示图像分类难度的典型例子。即使是人,快速瞥一眼小缩略图也会一时搞混。两者的共同点是低层特征(圆圆的一团、米色·棕色、三个暗点呈三角形排列),区别在于高层特征(瞳孔的反光点、湿润鼻子的光泽、毛发纹理 vs 面包纹理、耳朵 vs 纸杯褶皱)。
本篇会把 4-1~4-3 的工具全部拿出来剖析这一对:用数字看有多像(章节 2)、低层特征为什么会被骗(章节 3)、降低分辨率会怎样(章节 4)、像素规则 vs 模式(章节 5),以及模型出错的方式与局限(章节 6),最后用一页总结整个系列(章节 7)。
“吉娃娃还是松饼”这个说法出自 2016 年前后在网上广泛流传的一组照片,此后常被用作说明图像识别难度的例子。本页面的图像是作者按照同样的思路重新制作的。
测量瞳孔格与蓝莓格、两张照片的平均颜色以及灰度像素距离。按数字的标准,吉娃娃最亲近的朋友是松饼。
| 吉娃娃 | 松饼 | 差异 | |
|---|---|---|---|
| 一个暗格 (R, G, B) · 缩小到 14 × 14 时 | 眼睛 (39, 37, 43) | 蓝莓 (37, 31, 37) | 几乎相同 |
| 整张照片的平均颜色 (R, G, B) | (189, 162, 138) | (189, 164, 136) | 几乎相同 |
| 灰度像素距离 (56 × 56) | 吉娃娃 ↔ 松饼 61.4 · 吉娃娃 ↔ 狗 71.0 · 吉娃娃 ↔ 猫 87.8 | 松饼最近 | |
无论用单个像素、平均颜色还是像素距离来衡量,吉娃娃都和松饼最相像。正如在 4-2 中看到的,这些标准并不知道“拍的是什么”。在下表中可以查看全部五张照片之间的距离。
我们测量了本页五张照片两两之间的像素距离。数字越小,就表示计算结果越“相似”。最小的值已标上颜色。
这张表的值是用本页的五张照片(只裁出脸部并缩小到 56 × 56)测得的。换用其他照片,值会随背景·光照·构图而大幅变化,但“像素距离与含义上的距离不同”这一结论,在真实照片中也是广为人知的性质。
这个结果并不是因为“模型太笨”。而是因为比较数字的最简单方法衡量的是外观而不是含义。在这组特意做得外观相似的图像中,这种局限暴露得最明显。真实照片的背景·构图各不相同,数字可能没那么相似,但同样原理的陷阱依然存在。
把寻找“比周围更暗的圆点”的滤波器同样作用在两张照片上。两张照片都会以几乎相同的三角形捕捉到三个点。
在“暗点”视图中,两张照片都捕捉到三个黑点呈几乎相同的三角形排列。吉娃娃是两只眼睛和鼻子,松饼是三颗蓝莓。平均颜色也都是米色·棕色。对只用前面几层特征的模型来说,这两者就是同一张照片。
注意 这组图像是为了展示“易混淆的一对”而用相似构图(正面、白色背景)制作的,所以相似程度可能比随手拍的照片更明显。真实的吉娃娃·松饼照片中也普遍存在同样的现象,但程度因照片而异。
把分辨率降到 7 × 7,连人眼也很难区分了。如果模型只看过小照片来训练,同样的事也会发生在模型身上。
区分两者的线索更加微妙:瞳孔中映出的小白色反光点、鼻子湿润的光泽、细密的毛发纹理 vs 松散的面包纹理、头顶的耳朵与纸杯的褶皱,以及三个点是否总是左右对称(蓝莓是随意分布的)。要看到这些,需要后面几层的特征和多样的照片。
“暗点”视图通过两张模糊程度不同的照片之差(DoG)来寻找圆形的暗块,这与 CNN 前面几层寻找的低层特征属于同一类。对只看到这一层的模型来说,吉娃娃和松饼是同一张照片。在代码 1 中,亲手画的吉娃娃型·松饼型图的“暗处面积”也分别是 5.81% 和 5.83%,几乎相同。
把同一张照片缩小为 7 × 7、14 × 14、28 × 28。分辨率就是提供给模型的信息量。
一开始是 7 × 7,连人眼也几乎分不出两者。依次调到 14、28、56,记下什么最先开始显现。通常吉娃娃的耳朵轮廓和松饼纸杯的竖向褶皱最先出现,眼睛的反光点和毛发纹理最后才能看到。
降低分辨率,数字的个数(特征数)就会减少,小线索最先消失。低层特征(三个点)在低分辨率下也能保留,但区分两者的高层特征只有在高分辨率下才看得到。
| 分辨率 | 特征数 | 测试准确率 | 最常混淆的一对(正确→预测:次数) |
|---|---|---|---|
| 8 × 8 | 64 | 96.2% | 8→1: 4, 4→1: 2, 3→9: 2 |
| 4 × 4 | 16 | 89.8% | 8→1: 14, 1→8: 6, 1→9: 3 |
| 2 × 2 | 4 | 53.4% | 0→8: 20, 2→4: 17, 1→9: 16 |
把手写数字按格子平均缩小,再用同一个分类器(逻辑回归)测试。分辨率越低,形状相似的一对(8 和 1、0 和 8)越先被混淆。吉娃娃和松饼也一样:只用小照片训练,模型根本得不到区分两者的线索。
分辨率就是表格的格子数。格子少,计算便宜,但小线索会消失。真实模型也会先定好输入尺寸(例如 224 × 224),再把照片缩小后输入,所以在小差异很重要的问题上(细小缺陷、远处的标志牌),分辨率的选择会很大程度上左右性能。
把 4-1 中“一个变量 > 阈值”的规则用在照片上,计算机会从 784 格中挑出碰巧很准的背景格。从特征图中提取模式,在新照片上也能答对。
在 4-1 中,鱼用一行“一个变量 > 阈值”的规则就搞定了。把同样的方法用在照片的 784 格上会怎样?规则和模式从“训练用”的 80 张中寻找,再用没有参与训练的“新照片” 80 张来验证。
① 用同样的方法,在全部 784 格中寻找“某个像素 > 阈值”的规则。
② 用滤波器生成特征图,再在整张图上概括模式。
“新照片”是把同样的 12 张照片以不同于训练用的方式平移并改变亮度得到的,所以比用完全不同的照片测试要容易。② 中的两个滤波器是人挑选的,而 CNN 会从数据中学到几十到几百个这样的滤波器。
代码 1 不使用真实照片,而是用代码画出“吉娃娃型”和“松饼型”的 28 × 28 图。两者都有米色圆形和 3 个黑点,区别只有耳朵(上方)和纸杯褶皱(下方)。
结果:像素规则从训练用的 73.8% 降到新图的 61.3%,挑中的格子位于图的下边缘。作为低层特征的暗处面积两类几乎相同(5.81% vs 5.83%),而用局部模式(下方竖向褶皱强度、上方边缘强度)在新图上也答对了 96.3%。得出的结论与真实照片实践相同。
像素规则挑中背景格,就是捷径学习的一个小例子:模型抓住了在训练照片中碰巧与答案同时出现的简单线索。对人来说,“和吉娃娃无关的格子”一目了然,但模型只知道那个格子能很好地猜中答案。
区分两者的线索——反光点、毛发纹理、耳朵、纸杯褶皱——要到后面几层才看得到。没学到这些线索的模型会怎样出错?
用池化逐步缩小照片并叠加层,后面层的一格就能看到原始照片中更大的区域。所以前面的层寻找小线条,后面的层寻找由线条组合成的眼睛和耳朵,更后面的层寻找整张脸。这张图把 Zeiler 和 Fergus(2014)可视化训练好的 CNN 各层反应时展示的趋势做了简化。
捷径学习。模型会抓住能答对的最简单线索。如果训练照片中的松饼总放在白盘子上,它可能学到“白色背景”;如果吉娃娃总在室内,它可能学到“室内灯光”。这在训练数据上很准,但条件一变就会崩溃 [R5]。章节 5 的像素规则就是一个小例子。
陌生照片(分布偏移)。在训练时没见过的条件下,例如侧脸的吉娃娃、巧克力豆松饼、昏暗的灯光,准确率可能大幅下降。测试分数只是在“与训练照片相似的照片”上的分数 [R6]。
过度自信。Softmax 概率 0.99 并不意味着“99% 正确”。模型出错时也可能给出很高的概率,所以在重要决策中,需要另外确认概率是否与实际正确率相符(校准)[R7]。
因此需要的是:充分包含易混淆类别对的数据、各种条件(背景·角度·光线)下的照片、足够的分辨率、数据增强(4-3),以及检查模型依据什么作出判断的习惯。
| 对决 | 难度 | 表面共同点 | 决定性差异(特征) | 主要区分的层 |
|---|---|---|---|---|
| 猫 vs 人 | 容易 | 脸、两只眼睛 | 脸中央的毛发纹理、尖耳朵、条纹、鼻子形状 | 从第 1~2 层就能区分 |
| 猫 vs 狗 | 一般 | 毛发、两只眼睛、竖起的耳朵 | 口鼻长度、鼻子大小、脸部轮廓 | 第 3 层以后(局部形状) |
| 吉娃娃 vs 松饼 | 困难 | 棕色圆团、三个黑点 | 眼睛的反光点、毛发纹理 vs 面包纹理、耳朵 vs 纸杯、对称性 | 后面几层(细微质感 + 整体排列) |
越难的一对越需要:更多照片(尤其是易混淆的照片)、足够的分辨率、更靠后的层,以及 CutMix 这样的数据增强。
Q1. 猫 vs 人之所以是容易的对决,最恰当的理由是?
Q2. 在 Attentive CutMix 中,把 10 格猫的碎片贴到狗的图上,混合图的答案是?
Q3. 用本页的说法,最能解释吉娃娃 vs 松饼为什么难的是?
要走到分层图最右端、“根据整体排列判断”的阶段,这一对才能被区分开。这就需要相应更多的数据和更深的模型,模型依赖不相干线索的余地也随之变大。除了看性能数字,亲自查看出错的照片是图像分类中最重要的习惯。
把四篇的内容串成一条流程。点击格子即可跳转到对应篇目的讲解。
| 概念 | 一句话定义 | 代表公式 | 没有它会怎样 |
|---|---|---|---|
| 像素矩阵 | 把照片每一格都写成 0~255 数字的表 | X ∈ {0…255}H×W×3 | 计算机没有办法对照片进行计算 |
| 特征 · 目标值 | 表的一行 = 样本,一列 = 特征,答案列 = 目标值 | (x, y), x ∈ ℝᵈ | 无法确定看什么、预测什么 |
| 线性分类器(感知机·线性 SVM) | 在特征空间中画出一个平面 | w · x + b > 0 | 无法确定边界。不过,仅靠它很难把像素照片分开 |
| 卷积滤波器 | 用小数字表寻找花纹的印章 | Σ K·X + b | 把像素一个个分开看,找不到含义 |
| 特征图 | 记录花纹在哪里、有多少的新矩阵 | F = ReLU(X∗K) | 下一层没有可组合的材料 |
| 池化 | 只保留最强的反应并缩小尺寸 | max(2×2) | 计算量大,移动一格就会产生波动 |
| 全连接 + Softmax | 汇集特征算出分数,再转换成概率 | ezk/Σezj | 找到了特征却选不出答案 |
| 数据增强 | 改变或混合照片来增加训练样本 | CutMix、翻转、裁剪 | 只能答对背过的照片,遇到新照片就出错 |
4-1 讲的是用有含义的变量建立规则和边界,4-2 讲的是照片是数字矩阵、滤波器负责寻找花纹,4-3 讲的是叠加层来改变坐标、混合数据来学习的方法,4-4 讲的是仍然存在的困难与局限。遇到其他分类问题时,请先问一问:“这份数据的每一格有含义吗?如果没有,是什么样的模式创造了含义?”
两段代码都只使用 Colab 默认安装的库和内置数据。点击“下载笔记本(.ipynb)”后,在 Colab 中通过文件 → 上传笔记本打开,或者复制后粘贴到新笔记本的单元格中。
用代码画出吉娃娃型·松饼型的 28 × 28 图,比较单像素规则、暗点滤波器和两个局部模式。如果想换成自己的数据,把 draw() 改为加载自己的照片,并让 pattern() 的区域适配自己的照片。
把 8 × 8 的手写数字缩小到 4 × 4、2 × 2,按分辨率查看同一分类器的准确率以及最常混淆的数字对。
这是粘贴到 ChatGPT、Qwen、Claude 等 AI 助手中的提示词。点击“复制”,所选代码会一起附在提示词后面。把〔 〕里的内容换成你自己的情况即可。
AI 的回答只是起点。它推荐的论文·数值·库函数一定要对照原文和官方文档核实。如果在竞赛·论文中得到了 AI 的帮助,要按照主办方和期刊的规定说明使用的事实和范围。
与正文中黄色虚线下划线对应的词典。整个系列使用相同的写法。点击章节名可以跳到首次出现的位置。
类比是理解的第一步,但也可能成为误解的种子。人眼·人脑类比标注了对应程度。直接 有依据表明确实在做同样的事 · 部分 只有部分性质相似 · 无 尚未发现对应的东西
| 概念 | 日常类比 | 人眼·人脑类比 | 类比不成立的地方 |
|---|---|---|---|
| 低层特征 | 远处看到的轮廓剪影 | 部分 人在短暂一瞥时,也会先凭轮廓和团块来判断 | 人会立刻调动上下文(盘子、牵引绳)和记忆。只看前面几层的模型没有这样的补充 |
| 高层特征 | 走近后认出的脸 | 部分 高级视觉区域中有对脸这类复杂形状作出反应的部分 | 模型的高层特征不一定是人能叫得出名字的“眼睛”“耳朵” |
| 分辨率 | 方格纸的格子数 | 部分 眼睛也只看清视野的中央 | 眼睛会把视线移到需要的地方看清楚,而模型只看一张缩小到固定尺寸的照片 |
| 捷径学习 | 靠试卷角落的污渍背答案的学生 | 无 | 学生知道自己是背的,但模型并不知道自己在用什么线索 |
| 过度自信 | 说着“我 99% 有把握!”的新手司机 | 无 | 模型的概率不是情绪,而是计算值。经过校准,可以让它与实际正确率相符 |
E-1 作者简介 · E-2 学术参考文献 · E-3 图片·数据参考资料
这是给讲师、在职培训(OJT)负责人和辅导老师的运营指南。时间为预估值,请根据实际课堂进行调整。
| 对象 | 学完 4-1~4-3 的大学生和上班族;在业务中引入图像 AI 之前,想知道它“会在哪里出错”的从业者 |
|---|---|
| 预备知识 | 4-2 的像素距离·滤波器,4-3 的 CNN·数据增强 |
| 学习目标 | ① 能举例说明低层特征与高层特征的区别 ② 能用实验结果说明分辨率和像素规则对分类的影响 ③ 能区分捷径学习·分布偏移·过度自信,并说出应对方法 |
| 预计时间 | 阅读 40~50 分钟 · 实践演示 25 分钟 · Colab 实践 25 分钟(代码 1 15 分钟,代码 2 10 分钟) |
导入 5 分钟(章节 1)→ 章节 2·3 数字与低层特征 15 分钟 → 章节 4 分辨率 10 分钟 → 章节 6 局限 15 分钟 → 小测验 5 分钟。
把章节 1 换成自己业务中的“易混淆的一对”来寻找 15 分钟 → 讨论章节 5 中像素规则为什么会挑中背景 15 分钟 → 把章节 6 的三种失败套用到自己的数据上 25 分钟 → 把代码 1 改成自己照片的构图并运行 35 分钟。
入门者只学章节 1·2·3·6。中级学习者让他们修改代码 1 的 pattern(),实验只用耳朵模式能区分到什么程度,并调查章节 6 中的校准(calibration)后写出总结。
| 章节 | 停下来提的问题 | 操作技巧 |
|---|---|---|
| 1 问题 | “人会凭什么线索来区分?” | 把图像放大显示,指出反光点·耳朵·纸杯 |
| 2 用数字看 | “吉娃娃最亲近的朋友是谁?” | 在距离表中查看每一行的最小值 |
| 3 低层特征 | “如果三个点都一样,模型靠什么来区分?” | 在“暗点”视图中比较编号的位置 |
| 4 分辨率 | “什么最先开始显现?” | 按 7 → 14 → 28 → 56 的顺序点击 |
| 5 规则 vs 模式 | “规则挑中的格子和吉娃娃有关吗?” | 点击“自动寻找像素规则”后,查看标出的格子 |
| 6 局限 | “测试分数 95%,在现场也会是 95% 吗?” | 从三种失败中选出对自己业务最危险的一种 |
| 7 系列总结 | “这份数据的每一格有含义吗?” | 点击流程图中的格子,在四篇之间来回切换 |
| 误解 | 正确解释 | 要展示的画面 |
|---|---|---|
| 会混淆是因为模型太笨 | 按数字的标准,它们确实很像。需要能学习高层特征的数据和结构 | 章节 2 的表 |
| 分辨率越高一定越好 | 计算·内存会增加,也需要更多数据。应根据问题所需线索的大小来选择 | 章节 4 和代码 2 |
| 准确率高就说明看对了线索 | 靠背景这类捷径线索也能拿到高分 | 章节 5 的像素规则 |
| 概率 0.99 就几乎可以确定 | 模型出错时也可能给出很高的概率,需要校准 | 章节 6 的过度自信 |
| 多收集数据就能解决一切 | 只增加相同条件下的数据,陌生照片的问题依然存在。多样性很重要 | 章节 6 的分布偏移 |
吉娃娃 0.299×39 + 0.587×37 + 0.114×43 ≈ 38.3,蓝莓 0.299×37 + 0.587×31 + 0.114×37 ≈ 33.5,几乎相同。
因为两张照片都有圆形团块和三个暗点的三角形排列,前面几层的反应几乎相同。
8→1(14 次)。格子减少到 16 个后,8 的两个圈和 1 的竖笔画会变成相似的亮度分布。
捷径学习。模型抓住了碰巧与答案同时出现的简单线索。
现场照片是否与训练·测试照片条件相同(分布偏移),以及模型的概率是否与实际正确率相符(校准)。还需要亲自查看出错的照片。
在代码 1 中去掉松饼型的纸杯褶皱(删除 cup 部分)后重新运行,观察局部模式在新图上的准确率如何变化,并结合章节 6 的捷径学习加以说明。
在代码 2 中增加在 8 × 8 分辨率下加入模糊(高斯)的情况,比较“减少格子数”和“变模糊”哪一种让准确率下降得更多。
| 入门者 | 章节 4 的代码结果表和章节 5 的 ② 可以跳过。一定要真正理解章节 2·3·6 |
|---|---|
| 进阶 | 让学生调查捷径学习的案例(医学影像、自动驾驶等)并汇报。调查的论文要查阅原文确认 |
| 延伸学习 | 4-1~4-3 · 3-3 图像与 CNN · Sangsun Ahn,《面向商业的数据科学》(비즈니스를 위한 데이터 과학)讲义 |
| 讲师用资料 | 小测验的评分标准和作业参考答案可以在教师用答案页面(4-4)中查看 |
你已经读完了《4-4 吉娃娃 vs 松饼》篇。实验室的伙伴们每人用一句话为你总结。