跳到主要内容

影像进阶:分割、风格转换、人脸与文字

这一章讲三件事: 一条「编码-重建」的骨架怎么长出去噪、分割、风格转换一大家子; 人脸辨识是怎么被拆成检测→特征点→比对三道工序的;以及 OCR 实战为什么 85% 的时间不在模型上。 章末还留了一张「CNN 的病历」——它的三个天生缺陷。

1. 骨架:AutoEncoder,一半算法的共同祖先

上一章的分类和检测都在「认图」;本章前半在「重建图」。把两件事接起来的是 AutoEncoder(自动编码器):编码器把图压成特征向量,译码器再从特征向量把图重建回来。书里点明这个「原图→特征提取→重建影像」的架构是许多进阶算法的地基1

它最直接的用途是去噪:训练时喂带噪声的图,让译码器还原干净图——特征提取过程中,噪声作为「非共同特征」被过滤掉了。书里的 MNIST 实测:加噪训练后,重建图干净得「效果非常好」2。注意它是非监督式的:不需要人工标注,只要图本身3

VAE(变分自编码器) 是它的概率版升级:编码器的输出不是一个点,而是一个概率分布(给出 μ 和 log 变异数),译码时从这个分布里抽样——去噪更稳健,还能生成新图;它的损失用 KL 散度(衡量两种分布差距的数,类似 MSE 的概率版)4。VAE 常与 GAN 相提并论——两大生成门派,下一章细说。

生成门派的主角 GAN,就在下一章。

2. 语义分割与 U-Net:给每个像素上标签

分割的粒度比检测细:检测框住整只狗,语义分割给每个像素标类(两只狗同色),实例分割连同类个体也分开(两只狗不同色)5。应用都值得记住:自动驾驶的路况识别、医疗影像里标出 CT/MRI 的病灶区域、卫星图、机器人视觉6

U-Net 是这一节的明星,而它的发明动机来自 AutoEncoder 的一个天然缺陷7:

  • 普通编码器为了提特征,把图越压越小——压缩过程中,噪声这类「不重要」信息被挤掉了。这用于去噪是优点;
  • 如果要看的就是「异常点」呢?比如医疗影像里找黄斑部病变——病变本身就像噪声,压缩时被滤得干干净净,译码器重建出一张「干净」却把病灶抹掉的图。这是致命缺陷。

U-Net 的解法简单有效:在编码器和译码器的对称层之间架「跳线」,把压缩前的原始信息直接递给重建侧——重建时重要细节不再丢失(外观呈 U 形而得名)。配套的一个细节:分割网络不用池化层,因为池化的抽样会丢像素信息,而分割的承诺正是「每个像素都有答案」8

实例分割的实战工具是 Mask R-CNN(Faster R-CNN 的延伸,多输出一个像素级 Mask);书里的实测很诚实:猫的尾巴没被完整屏蔽到——精准去背需要更多数据、更多训练轮次,甚至更好的算法9。顺带两个生活化应用:一键去背;观光照里把陌生人抹掉、用周围颜色填补(PhotoShop 的类似功能)10

3. 风格转换:重新定义损失函数的胜利

风格转换把照片变成名画笔触(手机上的 Prisma 就是它)。它的算法地位很特殊,书里明说做法:「重新定义损失函数」——这正是第 02 章埋下伏笔的第一次大规模兑现11

两个损失各管一件事12:

  • 内容损失:原图与生成图的像素差异——管「画的是什么」;
  • 风格损失:难点在「画风」怎么变成能算的数。Gatys 等人的妙招是 Gram 矩阵:把特征向量两两做点积——它度量「哪些特征总是一起出现」,而「笔触的组合习惯」恰恰就是风格。风格损失=风格图与生成图的 Gram 矩阵差异平方和;
  • 总损失=α×内容损失+β×风格损失,α/β 就是「像原图多一点还是像名画多一点」的旋钮

实战参数感受一下量级:书里跑 500 个周期才收敛,生成一张图要 290 秒;而美图公司投资约 1.99 亿元人民币、60 多人的团队,把速度压到 3 秒,才成就了美图秀秀这个「少数成功的 AI 商业模式」13算法演示和产品之间隔着的,经常不是精度,是速度。

