来源:papers/iVc/DVC_专题01_DVC方法训练与实验.md · 原始 Markdown
DVC|DVC 方法、训练与实验(原请求为精读)
用户问题:精读论文
来源:本聊天
01a13ae4-6cb2-7f23-b09c-942490bf8387,公开回复记录第 280 行,2026-10-15 00:14:40 +08:00。可核实定位:主文第1—5节的专题讲解;图2—8、表1;补充图3、表1。
整理时核对发现 · 勘误 K01: 原回复使用“精读”或“讲完”的措辞;其实际形式是专题讲解,未按原文逐段提供英文摘录、翻译与讲解,不代表全文精读完成。下文保留历史原话。
原进度消息中的实质性补充(记录第 270 行)
图 2 有一个关键约束:运动补偿必须使用“压缩后再解码的光流”,这样接收端才能生成相同的预测。补充实验还显示,DVC 的优势随指标和视频内容变化,并不是每个序列都优于 H.264。
我们精读的是 DVC: An End-to-end Deep Video Compression Framework(CVPR 2019)。这次重点看清三件事:每个模块为什么存在、最终损失如何影响它们,以及实验究竟证明了什么。
主文:DVC 主论文
补充材料:DVC 补充材料
- 读 Introduction,要抓住“运动也需要付出编码成本”这个问题。
作者先回顾传统视频编码:根据参考帧预测当前帧,再编码运动信息和预测残差。你已经学过这条流程。
深度图像压缩可以用网络学习变换,那么视频压缩能否也采用神经网络?难点在于,视频多了一种需要传输的信息:运动。
光流能够描述逐像素运动,但一张 H\times W 的光流图有 2HW 个数值。如果直接传输,可能把预测节省的比特又花掉。
因此,作者提出的核心问题是:
如何学习一种运动表示,使它既有助于预测,又容易压缩,并与残差编码共同获得好的率失真表现?
精读时要纠正一个容易产生的误解:传统编码器已经使用率失真优化。DVC 的新意在于,把多个可学习模块放进同一个率失真训练目标。
Related Work 中的对比也围绕这一点展开:一些已有方法只替换传统编码器的某个模块;作者特别强调,DVC 同时学习运动估计、运动压缩、运动补偿和残差压缩。
- 进入第 3 节,先把符号分清,否则图 2 会越看越乱。
| 符号 | 含义 |
|---|---|
| x_t | 当前原始帧 |
| \hat x_{t-1} | 上一帧的重建结果,作为参考 |
| v_t,\hat v_t | 估计光流、压缩后解码得到的光流 |
| m_t,\hat m_t | 运动潜变量、量化后的运动潜变量 |
| \bar x_t | 根据参考帧和解码光流生成的预测帧 |
| r_t,\hat r_t | 原始残差、解码残差 |
| y_t,\hat y_t | 残差潜变量、量化后的残差潜变量 |
| \hat x_t | 最终重建的当前帧 |
这里有两组必须区分:
光流 v_t 描述运动;潜变量 m_t 是网络为压缩运动而生成的表示。
残差 r_t 是像素域的预测误差;潜变量 y_t 是网络变换后的残差表示。
帽子通常表示量化或重建结果;横线表示预测结果。
- 图 2 的运动分支,可以拆成“估计→编码→量化→解码”。
为了说明流程,下面用 F,E_m,D_m 分别表示光流网络、运动编码器和运动解码器。这些函数名是我为讲解添加的记号。
v_t=F(x_t,\hat x_{t-1})
光流网络观察当前原始帧与上一帧重建结果,估计两者之间的运动。该模块使用论文引用的空间金字塔光流网络作为基础,并用预训练权重初始化。
随后:
m_t=E_m(v_t),\qquad \hat m_t=Q(m_t),\qquad \hat v_t=D_m(\hat m_t)
运动补偿使用的是 \hat v_t,即压缩后再解码的光流。
这是整个框架中的重要约束。接收端只能从码流恢复 \hat m_t,再得到 \hat v_t。编码端必须用同样的光流生成预测,才能与解码端保持一致。
图 3 给出了运动编码器的具体结构:四层步长为 2 的卷积,将空间尺寸连续缩小,并使用 GDN 非线性变换。其尺寸变化为:
H\times W\times2 \rightarrow \frac H{16}\times\frac W{16}\times128
例如,输入光流为 256\times256\times2,运动潜变量为 16\times16\times128。
空间尺寸缩小,通道数增加,是把运动信息重新组织到特征空间中。实际节省多少比特,还取决于量化结果和符号概率,不能只看张量尺寸。 图 3 中黑白格子的特征图也只是示意,不表示每个潜变量只有一位。
- 第 3.4 节的运动补偿有两步:先变形,再修正。
首先,按照解码光流对参考帧进行变形:
\tilde x_t=w(\hat x_{t-1},\hat v_t)
可以把它理解为:对当前画面中的每个位置,按照光流指定的位置,到参考帧中取像素。
但变形结果仍可能存在伪影。预测问题本身就可能遇到遮挡、新露出的区域和插值误差,光流压缩还会带来额外误差。
作者因此把三种信息拼接后送入修正网络:
\bar x_t= C\!\left( \operatorname{concat} [\,\tilde x_t,\hat x_{t-1},\hat v_t\,] \right)
在 RGB 情况下,输入包含变形图像的 3 个通道、参考图像的 3 个通道,以及光流的 2 个通道,共 8 个通道。
补充材料图 3 展示了这个网络:它使用残差块、两次下采样和两次上采样,并连接不同尺度的特征。
读这一节时,注意修正网络没有输入当前原始帧 x_t。这些输入在解码端都能获得,所以解码端能够生成相同的预测。
- 第 3.5 节的残差分支,负责补上预测没有解释好的内容。
先计算:
r_t=x_t-\bar x_t
再经过残差编码、量化和解码:
y_t=E_r(r_t),\qquad \hat y_t=Q(y_t),\qquad \hat r_t=D_r(\hat y_t)
最后:
\hat x_t=\bar x_t+\hat r_t
作者采用已有深度图像压缩工作中的非线性网络来处理残差。它承担了传统变换编码中“把残差转到适合压缩的表示”的作用。
一个教学例子:当前像素为 120,预测为 115,原始残差为 5。如果残差解码后变成 4,最终重建就是 119。
这里有一个重要推论:预测不必完美,残差可以补偿预测误差;但补偿需要花比特。
省略熵编码的内部细节,解码端的主体过程可以写成:
```text 从运动码流恢复量化运动潜变量 从残差码流恢复量化残差潜变量
解码光流 = 运动解码器(量化运动潜变量) 变形图像 = warp(上一帧重建结果, 解码光流) 预测帧 = 运动补偿网络(变形图像, 参考帧, 解码光流)
解码残差 = 残差解码器(量化残差潜变量) 当前重建帧 = 预测帧 + 解码残差
保存当前重建帧,作为后续参考 ```
解码端无需重新估计光流,也无需看到当前原始帧。
- 公式(1)是论文最重要的部分:三个成本一起优化。
L= \lambda\,d(x_t,\hat x_t) +H(\hat m_t) +H(\hat y_t)
第一项是最终重建失真,论文使用 MSE;后两项分别表示运动和残差的编码成本。
这个目标要求网络同时考虑:
- 最终图像是否准确。
- 描述运动是否昂贵。
- 修正预测误差是否昂贵。
所以,光流网络不能只追求预测准确。它还要考虑自己生成的运动是否容易编码,以及这个运动会留下怎样的残差。
用一个自设例子理解:某种运动表示多花了 0.01 bpp,却使残差少花 0.03 bpp,且最终失真相同,那么总码率减少了 0.02 bpp,这种变化值得采用。
这就是模块之间的协作。
论文在这个损失中没有加入真实光流的监督项。光流网络经过初始化之后,服务于最终的视频压缩目标。
同时注意,\lambda 乘在失真上:它越大,训练通常越重视画质。作者分别训练了 \lambda=256,512,1024,2048 的四个模型,得到不同的率失真工作点。
- 第 3.6 节还要解决两个训练障碍:量化和码率如何参与反向传播。
普通取整几乎处处梯度为零,无法直接提供有效的训练信号。作者在训练时,用添加均匀噪声来替代取整:
\tilde y_t=y_t+\eta
给定采样噪声后,这个表达式对 y_t 的导数为 1,梯度能够传回编码器。推理时则使用:
\hat y_t=\operatorname{round}(y_t)
运动潜变量采用相同思路。这里我用波浪号区分训练时的连续近似,避免把它与实际整数符号混淆。
对码率,作者通过概率估计网络建模潜变量分布。一个符号 s 的理想码长估计为:
\ell(s)\approx-\log_2p(s)
例如,概率为 1/2 时对应约 1 bit;概率为 1/8 时对应约 3 bits。因此可以把编码成本理解为:
R_m\approx\sum_i-\log_2p_m(\hat m_{t,i})
残差编码成本同理。
网络学习的不只是“怎样重建”,还包括“怎样生成容易被概率模型编码的符号”。
这里的端到端训练使用量化和码率的可微近似。 实际推理仍需要离散量化与熵编码。图 8(a) 比较了估计码率和算术编码得到的实际码率,两者相近,为训练中的码率估计提供了支持。
- 缓存重建帧,是作者为训练效率做的一项具体设计。
当前帧依赖 \hat x_{t-1},而它又依赖更早的重建帧。如果每次都从前面重新编码,训练会增加计算和显存开销,也不利于一个批次包含多样样本。
作者采用在线缓存:编码完一帧后保存其重建结果,以后编码后续帧时读取缓存,并在训练中不断更新。
这既减轻了计算负担,也让训练能够接触已经带有压缩误差的参考图像。
作者还比较了另一种训练方式:直接使用上一帧原始图像作为参考。缓存重建帧的方案在相同 bpp 下约有 0.2 dB 优势。
我的解读是,这个实验支持训练时使用接近实际解码条件的参考图像。论文没有据此证明整段长视频经过展开、跨所有历史帧反向传播;精读时应区分当前帧网络的联合训练与长序列优化。
- 看图 5 和补充表 1,要同时看指标、基线和序列差异。
实验采用 Vimeo-90k 训练,在 UVG 和 HEVC Class B/C/D/E 上评估。训练裁剪为 256\times256,批次大小为 4,使用 Adam,初始学习率为 10^{-4}。
横轴 bpp 表示每像素所需比特数,越小越省;纵轴 PSNR 或 MS-SSIM 越高,表示对应指标下重建越好。比较曲线时,应在相同码率下比较质量,或者在相同质量下比较码率。
补充表 1 给出了所列 16 个 HEVC 序列的平均 BD-BR:
| 相对 H.264 的 BD-BR | DVC | H.265 |
|---|---|---|
| 以 PSNR 衡量质量 | −19.22% | −25.06% |
| 以 MS-SSIM 衡量质量 | −29.32% | −21.73% |
负数代表相对基线节省码率。因此,平均结果支持:
DVC 优于论文配置下的 H.264;与 H.265 相比,PSNR 结果仍有差距,MS-SSIM 结果更有竞争力。
29.32% 的基线是 H.264,不能把它读成“相对 H.265 节省 29.32%”。
而且,平均优势不代表每个序列都胜出。例如 BQMall 的 PSNR BD-BR 为 +26.13%,说明该序列上 DVC 相对 H.264 需要更多码率。
传统编码器使用 FFmpeg 的 veryfast 配置,所以性能结论需要与这些设置一起理解。论文对 Wu 等人方法的比较还涉及不同预测结构:DVC 使用一个过去的参考帧,而对方使用两个邻近参考帧。
- 图 6、表 1、图 7 的消融,比“网络更强”更能解释论文贡献。
| 改动 | 论文报告的影响 |
|---|---|
| 冻结光流网络,不参与联合训练 | 压缩性能下降 |
| 去掉运动补偿修正网络 | 相同 bpp 下 PSNR 约下降 1 dB |
| 去掉运动编码器、解码器 | PSNR 下降超过 2 dB |
| 不使用运动,每帧独立处理 | PSNR 下降超过 2 dB |
| 训练参考改用上一帧原始图像 | PSNR 约下降 0.2 dB |
主文表 1 尤其值得看:
| 方案 | 光流编码成本 | 变形图像 PSNR |
|---|---:|---:|
| 冻结光流网络 | 0.044 bpp | 27.33 dB |
| 联合训练 | 0.029 bpp | 28.17 dB |
联合训练后,运动编码成本约减少了 34%,变形图像的 PSNR 还提高了 0.84 dB。
这里的 PSNR 衡量的是**变形图像**,不是最终加上残差后的重建帧。两者不能混用。
图 7 则提供了机制上的线索:联合训练后的重建光流出现更多零运动区域。对一些纹理均匀的区域,运动值即使偏离真实运动,采样得到的像素仍可能很接近。
**这组结果说明,用于压缩的运动表示可以优先保留对预测有价值、又容易编码的信息。** 但“零光流更多”只是可压缩性的一个解释,实际码率仍由潜变量与概率模型决定。
图 8(b) 还显示,随着 \lambda 增大,总码率上升,运动信息所占比例从 38.8% 降至 26.9%。比例下降并不等于运动的绝对码率下降,要同时看分母如何变化。
-
最后评估论文贡献与边界,避免把实验结论扩大。
我的判断是,DVC 最有价值的贡献是:把可学习的运动表示及其编码成本,纳入运动补偿和残差编码共同参与的率失真优化。 光流、压缩变换和概率建模都有已有工作的基础,作者的重要工作在于把它们组成有效的视频压缩系统。
论文还留下几个值得继续研究的问题:
- 时间信息利用有限。 主网络只使用一个过去的重建参考帧,多参考帧和双向预测仍有扩展空间。
- 码率调节依赖多个模型。 四个 \lambda 对应分别训练的模型,论文没有由此建立一个完整的连续码率控制机制。
- 首帧与完整码流细节没有在主网络图中展开。 复现完整视频编码系统时,还需要明确首帧编码、必要附加信息和总比特统计方式。
- 运行速度具有具体实验条件。 论文在 352\times288 视频上报告约 24.5 fps 编码、41 fps 解码,不能直接据此推断高分辨率实时表现。
回到图 2,最值得你亲自追踪的一条依赖关系是:
\boxed{ \text{光流} \rightarrow\text{运动潜变量} \rightarrow\text{解码光流} \rightarrow\text{预测} \rightarrow\text{残差} \rightarrow\text{最终重建} }
改变前面的光流,不仅改变运动码率,还会改变残差码率和最终失真。公式(1)把这三个后果一起反馈给网络,这就是理解整篇 DVC 的关键。