Super-Resolution

open source image and video super-resolution works

Posted on 11.1, 2019


SubPixel

    一般来说在Pixel shuffle之后会接一个卷积,防止上采样出现一些错误。
    RCAN等超分模型都考虑了这点,CAIN插帧模型却没有考虑到。| Quoting Zhaoyang

    RCAN
    modules_tail = [
            common.Upsampler(conv, scale, n_feats, act=False),
            conv(n_feats, args.n_colors, kernel_size)]
    Upsampler内部实现卷积通道数 n_feats → n_feats * (scale**2) → pixelshuffle n_feats
    调用nn.PixelShuffle

    CAIN
    实现pixelshuffle,但使用时通道数恰好 n_feats → n_colors
    https://github.com/myungsub/CAIN/blob/master/model/common.py

关于view与图像分块、亚像素提取

    灵活地使用view,既能实现down-shuffle和pixel-shuffle,也可以实现图像分块。
    但要注意区别:
    view(batch_size, channels, out_height, block_size, out_width, block_size)是down-shuffle,
    view(batch_size, channels, block_num, out_height, block_num, out_width)是图像分块。 

Global-skip-connection and Meanshift

Global-skip-connection 全局残差区分高低频,改变优化目标。
Meanshift 均值归一,增加样本稳定性。我认为是对超分任务不用BN层的一种补偿。
According to the experience of Lim et al., it should help stabilize the training
but doesn't affect the PSNR obviously.  thstkdgus35/EDSR-PyTorch#71、#94
1、
def forward(self, x):
        x = self.sub_mean(x)

        x = self.head(x)
        res = self.body(x)
        res += x
        x = self.tail(res)

        x = self.add_mean(x)
2、
def forward(self, x):
        x = self.sub_mean(x)
        base = F.interpolate(x, scale_factor=4, mode='bilinear', align_corners=False)

        x = self.head(x)
        x = self.body(x)
        x = self.tail(x)
        x += base

        x = self.add_mean(x)
1、2方案在插值前后进行全局残差,区别不大。效果一定程度等价。

Y or RGB

团队最开始基于Y通道进行超分,但经过一段时间的运营,发现视频源是清晰的情况下,如果单独把Y通道单独提取出来会有很多奇怪的纹理和毛刺,超分后会放大这些异常。
如果基于RGB超分则不会有这样的问题。虽然Y通道有自身的缺点,但在实际的落地过程中,很多场景还是离不开基于Y通道的超分。比如直播中的 4K超分,为了保证实时性,
会对一路直播流进行分布式的拆分,路由到多台GPU节点进行处理,而在分布式超分的场景中,使用Y通道传输可以节省带宽的消耗。
YUV和RGB互转要考虑的东西有两个

一个是Matrix,是BT601还是BT709,还是4K时代的BT2020,,Ycgco

不同的matrix的色彩范围不一样 数值也有差

一般HD视频(1080p)使用BT601 转换, UHDTV(4k或8K)使用BT2020协议转换 , 若视频信号中无色域标志或者色彩转换矩阵 , 默认使用BT601即可, 
ffmpeg转rgb也是这样操作的
    
第二个是range,YUV里TV和PC显示器的数值范围不一样

YUV和RGB互转有两套公式,对应两种range

8bit位深的情况下

TVrange是16-235(Y)、16-240(UV) 称为limited range

PCrange是0-255 称为full range

而RGB没有range之分,全是0-255

YUV : YUV是一种模拟型号, Y∈ [0,1]   U,V∈[-0.5,0.5] 
YCbCr :也叫YCC,  YCbCr 是数字信号, 它包含两种形式, 分别为TV range 和 full range
我们平时接触到的绝大多数都是 YCbCr (tv range) , ffmpeg 解码出来的数据绝大多数也是这个, 虽然ffmpeg 里面将它的格式描述成YUV420P , 实际上它是YCbCr tv range

Checkerboard

关于棋盘纹的问题,pixel-shuffle仍是会出现的。这个和pixel-shuffle前一个卷积的表现是息息相关的。
    使用ICNR初始化是有帮助的,它保证具有相关性的卷积来处理相邻的像素,也等价于最近邻插值后进行卷积(也同时保持着pixel-shuffle参数多、速度快的优势)。
    同时对bias也零值初始化self.conv.bias.data.zero_(),不然默认是均匀分布。
    个人认为,除此之外,我们也可以特别关注下pixel-shuffle前的卷积,在训练收敛后单独对这一层进行finetune或许会有帮助。

