轻量级WCDANN网络:基于深度可分离卷积与注意力机制的VVC视频后处理

发布时间:2026/5/26 23:51:40

轻量级WCDANN网络:基于深度可分离卷积与注意力机制的VVC视频后处理 1. 项目概述为VVC解码视频“美颜”的轻量级后处理利器在视频流媒体、视频会议、短视频平台无处不在的今天高效压缩与高质量还原之间的矛盾始终是横亘在工程师面前的一道难题。VVCVersatile Video Coding通用视频编码作为最新的国际视频编码标准虽然相比前代HEVCH.265能节省约30%的码率但其基于块的混合编码框架尤其是量化环节依然会不可避免地引入压缩失真。这些失真在视觉上表现为恼人的块效应Blocking Artifacts、振铃效应Ringing Artifacts和平坦区域的带状伪影Banding Artifacts严重影响了用户的观看体验。传统的解决方案是在编码环路内In-loop加入手工设计的滤波器如去块滤波DBF、样本自适应偏移SAO和自适应环路滤波ALF。这些滤波器基于信号处理理论对平稳信号假设有效但面对复杂多变的自然视频内容其性能提升存在天花板。近年来基于深度学习的后处理Post-processing技术异军突起它像一个独立的“美颜师”站在解码器的输出端对已经受损的视频帧进行智能修复无需改动编码器本身部署灵活。然而许多先进的CNN模型动辄数百万甚至上千万参数巨大的计算开销使其难以在资源受限的移动设备或实时编码系统中落地。我们团队这次要深入探讨的WCDANNWeakly Connected Dense Attention Neural Network正是瞄准了这一痛点。它不是一个追求极致性能的“庞然大物”而是一个在性能、模型复杂度和实用性之间取得精妙平衡的“轻骑兵”。其核心设计哲学非常明确用深度可分离卷积Depthwise Separable Convolution大幅“瘦身”用注意力机制Attention Mechanism精准“聚焦”。这篇文章我将从一个一线算法工程师的视角带你彻底拆解WCDANN的设计思路、实现细节、训练技巧并分享我们在将其嵌入VVC官方测试模型VTM进行性能评估时踩过的坑和收获的经验。无论你是刚入门视频处理的新手还是正在寻找轻量级解决方案的资深开发者相信都能从中获得可直接复现的干货。2. 核心设计思路为什么是深度可分离卷积注意力在动手搭建网络之前我们必须想清楚两个根本问题第一模型为什么要轻量化第二在轻量化的同时如何保证甚至提升性能2.1 轻量化的必然选择深度可分离卷积传统卷积层是“重量级”操作的代表。假设我们有一个输入特征图尺寸为H x W x Cin使用Cout个K x K的卷积核进行卷积。其计算量FLOPs和参数量分别为计算量H * W * Cin * Cout * K * K参数量Cin * Cout * K * K当Cin和Cout较大时例如64、128这个数字会急剧膨胀。深度可分离卷积巧妙地将标准卷积分解为两个步骤深度卷积Depthwise Convolution每个输入通道单独使用一个K x K的卷积核进行卷积。输入输出通道数不变。计算量H * W * Cin * K * K。逐点卷积Pointwise Convolution使用1 x 1的卷积核对深度卷积的输出进行通道融合与升维/降维。计算量H * W * Cin * Cout。总计算量约为H * W * Cin * (K*K Cout)。与标准卷积相比计算量节省的比例约为1/Cout 1/(K*K)。当Cout较大如64且使用3x3卷积时理论计算量可降至约1/9参数量也得到同等比例的缩减。这对于部署在手机、嵌入式设备或需要实时处理大量视频帧的服务端来说是至关重要的优势。实操心得深度可分离卷积并非万能。它牺牲了通道间在空间卷积阶段的早期融合可能对某些需要高度通道交互的任务有细微影响。但在图像恢复、增强这类任务中我们的大量实验表明其性能损失微乎其微甚至通过精心设计后续结构可以完全弥补用极小的精度代价换取巨大的效率提升这笔交易非常划算。2.2 性能的保障注意力机制模型轻量化了但特征提取能力不能打折。压缩伪影并非均匀分布在图像上它们更倾向于出现在纹理边缘、高频细节区域。注意力机制的核心思想就是让网络学会“看重点”自动为特征图的不同空间位置、不同通道分配不同的权重。通道注意力告诉网络“哪些通道的信息更重要”。例如在去除块效应时表征边缘和纹理的通道可能比表征平坦区域的通道更需要被加强。空间注意力告诉网络“特征图上的哪些位置更重要”。例如块边界附近、物体轮廓处的像素其修复优先级远高于图像中央的平滑区域。WCDANN创新性地设计了一个通道-空间联合注意力模块CSAB将两种注意力并行计算后融合。这比串行或单一注意力能更全面地捕捉重要特征。更重要的是在空间注意力分支中WCDANN全部使用了深度卷积这既符合空间注意力关注位置而非通道间关系的特性又进一步压缩了该模块的参数是设计上的一个亮点。2.3 整体架构蓝图残差学习与弱连接WCDANN的整体目标不是从零重建一张清晰图像而是学习一个“残差图”——即清晰图像与压缩图像之间的差值。这种残差学习Residual Learning策略让网络只需学习相对简单的残差信息大大降低了学习难度加速了收敛。网络主干由多个弱连接密集注意力块WCDAB堆叠而成。“密集连接”借鉴了DenseNet的思想将前面所有层的输出在通道维度上拼接起来作为当前层的输入促进了特征重用缓解了梯度消失。“弱连接”则体现在并非所有层都进行密集连接而是在块内进行精心设计的跳跃连接在保证信息流动的同时避免过度的参数增长和特征冗余。3. 网络模块深度拆解从蓝图到代码理解了顶层设计我们进入实战环节看看每个核心模块是如何实现的。我会结合PyTorch风格的伪代码和结构图让你能看得懂、学得会、改得了。3.1 核心引擎残差注意力块RABRAB是特征提取的基本单元。它的设计目标是扩大感受野并捕获多尺度信息。class ResidualAttentionBlock(nn.Module): def __init__(self, num_channels): super().__init__() # 分支1: 3x3 深度可分离卷积 self.branch1 nn.Sequential( DepthwiseSeparableConv(num_channels, num_channels, kernel_size3, padding1), nn.ReLU(inplaceTrue) ) # 分支2: 两个3x3深度可分离卷积串联获得更大感受野 self.branch2 nn.Sequential( DepthwiseSeparableConv(num_channels, num_channels, kernel_size3, padding1), nn.ReLU(inplaceTrue), DepthwiseSeparableConv(num_channels, num_channels, kernel_size3, padding1), ) # 通道洗牌层促进分支间特征融合 self.channel_shuffle ChannelShuffle(groups2) # 假设将通道均分为两组 # 最后的通道注意力模块CAB用于强调重要通道 self.cab ChannelAttentionBlock(num_channels) def forward(self, x): identity x out1 self.branch1(x) out2 self.branch2(x) # 将两个分支的输出在通道维度拼接 out torch.cat([out1, out2], dim1) # 通道数翻倍 # 通道洗牌打乱顺序使信息充分混合 out self.channel_shuffle(out) # 通过一个1x1卷积将通道数恢复 out self.proj_conv(out) # 这里需要定义一个1x1卷积层 # 残差连接 out out identity # 通道注意力 out self.cab(out) return out设计解析双分支结构分支1是单层卷积感受野较小捕获局部细节分支2是两层卷积感受野更大捕获更广泛的上下文信息。这种结构比单纯增加网络深度更高效。通道洗牌Channel Shuffle这是从ShuffleNet借鉴来的技巧。在两个分支输出拼接后通道被简单分组来自不同分支的特征在通道维度上被隔开。通道洗牌操作将这些特征重新排列使得后续的1x1卷积能够跨分支融合信息极大地增强了特征的表达能力。深度可分离卷积的实现这是轻量化的关键。我们需要自己实现或使用框架提供的DepthwiseSeparableConv。class DepthwiseSeparableConv(nn.Module): def __init__(self, in_channels, out_channels, kernel_size, stride1, padding0): super().__init__() self.depthwise nn.Conv2d(in_channels, in_channels, kernel_size, stridestride, paddingpadding, groupsin_channels) self.pointwise nn.Conv2d(in_channels, out_channels, kernel_size1) def forward(self, x): x self.depthwise(x) x self.pointwise(x) return x注意通常在深度卷积后不加激活函数只在逐点卷积后使用ReLU这是为了保持更好的数值稳定性。3.2 注意力机制实现CSAB、CAB与SAB通道注意力块CAB采用了经典的SESqueeze-and-Excitation结构但针对轻量化做了调整。class ChannelAttentionBlock(nn.Module): def __init__(self, channel, reduction_ratio16): super().__init__() self.avg_pool nn.AdaptiveAvgPool2d(1) # 使用两个全连接层构成瓶颈结构减少参数 self.fc nn.Sequential( nn.Linear(channel, channel // reduction_ratio, biasFalse), nn.ReLU(inplaceTrue), nn.Linear(channel // reduction_ratio, channel, biasFalse), nn.Sigmoid() ) def forward(self, x): b, c, _, _ x.size() y self.avg_pool(x).view(b, c) # 全局平均池化得到通道描述符 y self.fc(y).view(b, c, 1, 1) # 生成通道权重 return x * y.expand_as(x) # 通道加权空间注意力块SAB是WCDANN的创新点它为每个通道生成独立的空间注意力图。class SpatialAttentionBlock(nn.Module): def __init__(self, channel): super().__init__() # 使用两个并行、不同大小的深度卷积核提取多尺度空间信息 self.conv3x3 nn.Conv2d(channel, channel, kernel_size3, padding1, groupschannel) self.conv1x1 nn.Conv2d(channel, channel, kernel_size1, groupschannel) self.post_conv nn.Conv2d(channel, channel, kernel_size1) # 用于生成注意力掩码 self.sigmoid nn.Sigmoid() def forward(self, x): identity x # 多尺度深度卷积融合 out self.conv3x3(x) self.conv1x1(x) out F.relu(out, inplaceTrue) # 生成通道数相同的空间注意力掩码 attn_map self.sigmoid(self.post_conv(out)) return identity * attn_map关键点self.post_conv是一个1x1的普通卷积非深度卷积它的输入输出通道数都是channel。这意味着它为输入特征图的每一个通道都计算了一个独立的、全尺寸HxW的注意力图。这与传统空间注意力如CBAM只生成一个单通道的注意力图有本质区别能更精细地刻画每个通道上不同空间位置的重要性。通道-空间联合注意力块CSAB则并行计算CAB和SAB并将结果相加。class ChannelSpatialAttentionBlock(nn.Module): def __init__(self, channel): super().__init__() self.ca ChannelAttentionBlock(channel) self.sa SpatialAttentionBlock(channel) def forward(self, x): ca_out self.ca(x) sa_out self.sa(x) # 简单相加融合通道和空间注意力 out ca_out sa_out return out这种相加操作是一种高效的融合方式让网络同时受益于两种注意力机制的增强效果。3.3 整体组装WCDAB与WCDANN有了RAB和CSAB我们就可以搭建弱连接密集注意力块WCDAB了。class WeaklyConnectedDenseAttentionBlock(nn.Module): def __init__(self, num_channels, num_rabs4): super().__init__() self.rabs nn.ModuleList([ResidualAttentionBlock(num_channels) for _ in range(num_rabs)]) # 用于融合多个RAB输出的1x1卷积 self.fusion_conv nn.Conv2d(num_channels * (num_rabs 1), num_channels, kernel_size1) self.csab ChannelSpatialAttentionBlock(num_channels) def forward(self, x): features [x] current x for rab in self.rabs: current rab(current) features.append(current) # 收集每个RAB的输出 # 将所有特征在通道维度拼接弱密集连接 concated torch.cat(features, dim1) fused self.fusion_conv(concated) # 经过CSAB进一步提炼 out self.csab(fused) return out最后WCDANN网络就是将输入图像先经过一个浅层特征提取头Head然后通过M个WCDAB块Backbone最后用一个重建尾Tail输出残差图与输入相加得到最终增强图像。class WCDANN(nn.Module): def __init__(self, num_wcdabs3, num_channels64): super().__init__() # Head self.head nn.Sequential( nn.Conv2d(1, num_channels, 3, padding1), nn.ReLU(inplaceTrue), nn.Conv2d(num_channels, num_channels, 3, padding1), nn.ReLU(inplaceTrue) ) # Backbone self.wcdabs nn.ModuleList([ WeaklyConnectedDenseAttentionBlock(num_channels) for _ in range(num_wcdabs) ]) # Tail self.tail nn.Conv2d(num_channels, 1, 3, padding1) def forward(self, x): shallow_feat self.head(x) deep_feat shallow_feat for wcdab in self.wcdabs: deep_feat wcdab(deep_feat) residual self.tail(deep_feat) return x residual # 残差学习4. 从训练到部署全流程实战要点设计好网络只是第一步如何训练和部署它才是决定项目成败的关键。4.1 数据准备与训练策略数据集我们使用DIV2K高质量2K图像和BVI-DVC动态视频内容数据集。这保证了训练数据既有丰富的静态纹理细节也包含了视频中常见的运动模糊、动态纹理等特性。数据预处理流程压缩使用VVC官方测试模型VTM-11.0-NNVC在QP{22, 27, 32, 37, 42}五个等级下对原始图像进行压缩生成压缩-清晰图像对。这里有个关键点需要为每个QP训练一个独立的模型。因为不同QP下的失真类型和强度差异很大一个通用模型很难在所有QP上都达到最优。裁剪将图像随机裁剪为128x128的小块步长为125。这样既能增加数据量又能让模型专注于局部伪影的修复。通道我们主要针对亮度Y通道进行训练因为人眼对亮度信息最敏感。色度UV通道可以采用相同的网络结构单独训练或在后续工作中探索联合训练。损失函数与训练技巧def train_epoch(model, dataloader, optimizer, epoch, criterion): model.train() for batch_idx, (compressed, original) in enumerate(dataloader): optimizer.zero_grad() enhanced model(compressed) # 分阶段使用不同的损失函数 if epoch 40: loss F.l1_loss(enhanced, original) # L1 Loss稳定收敛 else: loss F.mse_loss(enhanced, original) # L2 Loss后期精细优化 loss.backward() optimizer.step()L1 Loss先行在训练前期如前40轮使用L1 Loss因为它对异常值不敏感能引导网络快速稳定地收敛到一个较优的区域。L2 Loss收尾在训练后期最后10轮切换为L2 LossMSE它惩罚大的误差更严厉能帮助网络进行更精细的调整追求更高的PSNR指标。学习率初始学习率设为1e-4并使用余弦退火或ReduceLROnPlateau调度器在训练中动态调整。批量大小根据GPU显存设置为8或16。较小的批量大小有时能带来更好的泛化性能。4.2 推理策略与模型选择训练得到了5个针对不同QP的模型WCDANN_QP22到WCDANN_QP42。在推理时需要根据视频的实际QP来选择合适的模型。论文采用的策略是基于QP_base通常是一组QP的平均或首个I帧的QP进行分段选择QP_base 24.5- 使用WCDANN_QP2224.5 QP_base 29.5- 使用WCDANN_QP27以此类推...为什么分大小模型论文中还提到对于低QP22, 27他们使用较小的网络3个WCDAB称为WCDANN_small对于高QP32, 37, 42使用较大的网络6个WCDAB称为WCDANN_big。这是因为高QP下图像失真更严重需要更强大的网络容量来修复。这是一种实用的计算资源分配策略。4.3 性能评估与对比实验我们遵循JVET的通用测试条件CTC在A1、A2、B、C、D、E六大类测试序列上对RA随机接入、AI全帧内、LDP低延迟P帧三种编码配置进行测试。核心评价指标是Bjøntegaard Delta Bit Rate (BD-BR)负值表示码率节省即同等质量下用了我们的滤波器后VVC能节省多少码率。我们的核心结果WCDANN作为后处理滤波器在Y通道上平均取得了**-2.81% (RA), -4.12% (AI), -3.81% (LDP)** 的BD-BR增益。这意味着在保持相同主观视觉质量的前提下码率可以降低约3-4%这对于海量视频存储和传输来说是巨大的节约。与SOTA对比我们与同期JVET会议上的其他后处理方案如JVET-X0111, JVET-Z0101以及近期发表的学术论文方法进行了对比。WCDANN在多数测试序列和指标PSNR和MS-SSIM上均取得了领先或极具竞争力的性能同时保持了轻量级的优势。消融实验Ablation Study深度可分离卷积 vs 标准卷积我们将网络中所有DSConv替换为标准卷积重新训练得到WCDANN-SConv。实验结果令人振奋WCDANN-DSConv我们的与WCDANN-SConv的性能差距在0.5%以内但参数量减少了近三分之二这强有力地证明了深度可分离卷积在压缩伪影去除任务中的高效性。嵌入VTM环路滤波器的探索我们尝试将训练好的WCDANN不重新训练作为环路滤波器CNNLF插入VTM的滤波流水线中探索了五种不同的插入位置如LCDSA, LDCSA等其中LLMCSDDBFSSAOC我们的CNNAALF。实验发现将WCDANN放在SAO之后、ALF之前LDSCA或DBF之后、SAO之前LDCSA效果最好。但整体上作为环路滤波器的性能略低于作为纯后处理滤波器。这揭示了后处理与环路滤波的一个重要区别环路滤波器的输入是尚未完全去块和样本补偿的中间重建帧其伪影特性与最终解码帧不同且对于B/P帧其质量更差可能需要分区、预测模式等辅助信息才能更好工作。这为我们指明了后续改进方向。5. 避坑指南与进阶思考在实际复现和应用WCDANN的过程中我总结了一些关键的经验和可能遇到的“坑”。5.1 训练与调参中的陷阱坑1梯度爆炸/消失。尽管网络中有残差连接但在训练极深或极宽的网络变体时仍可能出现梯度问题。解决方案使用Kaiming初始化在每个卷积层后考虑加入BatchNorm虽然原论文未使用但在更深的网络上有效监控梯度范数。坑2过拟合。轻量级网络相对不容易过拟合但仍需注意。解决方案除了常规的数据增强随机水平/垂直翻转、90度旋转可以在训练中随机添加微小的高斯噪声或混合不同QP级别的数据做轻微的数据扰动增强模型鲁棒性。坑3PSNR不升反降。有时网络训练损失下降但验证集PSNR却停滞甚至下降。解决方案检查数据预处理流程确保压缩-清晰图像对严格对齐确认评估时使用的是Y通道灰度数据尝试在L1/L2损失之外加入感知损失如VGG特征损失或对抗损失虽然会增加复杂度但可能提升视觉质量。5.2 部署与优化建议平台选择对于服务器端部署PyTorch或TensorFlow是自然的选择。对于移动端或嵌入式设备必须将模型转换为ONNX格式然后利用TensorRT(NVIDIA)、Core ML(Apple)、NCNN(腾讯) 或MNN(阿里) 等推理框架进行进一步的图优化、算子融合和量化。量化这是轻量化部署的必由之路。可以尝试训练后动态量化Post-Training Quantization, PTQ或更优的量化感知训练Quantization-Aware Training, QAT。将FP32模型量化为INT8通常能带来2-4倍的推理加速和显著的内存节省而精度损失可控通常在1% BD-BR以内。帧间信息利用WCDANN是帧内滤波器只处理单帧。对于视频相邻帧间存在大量时空冗余。进阶方向可以尝试设计一个轻量级的运动补偿模块将相邻帧的信息对齐并融合到当前帧的处理中有望进一步提升性能尤其是对运动剧烈的场景。5.3 对色度通道的处理论文中主要报告了Y通道的结果对UV通道是单独训练的。在实际产品中需要同时处理YUV三个通道。有两种策略独立模型为Y、U、V分别训练三个模型。优点是灵活可以为色度通道使用更小的网络因为人眼对色度不敏感。缺点是模型管理复杂推理时需要调用三次。共享主干网络设计一个三通道输入的网络在浅层或深层进行通道分离对Y通道分配更多的计算资源更多的通道数或更深的层对UV通道分配较少的资源。这样可以共享大部分参数形成一个统一模型。我们实验发现策略2在保证Y通道性能基本不变的前提下能有效提升UV通道的修复效果且总体参数量增加有限是更优的工程选择。WCDANN的成功实践向我们证明在视频编码的后处理领域精心设计的轻量级网络完全可以在性能与效率之间找到黄金平衡点。它不仅仅是一个学术模型更是一个具备实际落地潜力的工程方案。将深度可分离卷积的极致效率与注意力机制的精准聚焦能力相结合这条技术路径为后续开发更高效、更智能的视频增强滤波器提供了清晰的蓝图。在未来的工作中如何融入帧间信息、如何与VVC编码器进行更深入的交互如基于CNN的码率控制、模式决策将是更有挑战性也更具价值的探索方向。

相关新闻