赞
踩
从几个质量非常高的知乎参考资料能快速了解这个领域,非常有帮助。发现这个领域的问题在很多行业都有巨大的潜力和需求,我看到不仅是图像质量评价企业如美图秀秀等,还有用户视频内容平台如字节、B站、快手、小红书等都有巨大需求,这个领域是非常有商业价值的,如果能刚好对这方面很感兴趣,又能努力提升这方面的技术和经验,对未来就业非常有帮助!
快手平台视频质量评价和增强技术报道
目标是:希望能够有一个客观量化的算法或者一个分数能够告诉我们视频看起来是更好,还是更差!
主观质量评价
所谓的主观质量评价就是为了收集主观分数,它的任务就是我们研究怎么样去做主观实验能让我们收集到的主观分数又准而且实验的效率又高。主观分数其实就是视频质量分数。
主观评价往往只在一些特定的情况下用,但是我们做研究的时候,它又非做不可。因为实际上,它是质量的基准,而它收集到的分数被称为Golden Score。因为我们要想研究或开发客观算法的话,这个Golden Score必不可少。
实际上,算法输出的分数就是为了逼近主观分数。所以主观分数就是我们所谓的Ground Truth,如果没有它,我们设计的客观算法是没有办法衡量它的性能的。
客观质量评价
客观质量评价其实是研究更多的方向,因为本身做质量评价最终的目的还是希望开发一套软件用它代替人的主观打分,能全自动化、省时、省力,准确地预测主观质量分数,那它就是比较好的算法。
但是准确率的提升很多时候是比较困难的,有很多方面的因素影响。
质量评价本身的价值:一方面是可以用算法代替人脑,可以提高我们的生产效率;另一方面就是统一和改进视频质量的度量衡;最后就是系统优化。
我们怎么去定义质量?
因为人去看视频的时候觉得它更好或者更差的话,我们是有自己的感觉,但是你要想用一种数学模型或者计算公式去量化它,这本身是比较复杂的,因为它的主观性太强了。
质量可能包括清晰度,清晰度怎么用公式算也是一个问题,然后质量还包括色彩的丰富程度、对比度等等。
视频质量评价中常见故障:扭曲、模糊,噪声、抖动,过曝、低曝,
美学特性:语义完整,构图合理;
全参考是指视频源的所有信息都是可用的,比如在视频压缩的场景,因为编码器的输出就是压缩后的视频,那我就可以用全参考的方式来看,相对于我的输入,输出视频的质量到底有什么变化。
部分参考是指视频源中并不是所有的像素我都知道,但是我可以去做一些统计,为了方便在通信系统里,比如在流媒体、客户端做质量评价的时候,我们是没有办法拿到视频源的,因为视频源的数据量本身就很大,但是如果能拿到一些统计量,然后做对比,也是可以提升准确率。
无参考是指压根不知道视频长什么样子,你给我一个视频,我给你打一个分,说是无参考,但实际上我们可以想象,人眼看视频时我们可能会觉得我知道它是好还是坏,但实际上我们人的大脑里边其实也是有参考的。
这也是在跟客户接触时发现的一个比较有意思的问题,其实一个普通人对质量的理解跟他所在地区的带宽是有一定的相关性的,如果他那个区域的带宽普遍比较低,那他对质量容忍的程度就会比较高,他可以给一个比较模糊的视频一个比较高的分数,就是因为他已经习惯了。无参考的分数虽然简单易用,但是它也是要根据场景做调整。
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调试和训练模型,验证基本结果:
主要是根据代码调整路径和格式内容,传入正确的视频路径,让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
使用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
训练模型,直接将视频帧的特征进行卷积学习并和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
最终在训练集上训练最好结果(肯定过拟合):
epcoh 99: SRCC: 0.8974, KRCC: 0.9006, PLCC: 0.7245, and RMSE: 5.7074
三种不同类型的损伤给原视频,对应测试集不同的分数预测,可以三个模型专门预测对应类别和分数;
【要么三个模型,要么一个模型两个任务(分类和回归)】
数据打分
相同视频不同处理的分数差异;整体视频的分数值水平;
数据集预测存在问题
基于baseline模型,提取视频关键帧和移动状态,可以较好解决这两个问题,但对于色彩亮度、对比度的评估不准确!
借鉴aesthetic assessment方法加入,评估视频的色彩、亮度和对比度等;
数据测试无反馈,如何选择可能的最佳策略
选择部分训练集训练,部分训练集验证;(多折验证)
将模型结果在验证和测试集上测试,分析结果可靠性!
如何划分数据集?如何设定比例?
分析数据集对应结果和实际视频内容
人工验证,逐个分析和对比不同数据内容,发现:一个场景对应多个损伤,用mse+rank L1损失函数融合提升结果
加入额外的数据训练
实用IJCV方法混合数据集训练,得到最佳结果;
超参无法调整优化(多折验证)
考虑不同方法
从paper with code排行榜看,优先考虑三个方法:最好DOVER, 框架Faster VQA和混合数据集IJCV-MANIQA
分析结果
• 可视化loss曲线
• 分折train验证
• 热力图可视化
因为科研工作太忙,没有太多时间投入比赛,导致错过了验证集时间,而测试集并不实时公布结果榜单,所以在调研和做了baseline工作后,发现根本没法验证模型在验证集和测试集的结果,只能用多折验证来比较不同模型和参数的性能。
另一个问题是,视频质量评价的方法主要是是设计各种模型结构,或者融合各类先验信息。该比赛中未限制模型性能,且可以使用额外数据,我在下载数据集时发现大部分都需要登记申请,但时间冲突,未充分利用额外数据。
以后要参加比赛一定要做好充分的计划。一方面不能太影响最重要的工作,另一方面要规划好比赛时间,如硬件、相关基础和方法调研、额外数据集准备等,最后是一定要多分析数据,找到其中存在最能直观理解的问题,针对问题来优化比调参更有价值!
参考资料
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。