当前位置:   article > 正文

【竞赛】视频质量评价竞赛经验记录-2(调研和尝试)_fastervqa

fastervqa

领域调研

从几个质量非常高的知乎参考资料能快速了解这个领域,非常有帮助。发现这个领域的问题在很多行业都有巨大的潜力和需求,我看到不仅是图像质量评价企业如美图秀秀等,还有用户视频内容平台如字节、B站、快手、小红书等都有巨大需求,这个领域是非常有商业价值的,如果能刚好对这方面很感兴趣,又能努力提升这方面的技术和经验,对未来就业非常有帮助!
快手平台视频质量评价和增强技术报道

挑战

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

目标是:希望能够有一个客观量化的算法或者一个分数能够告诉我们视频看起来是更好,还是更差!

分类

  • 主观质量评价
    所谓的主观质量评价就是为了收集主观分数,它的任务就是我们研究怎么样去做主观实验能让我们收集到的主观分数又准而且实验的效率又高。主观分数其实就是视频质量分数。
    主观评价往往只在一些特定的情况下用,但是我们做研究的时候,它又非做不可。因为实际上,它是质量的基准,而它收集到的分数被称为Golden Score。因为我们要想研究或开发客观算法的话,这个Golden Score必不可少。
    实际上,算法输出的分数就是为了逼近主观分数。所以主观分数就是我们所谓的Ground Truth,如果没有它,我们设计的客观算法是没有办法衡量它的性能的。

  • 客观质量评价
    客观质量评价其实是研究更多的方向,因为本身做质量评价最终的目的还是希望开发一套软件用它代替人的主观打分,能全自动化、省时、省力,准确地预测主观质量分数,那它就是比较好的算法。
    但是准确率的提升很多时候是比较困难的,有很多方面的因素影响。

质量评价本身的价值:一方面是可以用算法代替人脑,可以提高我们的生产效率;另一方面就是统一和改进视频质量的度量衡;最后就是系统优化

困难

我们怎么去定义质量?

因为人去看视频的时候觉得它更好或者更差的话,我们是有自己的感觉,但是你要想用一种数学模型或者计算公式去量化它,这本身是比较复杂的,因为它的主观性太强了。

质量可能包括清晰度,清晰度怎么用公式算也是一个问题,然后质量还包括色彩的丰富程度、对比度等等。

  • 一方面质量分数的主观性特别强,众口难调
  • 另外一方面,在做客观算法研究时,我们本身对人眼视觉系统了解的并不够多,因为我们希望把人眼视觉系统做到软件里面,如果我们对它的理解不够深入的话,其实我们并没有办法完全模拟视觉系统。现在已经有很多,当然这都是基于经验或知识来设计的算法,有很多机制模拟人眼视觉系统,比如多尺度分析、多通道、各种掩膜效应,这其实都是从Visual Science之类借过来的概念,这些机制的也都很成功。

视频质量评价中常见故障:扭曲、模糊,噪声、抖动,过曝、低曝
美学特性:语义完整,构图合理

相关工作

在这里插入图片描述

  • 全参考是指视频源的所有信息都是可用的,比如在视频压缩的场景,因为编码器的输出就是压缩后的视频,那我就可以用全参考的方式来看,相对于我的输入,输出视频的质量到底有什么变化。

  • 部分参考是指视频源中并不是所有的像素我都知道,但是我可以去做一些统计,为了方便在通信系统里,比如在流媒体、客户端做质量评价的时候,我们是没有办法拿到视频源的,因为视频源的数据量本身就很大,但是如果能拿到一些统计量,然后做对比,也是可以提升准确率。

  • 无参考是指压根不知道视频长什么样子,你给我一个视频,我给你打一个分,说是无参考,但实际上我们可以想象,人眼看视频时我们可能会觉得我知道它是好还是坏,但实际上我们人的大脑里边其实也是有参考的。

