# DVC｜DVC 方法、训练与实验（原请求为精读）

> 用户问题：精读论文
>
> 来源：本聊天 `01a13ae4-6cb2-7f23-b09c-942490bf8387`，公开回复记录第 280 行，2026-10-15 00:14:40 +08:00。
>
> 可核实定位：主文第1—5节的专题讲解；图2—8、表1；补充图3、表1。

> **整理时核对发现 · [勘误 K01](DVC_讲解全文.md#erratum-k01)：** 原回复使用“精读”或“讲完”的措辞；其实际形式是专题讲解，未按原文逐段提供英文摘录、翻译与讲解，不代表全文精读完成。下文保留历史原话。

### 原进度消息中的实质性补充（记录第 270 行）

<!-- source-body:C270:begin -->
图 2 有一个关键约束：运动补偿必须使用“压缩后再解码的光流”，这样接收端才能生成相同的预测。补充实验还显示，DVC 的优势随指标和视频内容变化，并不是每个序列都优于 H.264。

<!-- source-body:C270:end -->

<!-- source-body:R05:begin -->
我们精读的是 **DVC: An End-to-end Deep Video Compression Framework（CVPR 2019）**。这次重点看清三件事：每个模块为什么存在、最终损失如何影响它们，以及实验究竟证明了什么。

主文：[DVC 主论文](Lu_DVC_An_End-To-End_Deep_Video_Compression_Framework_CVPR_2019_paper.pdf)

补充材料：[DVC 补充材料](Lu_DVC_An_End-To-End_CVPR_2019_supplemental.pdf)

1. **读 Introduction，要抓住“运动也需要付出编码成本”这个问题。**

   作者先回顾传统视频编码：根据参考帧预测当前帧，再编码运动信息和预测残差。你已经学过这条流程。

   深度图像压缩可以用网络学习变换，那么视频压缩能否也采用神经网络？难点在于，视频多了一种需要传输的信息：**运动**。

   光流能够描述逐像素运动，但一张 \(H\times W\) 的光流图有 \(2HW\) 个数值。如果直接传输，可能把预测节省的比特又花掉。

   因此，作者提出的核心问题是：

   > 如何学习一种运动表示，使它既有助于预测，又容易压缩，并与残差编码共同获得好的率失真表现？

   精读时要纠正一个容易产生的误解：**传统编码器已经使用率失真优化。DVC 的新意在于，把多个可学习模块放进同一个率失真训练目标。**

   Related Work 中的对比也围绕这一点展开：一些已有方法只替换传统编码器的某个模块；作者特别强调，DVC 同时学习运动估计、运动压缩、运动补偿和残差压缩。

2. **进入第 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\) 是网络变换后的残差表示。**

   帽子通常表示量化或重建结果；横线表示预测结果。

3. **图 2 的运动分支，可以拆成“估计→编码→量化→解码”。**

<!-- export-addition:R05-fig2:begin -->
<figure id="main-figure-2">

![主文图 2：传统预测编码与 DVC 架构；主论文 PDF 第4页，印刷页11009](DVC_讲解资源/figures/main-figure-2.png)

<figcaption>【整理时补入原图】主文图 2：传统预测编码与 DVC 架构。主论文 PDF 第4页，印刷页11009；图像直接从原 PDF 截取，保留原图注。来源：<a href="Lu_DVC_An_End-To-End_Deep_Video_Compression_Framework_CVPR_2019_paper.pdf#page=4">主文，对应页面</a>。</figcaption>
</figure>
<!-- export-addition:R05-fig2:end -->

   为了说明流程，下面用 \(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\)。

<!-- export-addition:R05-fig3:begin -->
<figure id="main-figure-3">

![主文图 3：运动编码器与解码器；主论文 PDF 第4页，印刷页11009](DVC_讲解资源/figures/main-figure-3.png)

<figcaption>【整理时补入原图】主文图 3：运动编码器与解码器。主论文 PDF 第4页，印刷页11009；图像直接从原 PDF 截取，保留原图注。来源：<a href="Lu_DVC_An_End-To-End_Deep_Video_Compression_Framework_CVPR_2019_paper.pdf#page=4">主文，对应页面</a>。</figcaption>
</figure>
<!-- export-addition:R05-fig3:end -->

   空间尺寸缩小，通道数增加，是把运动信息重新组织到特征空间中。**实际节省多少比特，还取决于量化结果和符号概率，不能只看张量尺寸。** 图 3 中黑白格子的特征图也只是示意，不表示每个潜变量只有一位。

4. **第 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 展示了这个网络：它使用残差块、两次下采样和两次上采样，并连接不同尺度的特征。

