查看全课大纲(第 67 / 93 节)
  1. 1.计算机视觉概述
  2. 2.计算机视觉应用场景
  3. 3.困难与挑战
  4. 4.开源库介绍
  5. 5.图像显示与存储
  6. 6.CLAHE
  7. 7.腐蚀膨胀与开闭运算
  8. 8.滤波与边缘填充
  9. 9.各种滤波
  10. 10.图像金字塔
  11. 11.傅里叶变换
  12. 12.短时傅里叶变换与小波变换
  13. 13.颜色特征与颜色直方图
  14. 14.几何特征_边缘
  15. 15.几何特征-角点与斑点
  16. 16.局部特征-SIFT特征描述子
  17. 17.局部特征-SURF特征描述子
  18. 18.局部特征-ORB特征描述子
  19. 19.其他特征描述子
  20. 20.传统图像分割技术
  21. 21.GraphCut
  22. 22.GrabCut
  23. 23.人脸检测的传统方法
  24. 24.行人检测的传统方法HOG+SVM
  25. 25.行人检测DPM
  26. 26.人工神经网络的架构
  27. 27.目标函数与梯度下降
  28. 28.误差反向传播
  29. 29.可手算的神经网络
  30. 30.改进目标函数与克服梯度消散
  31. 31.神经网络之传统神经网络与深度网络的差异
  32. 32.各种梯度下降算法
  33. 33.如何选择合适的梯度下降算法
  34. 34.避免过适应
  35. 35.CNN的架构
  36. 36.CNN的误差反向传播_卷积层
  37. 37.CNN的误差反向传播_池化层
  38. 38.分类所用的数据集
  39. 39.Alexnet详解
  40. 40.VGG详解
  41. 41.GoogLeNet_v1
  42. 42.BatchNormalization
  43. 43.GoogLeNet_v3v4
  44. 44.ResNet
  45. 45.ResNeXt
  46. 46.CNN设计准则
  47. 47.图像检索与推土机距离
  48. 48.基于颜色相似性
  49. 49.基于形状相似性
  50. 50.基于纹理相似性
  51. 51.基于局部特征相似性
  52. 52.DL的二值哈希编码
  53. 53.高维空间中检索KDTree
  54. 54.高维空间中检索LSH
  55. 55.目标识别任务综述
  56. 56.RCNN
  57. 57.SPP-Net
  58. 58.Fast R-CNN
  59. 59.Faster R-CNN
  60. 60.R-CNN系列模型回顾
  61. 61.R-FCN的设计思路
  62. 62.R-FCN的实现
  63. 63.YOLOv1
  64. 64.YOLOv2_9000
  65. 65.YOLOv3
  66. 66.图像分割应用场景与数据集
  67. 67.上采样的实现方式
  68. 68.FCN网络架构的由来
  69. 69.FCN构建细节
  70. 70.DeepLabv1
  71. 71.CRF
  72. 72.DeepLabv2
  73. 73.DeepLabv3
  74. 74.特定的医学影像分割任务
  75. 75.U-Net
  76. 76.3D U-Net
  77. 77.V-Net
  78. 78.DenseNet
  79. 79.病理切片分析任务及数据集
  80. 80.病理切片分析
  81. 81.图说任务及其传统处理方法
  82. 82.深度语言模型与RNN
  83. 83.LSTM及其变种
  84. 84.NIC模型
  85. 85.SAT模型
  86. 86.图说的性能指标
  87. 87.判别模型与生成模型
  88. 88.KL散度与JS散度
  89. 89.VAE
  90. 90.GAN的基本原理
  91. 91.DCGAN与CGAN
  92. 92.Wasserstein GAN
  93. 93.SRGAN

上采样的实现方式

小象实战讲义 · 基于深度学习的计算机视觉

在深度学习的图像处理流程中,我们常常需要通过卷积、池化等操作对图像进行下采样,以提取更宏观的语义信息。然而,在图像分割、超分辨率等任务中,我们需要将低分辨率的特征图恢复到原始输入尺寸,这个过程就是上采样。本节将系统讲解上采样的三种核心实现方式:双线性插值、反卷积与反池化,并深入剖析反卷积的多种等价表述及其参数关系,为你构建语义分割等模型打下坚实基础。