这也是在跟客户接触时发现的一个比较有意思的问题,其实一个普通人对质量的理解跟他所在地区的带宽是有一定的相关性的,如果他那个区域的带宽普遍比较低,那他对质量容忍的程度就会比较高,他可以给一个比较模糊的视频一个比较高的分数,就是因为他已经习惯了。无参考的分数虽然简单易用,但是它也是要根据场景做调整。

**加粗样式**


2023主流方法

  • FAST-VQA: Efficient End-to-End Video Quality Assessment with Fragment Sampling code

  • Exploring the Effectiveness of Video Perceptual Representation in Blind Video Quality Assessment code

  • An End-to-End No-Reference Video Quality Assessment Method With Hierarchical Spatiotemporal Feature Representation pdf

  • A Fast and Efficient No-Reference Video Quality Assessment Algorithm Using Video Action Recognition Features pdf

  • Starvqa: Space-Time Attention for Video Quality Assessment pdf

  • DisCoVQA: Temporal Distortion-Content Transformers for Video Quality Assessment pdf

  • 主流数据集排行榜
    在paper with code数据集上的排行榜,可以轻松找到对应主流数据集的历年方法和最好结果,一般都有公开代码,很容易借鉴!!!

KoNViD-1k Benchmark Video Quality Assessment
MSU NR VQA Database Benchmark (Video Quality Assessment) | Papers With Code

我的baseline

在了解了比赛内容、数据集和领域的基本研究内容后,开始尝试使用baseline调试和训练模型,验证基本结果:

在这里插入图片描述

提取视频帧

主要是根据代码调整路径和格式内容,传入正确的视频路径,让opencv提取视频关键帧,一般十秒左右的视频提取十张关键帧,减少计算量,提高模型效率!

    video_capture = cv2.VideoCapture()
    video_capture.open(filename)
    cap=cv2.VideoCapture(filename)

    video_length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    video_frame_rate = int(round(cap.get(cv2.CAP_PROP_FPS)))

  for i in range(video_length):
        has_frames, frame = video_capture.read()
        if has_frames:
            # key frame
            if (video_read_index < video_length) and (frame_idx % video_frame_rate == 0):
                read_frame = cv2.resize(frame, dim)
                exit_folder(os.path.join(save_folder, video_name_str))
                cv2.imwrite(os.path.join(save_folder, video_name_str, \
                                         '{:03d}'.format(video_read_index) + '.png'), read_frame)          
                video_read_index += 1
            frame_idx += 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

提取移动特征

使用resnet50在kinetics数据集上训练过的预训练模型提取图片中的移动特征,根据视频得到对应图片的抖动、晃动等slow和fast特征,便于之后预测视频抖动时对应的质量分数。

slowfast_r50在kinetics数据集训练,提取高层和底层特征; action detection数据集预训练模型;

# slowfast extract feature:
     for x in range(0,5):
            self.feature_extraction.add_module(str(x), slowfast_pretrained_features[x])

        self.slow_avg_pool.add_module('slow_avg_pool', slowfast_pretrained_features[5].pool[0])
        self.fast_avg_pool.add_module('fast_avg_pool', slowfast_pretrained_features[5].pool[1])
        self.adp_avg_pool.add_module('adp_avg_pool', slowfast_pretrained_features[6].output_pool)

    def forward(self, x):
        with torch.no_grad():
            x = self.feature_extraction(x)

            slow_feature = self.slow_avg_pool(x[0])
            fast_feature = self.fast_avg_pool(x[1])

            slow_feature = self.adp_avg_pool(slow_feature)
            fast_feature = self.adp_avg_pool(fast_feature)
            
        return slow_feature, fast_feature
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

训练和测试

训练模型,直接将视频帧的特征进行卷积学习并和slow, fast feature进行融合训练,最终fc回归对应分数

# Input data
video (bs, channel, video_len, h, w)
feature_3D (bs, feature_slow + feature_fast)