4. 人脸辨识:一条流水线,不是一个模型

「人脸辨识」其实是四道不同工序的统称14:

① 检测:图里有几张脸、在哪

② 特征点:眼睛/鼻子/嘴角共 68 个关键点

③ 编码:把脸变成一个向量

④ 比对:识别(这脸是 N 人中的谁)/验证(和证件照是不是同一人)

① 检测两代技术:老牌 Haar Cascades 快而糙——用一堆简单滤波器扫图(「眼部比脸颊暗、鼻梁比脸颊亮」),误报多、要按光线手动调参;新一代 MTCNN 用深度学习:影像金字塔+三个串联的网络(找候选→筛选→出特征点),思路与 Faster R-CNN 同族15

② 特征点:主流库都能检测 68 个点;书里对比了 OpenCV 的三种算法在遮脸(Lena 戴帽子)情况下的表现——有的检测不到被遮挡处,有的反而多报假点,没有全能选手16

③+④ 编码与比对:把脸编码成向量后,比对就是算距离。书里的实测:四张图中找与目标同人的,compare_faces 返回 [True, True, True, False]——前三张同人,完全正确17又一次:第 03 章的「变成向量再比距离」,这次用在脸上。

5. OCR 与车牌:模型只占 15% 的时间

文字识别有现成引擎 Tesseract(HP 2005 年开源),一行命令就能识别整张发票;--psm 6 这类布局参数影响不小,多语言要另装字库18

车牌识别展示了「真实项目」的完整形态——没有现成数据集,全靠前置处理把图修到模型能吃的样子19:

灰阶 → 提取轮廓 → 找四边形区域(车牌) → 仿射变换(把歪的梯形拉正)
→ 截出车牌 → 再交给 OCR

实测依然翻车两次:识别出的「HR.26 BR 9044」混入了非字符符号,需要后处理剔除;另一张 NAX 误认成 NAY——可能是地区车牌字形不同20。书里由此给出全书最实在的一条经验:收集数据、整理数据、特征工程这些烦琐工作,占项目 85% 的时间;「把最烦琐的工作处理好,才是项目成功的关键」,这与参加 Kaggle 竞赛是截然不同的感受21。第 06 章数据增补那节的伏笔,在这里彻底兑现。

6. CNN 的病历:三个天生缺陷

章末,书里给 CNN 开了张病历22:

  1. 位置无差异性:卷积只认局部窗口里的特征,不管它在图里哪个位置——五官挪位的脸,它照样认成人脸;
  2. 旋转、倾斜的图认不出(没在训练数据里见过这个角度);
  3. 坐标变换(上下颠倒)后难以辨识。

Hinton 等人为此提出胶囊网络(Capsules)试图改良,书里点到为止23。读这张病历的正确方式:第 06 章「权重共享」带来的「不管目标在哪都认得出」,换一个角度就是「不关心目标之间的关系」——同一个设计的两面

7. 可带走的

  1. AutoEncoder=编码+重建(能凭空造图的模型叫生成模型),是去噪、分割、风格转换、图像生成任务的共同骨架;天然非监督(不需要标注);
  2. 压缩会滤掉「不像共同特征」的信息:去噪时是功,找病灶时是罪——U-Net 的跳线专为这个矛盾而生;
  3. 分割=逐像素标注;实例分割连同类个体也分开(Mask R-CNN);分割网络不用池化;
  4. 风格转换=内容损失+Gram 矩阵风格损失:「画风」被量化成「特征共现模式」;α/β 是风格浓淡旋钮;
  5. 算法到产品隔着一道速度墙:290 秒 vs 3 秒——美图用 2 亿元买来这 287 秒;
  6. 人脸辨识是流水线:检测(Haar→MTCNN)→68 特征点→编码向量→比距离;识别与验证是两个任务;
  7. OCR 引擎现成,难的是把图修成它能吃的样子:灰阶→轮廓→仿射矫正;字形、符号都要后处理;
  8. 85% 的时间在数据:与 Kaggle「拿来即用」的数据集是完全不同的工程感受;
  9. CNN 的三个天生缺陷(位置无差异/怕旋转/怕颠倒)是「权重共享」的另一面。

