基于学习的编码(七):基于CNN的intra frame的lambda域码率控制

191 阅读2分钟

基于学习的编码(七):基于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