# model
# three stage spatial features (avg + std) + motion
  self.quality = self.quality_regression(4096+2048+1024+2048+256, 128,1)

  def _forward_impl(self, x, x_3D_features):
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.maxpool(x)

        x = self.layer1(x)
        x = self.layer2(x)
        x_avg2 = self.avgpool(x)
        x_std2 = global_std_pool2d(x)

        x = self.layer3(x)
        x_avg3 = self.avgpool(x)
        x_std3 = global_std_pool2d(x)

        x = self.layer4(x)
        x_avg4 = self.avgpool(x)
        x_std4 = global_std_pool2d(x)
        x = torch.cat((x_avg2, x_std2, x_avg3, x_std3, x_avg4, x_std4), dim = 1)
        # x: batch * frames x (2048*2 + 1024*2 + 512*2)
        x = torch.flatten(x, 1)
        # x: batch * frames x (2048*2 + 1024*2 + 512*2 + 2048 + 512)
        x = torch.cat((x, x_3D_features), dim = 1)
        # x: batch * frames x 1
        x = self.quality(x)
        # x: batch x frames
        x = x.view(x_size[0],x_size[1])
        # x: batch x 1
        x = torch.mean(x, dim = 1)
            
        return x
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

最终在训练集上训练最好结果(肯定过拟合):
epcoh 99: SRCC: 0.8974, KRCC: 0.9006, PLCC: 0.7245, and RMSE: 5.7074

阶段思考和总结

数据集分析

  • 数据类型
    Axxxx_yy.mp4 refers to the video Axxxx.mp4 enhanced by color, contrast and brightness enhancement method yy.
    Bxxxx_yy.mp4 refers to the video Bxxxx.mp4 stabilized by method yy.
    Cxxxx_yy.mp4 refers to the video Cxxxx.mp4 deblurred by method yy.

三种不同类型的损伤给原视频,对应测试集不同的分数预测,可以三个模型专门预测对应类别和分数;
【要么三个模型,要么一个模型两个任务(分类和回归)】

  • 数据打分
    相同视频不同处理的分数差异;整体视频的分数值水平;

  • 数据集预测存在问题
    基于baseline模型,提取视频关键帧和移动状态,可以较好解决这两个问题,但对于色彩亮度、对比度的评估不准确!
    借鉴aesthetic assessment方法加入,评估视频的色彩、亮度和对比度等;

  • 数据测试无反馈,如何选择可能的最佳策略
    选择部分训练集训练,部分训练集验证;(多折验证)
    将模型结果在验证和测试集上测试,分析结果可靠性!
    如何划分数据集?如何设定比例?

  • 分析数据集对应结果和实际视频内容
    人工验证,逐个分析和对比不同数据内容,发现:一个场景对应多个损伤,用mse+rank L1损失函数融合提升结果

  • 加入额外的数据训练
    实用IJCV方法混合数据集训练,得到最佳结果;
    超参无法调整优化(多折验证)

  • 考虑不同方法
    从paper with code排行榜看,优先考虑三个方法:最好DOVER, 框架Faster VQA和混合数据集IJCV-MANIQA

  • 分析结果
    • 可视化loss曲线
    • 分折train验证
    • 热力图可视化

总结

因为科研工作太忙,没有太多时间投入比赛,导致错过了验证集时间,而测试集并不实时公布结果榜单,所以在调研和做了baseline工作后,发现根本没法验证模型在验证集和测试集的结果,只能用多折验证来比较不同模型和参数的性能。

另一个问题是,视频质量评价的方法主要是是设计各种模型结构,或者融合各类先验信息。该比赛中未限制模型性能,且可以使用额外数据,我在下载数据集时发现大部分都需要登记申请,但时间冲突,未充分利用额外数据。

以后要参加比赛一定要做好充分的计划。一方面不能太影响最重要的工作,另一方面要规划好比赛时间,如硬件、相关基础和方法调研、额外数据集准备等,最后是一定要多分析数据,找到其中存在最能直观理解的问题,针对问题来优化比调参更有价值!

参考资料

  1. 视频质量评价基础与实践
  2. 图像视频质量评估 (IQA/VQA)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/602657
推荐阅读
相关标签
  

闽ICP备14008679号