💡 核心导读

  • 上采样的定义与目标:理解为何需要将小图像“放大”,以及数字图像放大时面临的分辨率不增问题。
  • 三种实现方式:掌握无需学习的双线性插值、参数可学习的反卷积,以及基于位置记录的反池化。
  • 反卷积的多面性:深入理解反卷积为何也被称为转置卷积、分数步长卷积,以及其与普通卷积在参数上的对偶关系。
  • 实践选择:了解在实际应用中,如何根据任务需求(速度、精度、连续性)选择合适的上采样方法。

什么是上采样

在深度卷积网络中,我们通过 max pooling 或步长(stride)大于1的卷积层,不断减小特征图的尺寸。这种下采样操作的好处是能够扩大感受野,提取更全局、更抽象的特征。然而,许多任务(如图像分割)的最终输出需要与输入图像保持相同的空间分辨率,以便进行像素级的预测。这就需要一种逆向操作——上采样。

上采样,英文为 Upsampling,其目标是将一个尺寸较小的特征图,转换成一个尺寸较大的特征图。你可以将其想象成一个投影仪:将一张小的幻灯片(小特征图)投射到大的幕布上,得到一张大的图片。

但这里存在一个根本性问题:数字图像由离散的像素点阵构成。简单地将一个小像素块复制成四个相同的大像素块(即最近邻插值),虽然尺寸变大了,但图像的分辨率(即信息密度)并未增加,只会导致图像看起来“颗粒粗糙”,丢失细节。因此,我们需要更智能的方法来“填充”放大后新增的像素位置。

上采样的三种实现方式

主要有三种方法可以实现上采样,它们以不同的方式解决了信息填充的问题。

1. 双线性插值

双线性插值是一种无需学习、完全基于几何计算的快速方法。它假设已知一个2x2网格四个角点的像素值,通过两次线性插值来估算网格内部任意点的值。

计算原理: 假设我们有一个2x2的网格,四个角点值分别为 Q11,Q12,Q21,Q22Q_{11}, Q_{12}, Q_{21}, Q_{22},对应坐标分别为 (x1,y1),(x1,y2),(x2,y1),(x2,y2)(x_1, y_1), (x_1, y_2), (x_2, y_1), (x_2, y_2)。我们需要求点 P(x,y)P(x, y) 的值。

  1. 首先在 xx 方向进行两次线性插值,得到 R1R_1 和 R2R_2: R1=x2−xx2−x1Q11+x−x1x2−x1Q21R_1 = \frac{x_2 - x}{x_2 - x_1} Q_{11} + \frac{x - x_1}{x_2 - x_1} Q_{21} R2=x2−xx2−x1Q12+x−x1x2−x1Q22R_2 = \frac{x_2 - x}{x_2 - x_1} Q_{12} + \frac{x - x_1}{x_2 - x_1} Q_{22}
  2. 然后在 yy 方向对 R1R_1 和 R2R_2 进行线性插值,得到 PP: P=y2−yy2−y1R1+y−y1y2−y1R2P = \frac{y_2 - y}{y_2 - y_1} R_1 + \frac{y - y_1}{y_2 - y_1} R_2

这个过程可以理解为:先连接上下两对点形成 y=y1y=y_1 与 y=y2y=y_2 两条线,在这两条线上分别找到与目标点 xx 坐标对应的点(即 R1R_1、R2R_2),再连接这两个点,其连线上与目标点 yy 坐标对应的值即为所求。

特点:

  • 无需学习:没有可训练参数,运行速度极快。
  • 操作简单:逻辑清晰,易于实现。
  • 效果不差:能产生相对平滑的放大结果,在许多场景下是有效的 baseline 方法。

2. 反卷积

反卷积,英文常称为 Deconvolution 或 Transposed Convolution,是本节的重点。它通过可学习的参数来实现上采样,能够从数据中自适应地学习如何“填充”信息。

核心思想:从“多对一”到“一对多”

普通卷积是一个“多对一”的映射:一个局部窗口内的多个输入值,通过卷积核加权求和,得到一个输出值。 反卷积则可以直观理解为“一对多”的映射:一个输入值,通过卷积核,被映射到输出特征图的一个局部区域中。

我们可以用两种等价的视角来理解反卷积操作:

视角一:投影式映射(一对多展开) 将输入特征图的每个元素视为一个“光源”,卷积核视为一个“投影模板”。每个输入值乘以卷积核的权重后,被“投射”到输出特征图对应的局部位置上。当多个输入值的投射区域重叠时,重叠处的值进行相加。