Training

感受野足够大的话,增大patchsize接着训是会涨点的。训练集loss不一定降,但patchsize更接近验证集的尺寸,有助于验证集指标提升。

Testing

1. 对Metircs的方差进行分析,可以挑选出具备更好泛化性能的模型。
2. 网络插值 :在MSE、GAN; different noise levels and blur kernels; different aesthetic flavors. 这三种取舍中有很好的表现。
3. 网络插值的变种 :历史平均,对不同epoch产生的中间模型求参数均值,生成一个新的模型,经测试该模型泛化效果更好,生成的图片多样性更强。

GAN Loss

1. VGG + 0.1GAN :使用感知损失,可能和对抗损失的相性比L1/L2要好。这样优化目标内部不会有矛盾。
   相性不好的弊端是 - 训练不稳定,容易震荡。生成器并不会因为判别器更强,而着力于生成更"真实"的图片,仍然在追求最小化欧式距离。待到判别器变强后,loss会震荡增加。
2. PSNR & GAN网络插值 :网络插值技术的提出,也绕开了这个难题。在最优化GAN loss时,完全可以不搭配PSNR-oriented loss.
    3. 判别器可以考虑 RelativeGAN + PatchGAN,前者训练稳定,后者输出的是一个N x N的矩阵,更适用于要求高分辨率、高清细节的视觉任务中。

VGG Loss

    可以做的改进也不少。
    首先,可视化了解HR图像和模糊图像(或LR图像bicubic上采样)特征的差异:
    一些工作的观点认为:感知损失成功的关键是网络结构而非预训练权重。

MMSR

港中文mmlab的项目,基于实验室之前的工作:BasicSR、ESRGAN和EDVR.
 
Highlights
    
  • A unified framework suitable for image and video super-resolution tasks. It is also easy to adapt to other restoration tasks, e.g., deblurring, denoising, etc.
  • State of the art: It includes several winning methods in competitions: such as ESRGAN (PIRM18), EDVR (NTIRE19).
  • Easy to extend: It is easy to try new research ideas based on the code base.
  • 数据集准备 为了更快的IO速度,训练数据使用了LMDB格式。不过验证/测试数据就直接读了(using image folder)。如果你不想使用LMDB,也可以使用image folder. lightning memory-mapped database 基于B+树索引,高效快速的内存映射数据库。 不过lmdb对随机访问不友好,shuffle+读取会比较慢。所以caffe做lmdb数据集时都是先shuffle一次再制作,之后shuffle=False了。 测试 关于data_mode, vid4 就是Vimeo90k超分的。 sharp_bicubic|blur_bicubic|blur|blur_comp 是REDS的四个赛道。 对二者训练的主要区别就是vid4适合7帧输入,REDS适合5帧。(可能说REDS运动更剧烈,更难对齐) 现在我们测试自己的testset,比如来自aicomp的或者优酷的,就按照sharp_bicubic替换就好了。

    超分选择模型的吐槽

        GANs have serious problems with mode collapse, likelihood and MSE-based models just blur everything, flow-based models have artifact problems due to the restricted operator set they use. Autoregressive models are promising but are tricky to apply to SR and do not scale to high-resolution images. Diffusion models are notorious for being quite slow at processing.
    

    Reading list

    ChaofWang / Awesome-Super-Resolution
    

    Computer Vision

    • Kornia
    • 基于PyTorch的可微计算机视觉库  kornia  

    Interpretable Low-Level Vision

    大赛方案

    扩展: 优酷天池超分大赛
          巧改EDVR方案报告链接
          EDVR详细分析简书链接
    
          首届全国人工智能大赛
          AI+4K HDR方案分享报告链接
    

    Leaderboards

    Usually the benchmarks are single-image super-resolution (SISR) tasks.
  • 图像超分
  •     各benchmarks榜单 入口
    

    视频复原数据集

        视频压缩、质量评估
        https://www.its.bldrdoc.gov/vqeg/video-datasets-and-organizations.aspx
        https://www.cdvl.org/
        youtube:
        grep ''