本文算法来自JVET-M0566提案,介绍了一种adaptive convolution neural network loop filter(ACNNLF)网络进行环路滤波。算法
介绍
ACNNLF方法会为YUV每一个份量分别训练一个CNN,每一个CNN只包含2层,共692个参数。编码器在编码CTB时会选择对应的CNN进行处理。ACNNLFs的网络参数会在I帧的slice header中传输,每一个CTB只需传输使用的ACNNLF的索引。微信
ACNNLF的设计思想主要是减小CNNLF的网络参数,增长CNNLFs的模型数量以适应不一样视频内容。有如下特色:网络
CNN模型小,只包含2个隐藏层。dom
为YUV分别在线(online)训练一组模型以适应视频内容,其中三个亮度ACNNLFs,三个色度ACNNLFs。ide
编码器为亮度和色度CTB选择最优的ACNNLF进行编码,并将ACNNLFs模型参数和选择的ACNNLF索引传到解码端。oop
解码器收到ACNNLFs参数和CTB使用的对应索引,选择对应的ACNNLF进行处理。学习
以下图所示,ACNNLF用在ALF阶段以后。编码
网络结构
上图是亮度ACNNLF的网络结构,其packing和unpacking操做和基于学习的编码(一):使用CNN进行环路滤波同样。
spa
输入输出块尺寸N(默认32)能够随帧的尺寸变化。例如对尺寸大的帧(2K、4K、1080P)能够选择N=32或16,对尺寸小的帧能够选择N=16或8。.net
第一个卷积层滤波器尺寸为L1xL1,L1等于1或3(默认为1)。在第一层后要进行ReLU处理。
第二个卷积层滤波器尺寸为L2xL2,L2等于1或3或5(默认为3)。在第二层后不进行ReLU处理。
第一个卷积层处理后数据通道数变为M(默认16),M能够随帧的尺寸变化,对尺寸大的帧(2K、4K、1080P)能够选择M=32或16,对尺寸小的帧能够选择M=16或8。
下图是色度份量ACNNLF的网络结构,和亮度ACNNLF同理,只不过输出变为2通道。
训练
ACNNLF使用在线训练,训练数据直接来源于要编码的视频。使用每一个RAS(random access sequence)的进行训练,共使用N帧数据(I帧+以前的N-1帧)训练。
如上图所示,每一个RAS都有训练ACNNLF,训练数据为当前的I帧和上一个RAS的最后N-1帧。因为训练用到了上一个RAS的数据,因此对于RAS0不容许使用ACNNLF。
对于被选中训练的帧,其亮度和色度的原始帧和重建帧都要参与训练,这些帧被分为NxN的图像块进行训练。
训练过程以下:
首先训练一个ACNNLF模型。
在训练集上应用ACNNLF1,将在ACNNLF1上表现好的块划分到ACNNLF1 gain set,表现很差的块划分到loss set。
使用loss set训练ACNNLF2。
在整个训练集上应用ACNNLF1和ACNNLF2,将训练集划分为ACNNLF1 gain set,ACNNLF2 gain set和loss set。
使用上面的loss set训练ACNNLF3。
持续上面的过程直到ACNNLFs模型数量已经够了或训练数据用完了。
将ACNNLFs用于整个训练集,将其划分为4个子集:ACNNLF1最高增益子集、ACNNLF2最高增益子集、ACNNLF3最高增益子集、在任何ACNNLF上都没有增益的子集。而后将每一个ACNNLF在其最高增益子集上再次训练。
语法元素
ACNNLF参数在slice header上传输。在RA配置下,仅RAS的I slice传输参数。能够在slice级或CTB级决定其亮度或色度份量是否开启ACNNLF功能。
在slice header中acnnlf_luma_slice_enable_flag 和 acnnlf_chroma_slice_enable_flag标志位表示当前slice是否使用ACNNLF。在CTB级,用2比特标志位acnnlf_luma _ctb_idc 和 acnnlf_chroma _ctb_idc 分别表示CTB的亮度和色度是否使用ACNNLF。
实验
在实验中使用8帧训练模型,RAS的I帧和前一个RAS的后7帧。QP为{22, 27, 32, 37}。
在VTM3.0的RA配置下使用结果以下:
模型的训练和调用在tensorflow中完成,编解码在VTM3.0中完成。上面的时间不报告模型训练时间可是包括了调用tensorflow接口的返回时间。
感兴趣的请关注微信公众号Video Coding
本文分享自微信公众号 - Video Coding(gh_17eb8f3e0fe7)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。