基于学习的编码(七):基于CNN的intra frame的lambda域码率控制
本文介绍的算法来自JVET-M0215提案。
基于SATD的intra frame码率控制构建了lambda和码率的模型如下:
C表示内容复杂度,可由元素像素的SATD估计得到。对于第1个I帧alpha和beta设为常数,后面的I帧逐步更新。提案中提出了一个CNN模型可以直接预测每个CTU的alpha和beta。
网络结构
该CNN的网络结构如下图:
CTU编码前提取出其亮度和色度分量输入进两个训练好的CNN,输出为该CTU的参数alpha和beta。
边界CTU校正
CNN的是CTU的某个分量,如128x128的亮度分量或64x64的色度分量。对于图边界的CTU其尺寸可以小于128x128,这时需要使用边界像素填充为128x128,如下图。
为了消除填充值的影响,需要对CNN的输出进行调整。调整方式如下:
CTU级码率分配
当CTU的alpha和beta参数得到后,就可以得到每个CTU的目标码率:
当编码第i个CTU时其目标码率还需要根据前面(i-1)个CTU的实际编码情况进行调整:
Tar是第i个CTU到最后一个CTU的目标码率之和,Rem是编码完(i-1)个CTU后剩余的码率,SW是滑动窗口。
训练
训练集使用了DIV2K、Flickr和RAISE数据集中共2800幅图像。图像首先转换为YUV420格式,且使用VTM压缩,QP为{20,22,24,26,28,30,32,34,36,38,40},获取不同QP下每个CTU的lambda和码率R。然后按下面步骤计算每个CTU的alpha和beta作为label:
1)对11对(R,lambda)首先进行对数处理获得log(lambda)和logR。
2)使用最小二乘回归拟合下式
3)为了避免过拟合增加一个正则化项来拟合损失:
w1和w2都设为0.01。
4)将拟合结果log(alpha)和log(beta)作为该CTU的label。
为了训练CNN定义如下损失函数:
使用SGD训练,初始学习率设为0.001,在第150000,250000和350000次迭代时学习率衰退为0.1。
实验
在VTM3.0中,All Intra配置下不开启码率控制使用QP{22,27,32,37}编码,4个QP编码后的码率作为目标码率。实验结果如下:
码率波动如下:
码率波动用下式衡量:
感兴趣的请关注微信公众号Video Coding