<!-- export-addition:R05-mc:begin -->
<figure id="main-figure-4">

![主文图 4：运动补偿流程；主论文 PDF 第5页，印刷页11010](DVC_讲解资源/figures/main-figure-4.png)

<figcaption>【整理时补入原图】主文图 4：运动补偿流程。主论文 PDF 第5页，印刷页11010；图像直接从原 PDF 截取，保留原图注。来源：<a href="Lu_DVC_An_End-To-End_Deep_Video_Compression_Framework_CVPR_2019_paper.pdf#page=5">主文，对应页面</a>。</figcaption>
</figure>

<figure id="supp-figure-3">

![补充材料图 3：运动补偿网络内部结构；补充材料 PDF 第3页](DVC_讲解资源/figures/supp-figure-3.png)

<figcaption>【整理时补入原图】补充材料图 3：运动补偿网络内部结构。补充材料 PDF 第3页；图像直接从原 PDF 截取，保留原图注。来源：<a href="Lu_DVC_An_End-To-End_CVPR_2019_supplemental.pdf#page=3">补充材料，对应页面</a>。</figcaption>
</figure>
<!-- export-addition:R05-mc:end -->

   读这一节时，注意**修正网络没有输入当前原始帧 \(x_t\)**。这些输入在解码端都能获得，所以解码端能够生成相同的预测。