例如,一个2x2的输入,通过一个3x3的卷积核进行反卷积:

  1. 左上角输入值乘以卷积核,结果放置在输出图的左上角3x3区域。
  2. 右上角输入值乘以卷积核,结果放置在输出图右上角对应的3x3区域(与左上角区域有重叠)。
  3. 以此类推,四个输入值投射的四个3x3区域在输出图(4x4)上叠加,最终得到输出。

视角二:补零卷积(分数步长卷积) 这是另一种等价的、更易于实现的理解方式。我们可以通过对输入特征图进行补零,然后进行一个普通的卷积操作来实现上采样。

具体而言,对于输入尺寸 i′i',期望输出尺寸 o′o',卷积核尺寸 kk,步长 s′=1s'=1 的情况:

  1. 在输入特征图的每个像素之间插入 (s−1)(s-1) 个零,其中 ss 是与之对偶的普通卷积的步长。这会使输入尺寸扩大。
  2. 在扩大后的特征图外围再补上一圈零,补零圈数 p′=k−p−1p' = k - p - 1,其中 pp 是对偶普通卷积的填充数。
  3. 用一个尺寸为 kk 的卷积核,以步长1对这个补零后的特征图进行普通卷积,即可得到上采样后的输出。

当 s=1s=1 时,步骤1(像素间插零)可省略。这种在像素间插零导致卷积核滑动时“跳过”零点的操作,从原输入视角看,相当于卷积步长小于1(例如1/2),因此反卷积也被称为分数步长卷积。

参数关系:卷积与转置卷积的对偶性

反卷积(转置卷积)的参数与它所“逆转”的那个普通卷积的参数存在明确的数学对偶关系。理解这张表至关重要:

操作核尺寸步长填充输入尺寸输出尺寸
卷积kkssppiioo
转置卷积k′=kk' = ks′=1s' = 1p′=k−p−1p' = k - p - 1i′=oi' = oo′=s(i′−1)−2p+ko' = s(i'-1) - 2p + k

上表成立的前提是原卷积可被精确复原,即 (i+2p−k)(i + 2p - k) 能被 ss 整除;若不能整除,按此式反推会差几个像素,需要额外指定 output_padding 才能恢复到原输入尺寸。

重要示例:

  1. 卷积:i=4, o=2, k=3, s=1, p=0 (valid卷积) 对应的转置卷积:i'=2, o'=4, k'=3, s'=1, p'=2 (full padding卷积)
  2. 卷积:i=5, o=3, k=3, s=2, p=1 对应的转置卷积:先对输入 i'=3 插零:i'' = i' + (s-1)*(i'-1) = 3 + 1*2 = 5,然后设置 k'=3, s'=1, p'= k - p - 1 = 3-1-1=1,对 i''=5 卷积得到 o' = s(i'-1) - 2p + k = 2*(3-1) -2*1 +3 = 5。

为什么叫“转置卷积”? 从矩阵乘法的角度看,普通卷积操作可以等价于用一个特殊的、稀疏的卷积矩阵 CC 乘以被拉直(flatten)的输入向量 xx,得到输出向量 y=Cxy = Cx。 那么,其逆操作(上采样)理论上应该是 x=C−1yx = C^{-1}y。但求逆计算复杂且不一定存在。一个可行的近似是使用 CC 的转置矩阵 CTC^T 来上采样:x^=CTy\hat{x} = C^T y。这个用 CTC^T 进行上采样的操作,就被称为转置卷积。可以证明,前述“补零卷积”的操作在数学上等价于用 CTC^T 进行矩阵乘法。

3. 反池化

反池化,英文为 Unpooling,其思路更为直接,尤其常用于逆转 Max Pooling 操作。

核心思想:记录位置,还原信息 在最大池化时,我们不仅记录池化窗口内的最大值,还额外记录这个最大值在原始窗口中的位置索引。 在进行反池化时,我们将池化后的值,根据之前记录的索引,精确地放回到输出特征图对应的位置上。而其他没有记录的位置,则填充为0(或其他默认值,如最小值)。

特点:

  • 非参数化:没有需要学习的权重。
  • 保留结构:能较好地还原下采样前特征图的主要结构和激活位置。
  • 稀疏性:输出中非零值较少,可能导致结果看起来不够连续、比较“离散”。

方法对比与实践选择

方法是否需要学习优点缺点典型应用场景
双线性插值否速度快,实现简单,输出平滑无法适应数据,细节恢复能力有限快速原型、上采样初始化、最终输出层
反池化否能精确还原最大值位置,结构保持好输出稀疏,不连续,信息有损失与最大池化配对使用,在编码器-解码器结构(如SegNet)中常见
反卷积是强大的学习能力,能生成连续、丰富的特征计算量较大,需要训练,可能引入棋盘伪影主流的可学习上采样方式,典型应用于 FCN 等早期分割网络;DeepLab 系列则改用空洞卷积配合双线性插值

