ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

神经编码不是AI调参数:从表示学习看懂视频编码范式变革

神经编码不是AI调参数:从表示学习看懂视频编码范式变革 最近在跟同行聊视频编码的进展时我注意到一个相当普遍的误解很多人把“神经编码”理解为“用 AI 调参数”——觉得无非是让神经网络去选更好的量化参数、做更聪明的码率控制本质上还是传统编码那一套。这个理解不能说全错但它几乎完全错过了真正重要的东西。神经编码不是对 H.266/VVC 的小修小补而是把视频编码里最核心的“表示”这一层整个换掉了。这篇文章我想把这些变化拆开聊清楚传统编码卡在了哪里、神经编码到底改了什么、为什么它和“AI 调参数”有本质区别以及这项技术眼下走到哪一步了、想下场的人要怎么入手。适合看这篇文章的不只是做编解码算法的同学。做视频云转码、端侧处理、流媒体分发甚至是在做视频产品决策的朋友都会需要一套判断标准来识别“真神经编码”和“蹭 AI 概念”的差别避免被各种宣传绕进去。1. 先看传统编码几十年没变的“手工规则”到底卡在哪1.1 那套“工具箱思路”是怎么一路走来的从 H.264 到 H.265 再到 H.266视频编码的核心框架一直是同一套东西预测、变换、量化、熵编码。编码器要做的事本质上是在一堆人工设计的工具里做选择——对于一个块是用帧内预测还是帧间预测参考哪个方向残差做 DCT 还是别的变换量化步长取多少这些决策最后汇总成一个目标在给定的码率下让失真最小也就是业界常说的率失真优化RDO。这个框架本身没问题它让视频压缩在过去四十年里走了很远。H.264 比 MPEG-2 节省差不多一半码率H.265 又在 H.264 基础上省了接近 50%H.266 相对 H.265 还能再压掉 30% 到 40%。但每一代的提升代价都在指数级增加。我印象很深的是第一次编译 VTMVVC 参考软件的时候一个简单的序列压完编码时间是以小时计的。H.266 里一个编码单元CU的划分方式、帧内预测的角度模式、运动矢量的表达方式复杂度比 H.265 高了一个数量级。而它的收益呢和上一代相比只有百分之三四十。这就像一个人花了越来越多的力气从工具箱里翻出更多工具把每一颗螺丝都拧到最优但整台机器的架构本身从来没变过。1.2 天花板不是算力是“表示能力”问题出在哪我个人的理解是传统编码的一切决策都是建立在“人为定义的表示”之上的。像素块被拆成预测残差残差被变换成频域系数系数被量化成整数——每一步都合理每一步都是人在设计规则时“觉得”合理的。但视频画面是非常复杂的高维信号边缘、纹理、运动、遮挡、光照变化这些模式用有限的几类变换和预测模式去逼近迟早会碰到天花板。这个天花板不是算力不够而是“表示能力”不够。你再怎么优化模式选择、再怎么调参数都是在同一套人为定义的表示空间里打转。就像你想用笛卡尔坐标去描述一个球面坐标下很简单的曲线理论上可以但表达起来又繁琐又低效。所以传统编码真正卡住的地方是长期依赖人工设计的“表示”。2. 神经编码改了根本从“人工规则”到“数据学到的先验”2.1 把“表示”变成可学习的神经编码的核心变化简单说就是把上面那套人工设计的“表示”整个换成神经网络学出来的“表示”。典型的结构是一个自编码器编码器网络把一帧图像或一组帧映射成一个紧凑的潜变量latent representation这个潜变量经过量化后再用熵编码压成码流解码器网络则从码流中重建出图像。关键点在于这个潜变量不是人设计出来的特征而是网络在大量视频数据上自己学出来的。没有人规定它该是频域系数还是空间梯度它可以是任何一种对压缩最有利的表达方式。而且编码器和解码器是端到端联合训练的目标函数直接就是率失真损失比特数尽量小重建质量尽量高。这意味着“怎么表示视频”这件事本身也成了优化对象。我想用一个不严谨但好懂的类比传统编码是人工设计了一套语法然后把单词往里套神经编码是让模型自己发明一种更紧凑的语言。2.2 熵模型神经编码的秘密武器如果只看自编码器结构你可能觉得它和传统的变换编码差不太多——反正都是把像素映射成系数再压缩。真正的分水岭在熵编码这一步。传统编码里熵编码用的是人工设计的概率模型比如 CABAC 里的上下文模型根据相邻块的信息来估计当前符号的概率。神经编码则用另一个神经网络——通常叫超先验hyperprior——来显式地预测潜变量的概率分布。编码器把潜变量的一些统计特征单独编码成边信息解码器拿到边信息后就能知道潜变量的概率分布然后用算术编码把潜变量高效地压进码流。更进一步近年主流的方案还加了上下文模型让解码端按空间顺序或通道顺序逐个预测当前系数的概率类似传统编码里的“上下文自适应”只不过这里的上下文也是神经网络算出来的。这套“可学习的先验”让神经编码在熵编码环节能逼近信息论意义上的最优这是传统编码很难做到的——因为传统编码的概率模型受限于人写的规则而神经网络可以拟合极其复杂的分布。2.3 率失真目标R λD训练时整个系统优化的目标函数长这样L R λ·DR 是预估的码率通常由熵模型给出D 是重建失真可以用 MSE、MS-SSIM 或者更贴近主观的指标λ 是控制码率和质量平衡的超参数。为什么这个设计很重要因为它让“压缩”本身变成了一个可微的过程。训练时用一个带噪声的量化近似加均匀噪声模拟量化来保持梯度可传推理时才换成真正的硬量化。编码器能通过梯度回传学会“什么样的表示既能压得小、重建又够好”。这跟“AI 调参数”是完全不同层级的事调参数是在固定算法里找最优解神经编码是在改变算法本身。3. 神经编码不是“AI 调参数”三个容易被误读的层面3.1 三种“AI 编码”别混为一谈我观察到市面上的“AI 编码”大致分三类最容易被混淆。第一类是 AI 辅助工具用神经网络做运动估计、环路滤波、码率控制、自适应量化等但整体的预测-变换-熵编码框架不变。第二类是对传统编码结果做后处理增强比如超分、去块效应这类产品很多但它根本不碰码流格式。第三类才是神经编码编码器和解码器由神经网络实现码流里的数据是潜变量而非传统残差系数熵编码模型也是神经网络。只有第三类才是“范式变化”。这三类经常被摆在一起宣传效果上确实都能省码率或者提画质但技术栈、部署方式、标准进展、生态成熟度差得非常远。如果一个产品跟你说“AI 编码”先问一句码流格式变了吗解码器还是传统解码器吗如果解码器还是 VVC/AV1 那套那你只是在优化传统编码器里的某个环节不是神经编码。3.2 为什么“AI 调参数”的误解这么普遍这个误解流行是有原因的。一方面传统视频编码确实积累了大量“参数优化”的工作QP 的选择、拉格朗日乘子的调整、码率分配的权重这些在工程里都要大量调。引入 AI 后最自然的切入点就是用网络去替代这些环节因为这不需要改动码流格式和解码器商业落地快。另一方面业界习惯用“工具”思维理解进步——我们在 H.266 里加了个新工具压缩率又涨了几个点——这很容易让人以为神经网络也只是一个更高级的工具。但神经编码对产业链的冲击恰恰在于它不是工具是替换整个系统的地基。码流格式变了解码器芯片就得重新设计熵模型的依赖关系变了并行解码的调度也得重新考虑。这种级别的变化不是一个调参模型能带来的。3.3 一条简单的判断标准想快速分辨一个方案是不是“真神经编码”就看三个标志第一码流里传输的到底是不是神经网络产生的潜变量还是仍然存在变换系数、运动向量这类传统语法元素第二解码器端有没有神经网络参与重建而不只是做后处理第三整个系统的率失真性能是不是端到端联合优化出来的而不是模块之间各自为政补丁式叠加。三条都满足才是本文讨论的神经编码。4. 一个神经编码系统的实操形态训练、部署与评测4.1 数据准备与训练管线很多做传统编码的团队第一次接触神经编码时会觉得“不就是搭个网络嘛”其实数据工程的工作量不小。神经编码的第一性原理是“从数据里学先验”所以数据本身就极其重要。公开数据集里我用过比较顺手的包括 CLIC、Vimeo-90K、和从开放视频平台抓取的多元内容。预处理阶段要注意色彩空间的统一推荐在训练时就用 YUV 或 RGB 中和你目标部署一致的格式不要指望模型在色彩空间变化后还能保持性能——很多复现跑不出论文效果问题就出在数据预处理上。训练流程通常是对视频抽帧把连续多帧组成样本送入编码器-量化器-解码器架构。一个典型的训练循环伪代码如下import torch from torch.optim import Adam for epoch in range(num_epochs): for batch in dataloader: frames batch.to(device) # (B, T, C, H, W) optimizer.zero_grad() # 前向编码、模拟量化、熵估计、解码 y encoder(frames) # 潜变量 y_hat, y_likelihoods quantize_and_estimate(y) x_hat decoder(y_hat) # 失真项 d mse_loss(x_hat.clamp(0, 1), frames) # 码率项由熵模型给出的比特估计 r -torch.log2(y_likelihoods).sum() / (batch_size * H * W) loss r lambda_l * d loss.backward() optimizer.step()训练时用加均匀噪声来模拟量化是为了让梯度的近似保持可用推理时直接做硬量化。λ 的选择决定了模型压出来的码率档位实际部署时如果想支持多码率目前主流做法是训练多个模型或者用带金字塔式码率控制的变体网络这比传统编码“一个编码器跑所有码率”要奢侈得多。4.2 推理部署的三个硬骨头部署阶段神经编码有几个绕不开的问题。第一是解码器的计算量尤其带自回归上下文模型的方案按像素块或通道逐个预测概率天然是串行的比传统解码器慢一个数量级都不奇怪。我实测过一个 SOTA 级别模型1080p 解码在 A100 上勉强实时在端侧芯片上基本不可用。第二是码流结构的碎片化。每家方案的潜变量维度、量化方式、熵编码顺序都不一样标准没统一前用 A 家的码流只能用 A 家的解码器互不兼容。这与传统编码“一个标准解码器跑所有码流”的生态完全不同。第三是算子兼容性。很多自定义算子比如上下文建模里的掩码卷积在 PyTorch 里跑没问题导出到 TensorRT 或端侧 NPU 平台就可能不支持需要手写算子或改用等效的矩阵乘法来绕。我踩过的坑包括某家芯片只支持 4D 张量、不支持某些特殊 padding 模式的卷积某个部署工具对动态形状支持极差而自回归解码恰好需要动态形状。强烈建议在立项前先拿目标芯片的推理工具链做一次 PoC概念验证别等模型训完再发现部署无门。4.3 评测不能只看 PSNR评测号称“省了多少码率”之前先想清楚指标是什么。学术论文最爱报 PSNR 和 MS-SSIM但这两个指标和主观观感的相关性都一般。VMAF 是现在工业界比较认可的自适应指标但它对纹理丰富的场景比较敏感部分情况下 VMAF 的提升会被高估。更靠谱的做法是以固定 VMAF 分数为锚点比较码率同时人工挑几个典型片段——动画片、体育赛事、监控画面、电影字幕——做主观对比。还有一个很容易被忽略的细节神经编码模型在训练分布内的内容上表现很好但遇到分布外内容比如屏幕录制、低照度监控画面、文字密集的 UI 界面可能出现明显的伪影。我实际遇到过动画片里的线条被抹成色块的例子。所以不要把在自然视频上的 BD-Rate 结果直接外推到所有场景分场景建验证集是最基本的功课。5. 标准与产业的真实进展从 JPEG AI 到 MPEG NVC经常有人问我“神经编码是不是还停留在论文里”。其实早在 2021 年JPEG 委员会就启动了 JPEG AI 标准化工作目标是制定基于学习方法的图像编码标准。2024 年起这个标准已经进入工作草案阶段其能力模型Common Training Condition简称 CTC已经把若干个学习型压缩模型纳入参考软件。虽然它目前针对的是静态图像但它是第一个由主流标准组织推进的学习型编码标准意义在于给产业界一个统一的测试平台和评价方法。视频方面MPEG 在 2024 年初启动了神经视频编码探索实验NVC目标非常直接在不明显增加解码端复杂度的情况下达到甚至超过 VVC 的压缩效率。目前各家厂商和高校提交的方案基本都是端到端学习模型有的用光流模块做运动补偿来替代传统运动估计有的则是把帧间预测直接建模成条件编码问题。从论文和技术报告看当前 SOTA 方法在自然视频上与 VVC 相比仍有差距但趋势是差距在快速缩小。产业落地的速度比标准慢但比大多数人预期快。云转码场景里同一个视频在服务器端可以用非常耗时的编码模型压缩一次换取最终码率的大幅下降这在高码率内容分发平台上是能算得过账的。短视频场景则受终端机型碎片化制约解码端必须能在中低端手机上有可接受的功耗短期内很难全面铺开。监控场景我反而比较看好——内容类型高度集中、解码端可以用专用硬件、单路的码率节省能直接换算成存储成本降低。6. 现在想入局可以从哪里下手6.1 把开源工具先跑起来对一个想入门的团队来说最快的路径不是自己从零搭模型而是把现有的开源库跑通。我比较推荐的是 PyTorch 生态下的 CompressAI它集成了好几个经典的学习型图像压缩模型也提供了率失真评测工具。安装很简单pip install compressai然后就可以用它的命令行工具训练和评测# 训练一个带超先验的模型λ设为0.03对应较高码率档 python -m compressai.utils.train --dataset /path/to/images --epochs 100 \ --model mbt2018 --lambda 0.03 --batch-size 16 --save /path/to/checkpoint我建议你从静态图像模型入手先理解潜变量、熵模型、率失真损失这几根支柱再把模型扩展到多帧视频。不要一上来就追最新的 SOTA 论文——很多 SOTA 的复现成本极高而基础模型的训练和评测流程完全能够帮你建立正确的直觉。6.2 组织你自己的视频训练与验证集用公开数据集验证之外一定要建立一个属于你自己的验证集尤其是如果你目标是某个垂直场景。我的做法是抽一百段目标场景视频每段截取 5 到 10 秒转成统一的 raw 格式然后分别用传统编码器和神经编码器压成若干码率档位做 BD-Rate 对比和主观评测。这件事听起来简单真正做的时候要注意几点锚点选择要用你对比的真实基线比如 x265 的 veryslow 或 VTM而不是默认的 medium 预设否则会出现神经编码“省码率”其实是基线的预设太差的乌龙颜色格式转换要一致建议统一用 4:2:0 的 YUV统计真实码率时要用实际码流大小而不是训练时的概率估计值。训练时估算的 R 和实际架起熵编码后的比特数通常有 2% 到 5% 的偏差这在学术上能接受在工程评估里不能。6.3 给不同角色的建议研究团队可以继续往端到端表示学习上深挖尤其是帧间建模和熵模型加速这两个方向离实用最近。云服务商和分发平台的团队可以考虑先跑通“离线编码 云端解码”的试点把节省的带宽成本量化出来——这类场景对编码延迟容忍度高是神经编码最好的切入点。芯片团队要做的则是盯紧标准的进展提前布局支持神经网络推理的解码架构但别急着流片标准没冻结前改动成本太高。7. 常见误区速查与我的经验常见说法实际情况“神经编码就是 AI 调参数”错。它改变的是表示方式和编解码框架本身不只是参数选择。“神经编码一定比 VVC 省码率”不一定。目前只在特定内容类型和码率区间占优分布外内容可能明显劣化。“训练完模型就能直接商用”远不够。部署算力、算子兼容性、码流兼容性、标准合规都要解决。“解码器有神经网络就算神经编码”不能只看解码器还要看码流里有没有传统语法元素。“PSNR 高就代表画质好”不一定主观质量测试和 VMAF 通常更接近观感。“有了神经编码就不用做传统编码了”现实是两者会长期并存混合方案更常见。我个人的实操体会是看再多的论文和宣传稿都不如自己动手训练一个最小的神经编码模型来得直观。我第一次跑通一个极小的自编码器压缩图像时看到潜变量的分布和重建效果才对“表示学习”这件事有了真正的体感。后来在评估某个声称“AI 编码”的方案时我打开码流一看发现里面还是 DCT 系数和运动向量只不过码率控制用了网络——那个瞬间我才彻底明白标题这句话的力量神经编码不是“AI 调参数”它本质上是换了一套描述视频的语言。如果你现在正打算评估或落地相关方案我的建议只有一条先去拿真实内容跑通端到端实验用真实码流、真实解码器、真实主观测试来验证然后再决定要投入多少资源。这件事没有捷径但也没有大多数人想得那么远。
返回列表