5. **第 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(上一帧重建结果, 解码光流)
   预测帧 = 运动补偿网络(变形图像, 参考帧, 解码光流)

   解码残差 = 残差解码器(量化残差潜变量)
   当前重建帧 = 预测帧 + 解码残差

   保存当前重建帧，作为后续参考
   ```

   解码端无需重新估计光流，也无需看到当前原始帧。

6. **公式（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\) 的四个模型，得到不同的率失真工作点。

7. **第 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) 比较了估计码率和算术编码得到的实际码率，两者相近，为训练中的码率估计提供了支持。

8. **缓存重建帧，是作者为训练效率做的一项具体设计。**

   当前帧依赖 \(\hat x_{t-1}\)，而它又依赖更早的重建帧。如果每次都从前面重新编码，训练会增加计算和显存开销，也不利于一个批次包含多样样本。

   作者采用在线缓存：编码完一帧后保存其重建结果，以后编码后续帧时读取缓存，并在训练中不断更新。

   这既减轻了计算负担，也让训练能够接触已经带有压缩误差的参考图像。

   作者还比较了另一种训练方式：直接使用上一帧原始图像作为参考。缓存重建帧的方案在相同 bpp 下约有 0.2 dB 优势。

   我的解读是，这个实验支持**训练时使用接近实际解码条件的参考图像**。论文没有据此证明整段长视频经过展开、跨所有历史帧反向传播；精读时应区分当前帧网络的联合训练与长序列优化。

9. **看图 5 和补充表 1，要同时看指标、基线和序列差异。**

<!-- export-addition:R05-results:begin -->
<figure id="main-figure-5">

![主文图 5：率失真曲线；主论文 PDF 第6页，印刷页11011](DVC_讲解资源/figures/main-figure-5.png)

<figcaption>【整理时补入原图】主文图 5：率失真曲线。主论文 PDF 第6页，印刷页11011；图像直接从原 PDF 截取，保留原图注。来源：<a href="Lu_DVC_An_End-To-End_Deep_Video_Compression_Framework_CVPR_2019_paper.pdf#page=6">主文，对应页面</a>。</figcaption>
</figure>

<figure id="supp-table-1">

![补充材料表 1：16 个 HEVC 序列的 BD 指标；补充材料 PDF 第1页](DVC_讲解资源/figures/supp-table-1.png)

<figcaption>【整理时补入原图】补充材料表 1：16 个 HEVC 序列的 BD 指标。补充材料 PDF 第1页；图像直接从原 PDF 截取，保留原图注。来源：<a href="Lu_DVC_An_End-To-End_CVPR_2019_supplemental.pdf#page=1">补充材料，对应页面</a>。</figcaption>
</figure>
<!-- export-addition:R05-results:end -->

   实验采用 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 使用一个过去的参考帧，而对方使用两个邻近参考帧。

10. **图 6、表 1、图 7 的消融，比“网络更强”更能解释论文贡献。**

<!-- export-addition:R05-ablation:begin -->
<figure id="main-figure-6">

![主文图 6：消融实验；主论文 PDF 第7页，印刷页11012](DVC_讲解资源/figures/main-figure-6.png)

<figcaption>【整理时补入原图】主文图 6：消融实验。主论文 PDF 第7页，印刷页11012；图像直接从原 PDF 截取，保留原图注。来源：<a href="Lu_DVC_An_End-To-End_Deep_Video_Compression_Framework_CVPR_2019_paper.pdf#page=7">主文，对应页面</a>。</figcaption>
</figure>

<figure id="main-table-1">

![主文表 1：光流码率与变形图像 PSNR；主论文 PDF 第7页，印刷页11012](DVC_讲解资源/figures/main-table-1.png)

<figcaption>【整理时补入原图】主文表 1：光流码率与变形图像 PSNR。主论文 PDF 第7页，印刷页11012；图像直接从原 PDF 截取，保留原图注。来源：<a href="Lu_DVC_An_End-To-End_Deep_Video_Compression_Framework_CVPR_2019_paper.pdf#page=7">主文，对应页面</a>。</figcaption>
</figure>
<!-- export-addition:R05-ablation:end -->

    | 改动 | 论文报告的影响 |
    |---|---|
    | 冻结光流网络，不参与联合训练 | 压缩性能下降 |
    | 去掉运动补偿修正网络 | 相同 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 则提供了机制上的线索：联合训练后的重建光流出现更多零运动区域。对一些纹理均匀的区域，运动值即使偏离真实运动，采样得到的像素仍可能很接近。

<!-- export-addition:R05-flow:begin -->
<figure id="main-figure-7">

![主文图 7：光流可视化与运动幅度统计；主论文 PDF 第7页，印刷页11012](DVC_讲解资源/figures/main-figure-7.png)

<figcaption>【整理时补入原图】主文图 7：光流可视化与运动幅度统计。主论文 PDF 第7页，印刷页11012；图像直接从原 PDF 截取，保留原图注。来源：<a href="Lu_DVC_An_End-To-End_Deep_Video_Compression_Framework_CVPR_2019_paper.pdf#page=7">主文，对应页面</a>。</figcaption>
</figure>
<!-- export-addition:R05-flow:end -->

    **这组结果说明，用于压缩的运动表示可以优先保留对预测有价值、又容易编码的信息。** 但“零光流更多”只是可压缩性的一个解释，实际码率仍由潜变量与概率模型决定。

    图 8(b) 还显示，随着 \(\lambda\) 增大，总码率上升，运动信息所占比例从 38.8% 降至 26.9%。比例下降并不等于运动的绝对码率下降，要同时看分母如何变化。

<!-- export-addition:R05-rate:begin -->
<figure id="main-figure-8">

![主文图 8：估计与实际码率、运动码率占比；主论文 PDF 第8页，印刷页11013](DVC_讲解资源/figures/main-figure-8.png)

<figcaption>【整理时补入原图】主文图 8：估计与实际码率、运动码率占比。主论文 PDF 第8页，印刷页11013；图像直接从原 PDF 截取，保留原图注。来源：<a href="Lu_DVC_An_End-To-End_Deep_Video_Compression_Framework_CVPR_2019_paper.pdf#page=8">主文，对应页面</a>。</figcaption>
</figure>
<!-- export-addition:R05-rate:end -->

11. **最后评估论文贡献与边界，避免把实验结论扩大。**

    我的判断是，DVC 最有价值的贡献是：**把可学习的运动表示及其编码成本，纳入运动补偿和残差编码共同参与的率失真优化。** 光流、压缩变换和概率建模都有已有工作的基础，作者的重要工作在于把它们组成有效的视频压缩系统。

    论文还留下几个值得继续研究的问题：

    - **时间信息利用有限。** 主网络只使用一个过去的重建参考帧，多参考帧和双向预测仍有扩展空间。
    - **码率调节依赖多个模型。** 四个 \(\lambda\) 对应分别训练的模型，论文没有由此建立一个完整的连续码率控制机制。
    - **首帧与完整码流细节没有在主网络图中展开。** 复现完整视频编码系统时，还需要明确首帧编码、必要附加信息和总比特统计方式。
    - **运行速度具有具体实验条件。** 论文在 \(352\times288\) 视频上报告约 24.5 fps 编码、41 fps 解码，不能直接据此推断高分辨率实时表现。

    回到图 2，最值得你亲自追踪的一条依赖关系是：

    \[
    \boxed{
    \text{光流}
    \rightarrow\text{运动潜变量}
    \rightarrow\text{解码光流}
    \rightarrow\text{预测}
    \rightarrow\text{残差}
    \rightarrow\text{最终重建}
    }
    \]

    改变前面的光流，不仅改变运动码率，还会改变残差码率和最终失真。**公式（1）把这三个后果一起反馈给网络，这就是理解整篇 DVC 的关键。**
<!-- source-body:R05:end -->