如何选择?

  • 追求速度和简单性:首选双线性插值。
  • 需要精确还原池化前结构:使用带索引记录的反池化。
  • 希望网络自动学习最佳的上采样方式,以生成高质量、连续的特征图:使用反卷积。事实上,一个参数设置合理的反卷积层,理论上可以拟合出双线性插值或反池化的效果。

在实际的语义分割网络(如FCN)中,常常会组合使用这些技术。例如,FCN-8s网络将深层特征图通过反卷积上采样后,与经过1x1卷积调整通道数的浅层特征图进行融合,以同时利用深层语义信息和浅层细节信息。

📝 动手练一练

  1. 概念辨析:反卷积(Deconvolution)有“转置卷积”和“分数步长卷积”两个别名。请简述这两个别名分别是从哪个角度来描述反卷积操作的?

    👉 点击查看参考答案
    • 转置卷积:从矩阵运算的角度。将普通卷积操作表示为稀疏矩阵 CC 与输入向量的乘法 y=Cxy=Cx。其逆操作(上采样)的一个近似是实现为 x^=CTy\hat{x} = C^T y,即使用卷积矩阵的转置进行运算,故得名。
    • 分数步长卷积:从补零操作的视角。通过在输入像素间插入零值,然后进行步长为1的普通卷积。从原始(未插零)输入的视角看,卷积核每次移动的距离小于1个像素,相当于步长是一个分数(如1/2),故得名。
  2. 参数计算:已知一个普通卷积层的参数为:输入尺寸 i=7,卷积核 k=3,步长 s=2,填充 p=1。请问,要将其输出特征图通过转置卷积恢复到输入尺寸 7,这个转置卷积层应该如何设置参数(核尺寸 k',步长 s',填充 p')?并计算其输入尺寸 i' 应为多少。

    👉 点击查看参考答案

    根据卷积与转置卷积的参数对偶关系:

    • 核尺寸不变:k' = k = 3
    • 转置卷积步长固定为1:s' = 1
    • 转置卷积填充:p' = k - p - 1 = 3 - 1 - 1 = 1
    • 转置卷积的输入尺寸等于原卷积的输出尺寸:i' = o

    需要先计算原卷积的输出尺寸 o: o = floor((i + 2p - k) / s) + 1 = floor((7 + 2*1 - 3) / 2) + 1 = floor(6 / 2) + 1 = 3 + 1 = 4

    所以,转置卷积的参数应为:i'=4, k'=3, s'=1, p'=1。 可以验证输出尺寸:o' = s(i' - 1) - 2p + k = 2*(4-1) - 2*1 + 3 = 6 - 2 + 3 = 7,与目标一致。

本章小结

本节深入探讨了计算机视觉深度学习中的关键操作——上采样。我们了解到,上采样并非简单的像素复制,而是需要智能地填充信息以恢复或构建高分辨率特征图。双线性插值无需学习、速度快,适合作为基线;反卷积(转置卷积/分数步长卷积)参数可学习、表达力强,是 FCN 等早期分割网络的主流选择(DeepLab 系列则用空洞卷积配合双线性插值替代反卷积);反池化依赖池化索引,能还原最大值位置但输出稀疏,常与最大池化配对(如 SegNet)。

今天,语义分割与超分辨率中还常用 PixelShuffle(亚像素卷积)、可学习上采样与 Transformer 解码器等方案;但双线性插值、转置卷积与反池化仍是理解上采样原理的三块基石。

📋 行动清单

  • 理解三种方法的核心机制:能清晰说出双线性插值、反卷积、反池化分别是如何工作的,以及各自的优缺点。
  • 掌握反卷积的参数换算:给定一个普通卷积层的参数,能够推导出其对应的转置卷积层参数,并理解其背后的对偶原理。
  • 建立实践选择思路:面对一个具体的上采样需求(如语义分割网络中的特征图放大),能够根据对速度、精度、连续性的要求,初步判断哪种方法或组合更为合适。

通过本节的学习,你已掌握了构建全卷积网络(FCN)、U-Net等现代图像分割模型所必需的上采样技术基础。在后续的章节中,我们将看到这些技术是如何被具体应用到解决像素级预测任务中的。

—— 小象教研组