8. 原文地图

主题原书章原文位置
分割 vs 检测的粒度9-1 语义分割介绍text/70-ch09-9-1.txt:5(搜「目标检测是以整个对象作为标记」) · text/56-ch08-8-1.txt:15(搜「语义分割:按照对象类别」)
医疗等应用9-1 语义分割介绍text/70-ch09-9-1.txt:21(搜「医疗诊断:断层扫描」)
AutoEncoder 骨架、去噪9-1/9-2text/70-ch09-9-1.txt:37(搜「自动编码器(AutoEncoder,AE」) · text/71-ch09-9-2.txt:5(搜「达到“去噪声”」)
VAE 与 KL 散度9-2 自动编码器text/71-ch09-9-2.txt:53(搜「Variational AutoEncoders(VAE」) · text/71-ch09-9-2.txt:81(搜「KL散度」)
分割不用池化、U-Net 动机9-3 语义分割实践text/72-ch09-9-3.txt:5(搜「模型不使用池化层」) · text/72-ch09-9-3.txt:37(搜「检测异常点」) · text/72-ch09-9-3.txt:27(搜「U-Net:广泛应用于生物医学」)
Mask R-CNN 与尾巴实测9-4 实例分割text/73-ch09-9-4.txt:9(搜「Mask R-CNN为Faster R-CNN的延伸」) · text/73-ch09-9-4.txt:69(搜「尾巴都没被屏蔽」) · text/73-ch09-9-4.txt:21(搜「PhotoShop就提供了类似的功能」)
风格转换=重新定义损失9-5 风格转换text/74-ch09-9-5.txt:19(搜「风格转换算法由Leon」)
Gram 矩阵9-5 风格转换text/74-ch09-9-5.txt:31(搜「Gram Matrix:两个特征向量」)
速度墙:290 秒 vs 3 秒9-5 风格转换text/74-ch09-9-5.txt:155(搜「290秒」) · text/74-ch09-9-5.txt:15(搜「美图」)
人脸流水线:Haar 与 MTCNN9-6 脸部辨识text/75-ch09-9-6.txt:45(搜「眼部比脸颊暗」) · text/75-ch09-9-6.txt:109(搜「MTCNN的架构是运用影像金字塔」)
68 特征点、比对实测9-6 脸部辨识text/75-ch09-9-6.txt:249(搜「68个特征点」) · text/75-ch09-9-6.txt:377(搜「compare_faces」) · text/75-ch09-9-6.txt:161(搜「face-recognition是以dlib」)
Tesseract 与参数9-7 光学文字辨识text/76-ch09-9-7.txt:25(搜「Tesseract OCR是目前」) · text/76-ch09-9-7.txt:35(搜「psm 6」)
车牌实战与仿射9-8 车牌辨识text/77-ch09-9-8.txt:43(搜「仿射(Affine Transformation」) · text/77-ch09-9-8.txt:55(搜「NAY-6683」)
85% 时间在数据9-8 车牌辨识text/77-ch09-9-8.txt:61(搜「占项目85%的时间」)
CNN 三个缺陷、胶囊网络9-9 卷积神经网络的缺点text/78-ch09-9-9.txt:7(搜「位置无差异性」) · text/78-ch09-9-9.txt:31(搜「胶囊算法」)

Footnotes

  1. 出处:「9-1 语义分割介绍」第 37 段(text/70-ch09-9-1.txt:37,搜「自动编码器(AutoEncoder,AE」)。原文说明它是许多进阶算法的基础。

  2. 出处:「9-2 自动编码器」第 5 段(text/71-ch09-9-2.txt:5,搜「达到“去噪声”」)与第 49 段(text/71-ch09-9-2.txt:49,搜「噪声被有效剔除」)。

  3. 出处:「9-2 自动编码器」第 53 段(text/71-ch09-9-2.txt:53,搜「不需要标记」)。

  4. 出处:「9-2 自动编码器」第 53 段(text/71-ch09-9-2.txt:53,搜「Variational AutoEncoders(VAE」)与第 81 段(text/71-ch09-9-2.txt:81,搜「KL散度」)。

  5. 出处:「9-1 语义分割介绍」第 5 段(text/70-ch09-9-1.txt:5,搜「目标检测是以整个对象作为标记」);语义/实例分割之别见「8-1」第 15 段(搜「语义分割:按照对象类别」)。

  6. 出处:「9-1 语义分割介绍」第 21 段(text/70-ch09-9-1.txt:21,搜「医疗诊断:断层扫描」)。

  7. 出处:「9-3 语义分割实践」第 37 段(text/72-ch09-9-3.txt:37,搜「检测异常点」)。

  8. 出处:「9-3 语义分割实践」第 5 段(text/72-ch09-9-3.txt:5,搜「模型不使用池化层」)。U-Net 地位在第 27 段。

  9. 出处:「9-4 实例分割」第 9 段(text/73-ch09-9-4.txt:9,搜「Mask R-CNN为Faster R-CNN的延伸」)与第 69 段(text/73-ch09-9-4.txt:69,搜「尾巴都没被屏蔽」)。

  10. 出处:「9-4 实例分割」第 21 段(text/73-ch09-9-4.txt:21,搜「PhotoShop就提供了类似的功能」)。

  11. 出处:「9-5 风格转换」第 19 段(text/74-ch09-9-5.txt:19,搜「风格转换算法由Leon」)。第 02 章伏笔见「2-7」第 154 段(text/17-ch02-2-7.txt:154,搜「风格转换(Style Transfer)可以合成」)。

  12. 出处:「9-5 风格转换」第 19 段(text/74-ch09-9-5.txt:19,搜「内容损失(Content Loss」)与第 31 段(text/74-ch09-9-5.txt:31,搜「Gram Matrix:两个特征向量」)。

  13. 出处:「9-5 风格转换」第 155 段(text/74-ch09-9-5.txt:155,搜「290秒」)与第 15 段(text/74-ch09-9-5.txt:15,搜「美图」)。

  14. 出处:「9-6 脸部辨识」第 23 段(text/75-ch09-9-6.txt:23,搜「脸部检测(Face Detection」)。四类技术的划分在同段。

  15. 出处:「9-6 脸部辨识」第 45 段(text/75-ch09-9-6.txt:45,搜「眼部比脸颊暗」)与第 109 段(text/75-ch09-9-6.txt:109,搜「MTCNN的架构是运用影像金字塔」)。「与 Faster R-CNN 类似」在第 121 段(搜「Faster R-CNN类似」)。

  16. 出处:「9-6 脸部辨识」第 249 段(text/75-ch09-9-6.txt:249,搜「68个特征点」);三种算法实测在第 297~325 段(搜「FacemarkLBF」)。

  17. 出处:「9-6 脸部辨识」第 379 段(text/75-ch09-9-6.txt:379,搜「前三笔符合」)与第 377 段(text/75-ch09-9-6.txt:377,搜「compare_faces」)。

  18. 出处:「9-7 光学文字辨识」第 25 段(text/76-ch09-9-7.txt:25,搜「Tesseract OCR是目前」)与第 35 段(text/76-ch09-9-7.txt:35,搜「psm 6」)。

  19. 出处:「9-8 车牌辨识」第 43 段(text/77-ch09-9-8.txt:43,搜「仿射(Affine Transformation」)与第 61 段(text/77-ch09-9-8.txt:61,搜「灰阶化、提取轮廓」)。

  20. 出处:「9-8 车牌辨识」第 47 段(text/77-ch09-9-8.txt:47,搜「有误认一些非字母或数字的符号」)与第 55 段(text/77-ch09-9-8.txt:55,搜「NAY-6683」)。

  21. 出处:「9-8 车牌辨识」第 61 段(text/77-ch09-9-8.txt:61,搜「占项目85%的时间」)。

  22. 出处:「9-9 卷积神经网络的缺点」第 7 段(text/78-ch09-9-9.txt:7,搜「位置无差异性」)与第 15、25 段(旋转与颠倒)。

  23. 出处:「9-9 卷积神经网络的缺点」第 31 段(text/78-ch09-9-9.txt:31,搜「胶囊算法」)。