⌈ 传知代码 ⌋ 视频质量评价SimpleVQA

💛前情提要💛

本文是传知代码平台中的相关前沿知识与技术的分享~

接下来我们即将进入一个全新的空间,对技术有一个全新的视角~

本文所涉及所有资源均在传知代码平台可获取

以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦!!!

以下内容干货满满,跟上步伐吧~



💡本章重点

  • 视频质量评价SimpleVQA

🍞一. 研究意义

用户生成内容(UGC)视频的质量评估对于确保终端用户的观看体验具有重要作用。典型的UGC视频如抖音视频、游戏视频等等。人们在观看这些视频的时候都希望有一个清晰的、稳定的视频带来更好的用户体验。

如下图,模糊的视频让人没有观看欲望,但是这个草原的视频会吸引人们的注意甚至想去身临其境。所以,视频质量评价算法模型的意义在于筛选出高质量的视频供人们观看,并且为下游的视频去模糊、视频画质提升任务做上游工作。

在这里插入图片描述


🍞二. 介绍

A Deep Learning based No-reference Quality Assessment Model for UGC Videos是一篇CCF A类会议ACM MM2023年上发表的文章。

论文动机

对于视频质量评价而言,视频的质量主要取决于视频的内容、视频的稳定性、视频有无失真。所以基于上述内容,本文从空间-时间进行建模以对视频的质量进行整体评价。

论文思路

提出一个时空模型对视频的图像和时间信息进行处理,最终得到视频预测的质量分数。

  • 视频抽帧处理:将视频每一秒抽取一帧关键帧

  • 空间信息处理:使用ImageNet上预训练的ResNet提取视频的空间信息

  • 时间信息处理:使用冻结参数的slowfast网络提取时间信息

  • 时空信息融合:使用concatenate连接时空特征

  • 质量分数回归:使用多层感知机MLP进行质量回归


🍞三.方法

网络框架

在这里插入图片描述

  1. Input video即是数据集中训练数据,将输入视频进行Frame extraction,代码中是每一秒抽取第一帧作为视频的关键帧,并且只使用8秒,不足8秒的视频复制前面的帧。所以,最终一个视频得到的帧数为8

  2. Chunks即代表一个视频的所有帧,2D frames代表抽出来的帧。将Chunks馈送到Motion feature extraction模块,将2D frames馈送到Spatial feature extraction模块,分别进行特征提取

  3. Motion feature extraction模块是参数冻结的,可以直接使用训练好的参数进行特征提取,这个模块其内涵是使用3D CNN,Spatial feature extraction模块是可训练的,这个模块其内涵是预训练的ResNet,预训练的ResNet可以帮助模型提取充分的语义信息,并且将4个stage的特

  4. 征图进行全局平均值和标准差池化,以满足多尺度视频
    使用cat操作进行特征融合,就是很简单的在通道维度进行特征拼接。再到MLP进行质量回归,MLP也是需要训练的


🍞四.公式解读

抽取关键帧:

将视频每一秒提取关键帧,对于N秒视频就抽取N帧,得到帧集合。代码中每一个视频都归一化抽取8帧

import numpy as np
import os
import pandas as pd
import cv2


#    /    home/dataset/LSVQLSVQ video_name  LSVQ_image
def extract_frame(videos_dir, video_name, save_folder):
    filename = os.path.join(videos_dir, video_name + '.mp4')
    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)))

    video_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  # the heigh of frames
    video_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  # the width of frames

    # 按短边进行等比例缩放
    if video_height > video_width:
        video_width_resize = 520
        video_height_resize = int(video_width_resize / video_width * video_height)
    else:
        video_height_resize = 520
        video_width_resize = int(video_height_resize / video_height * video_width)

    dim = (video_width_resize, video_height_resize)

    video_read_index = 0

    frame_idx = 0

    video_length_min = 8

    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))
                cv2.imwrite(os.path.join(save_folder, video_name,
                                         '{:03d}'.format(video_read_index) + '.png'), read_frame)
                video_read_index += 1
            frame_idx += 1

    if video_read_index < video_length_min:  # 不足video_length_min个帧,直接复制前面的一帧
        for i in range(video_read_index, video_length_min):
            cv2.imwrite(os.path.join(save_folder, video_name,
                                     '{:03d}'.format(i) + '.png'), read_frame)

    return


def exit_folder(folder_name):
    if not os.path.exists(folder_name):
        os.makedirs(folder_name)

    return


if __name__ == "__main__":
    # train subset
    filename_path = '/data/user/gbb/SimpleVQA-main/data/LSVQ_whole_train.csv'
    column_names = ['name', 'p1', 'p2', 'p3',
                    'height', 'width', 'mos_p1',
                    'mos_p2', 'mos_p3', 'mos',
                    'frame_number', 'fn_last_frame', 'left_p1',
                    'right_p1', 'top_p1', 'bottom_p1',
                    'start_p1', 'end_p1', 'left_p2',
                    'right_p2', 'top_p2', 'bottom_p2',
                    'start_p2', 'end_p2', 'left_p3',
                    'right_p3', 'top_p3', 'bottom_p3',
                    'start_p3', 'end_p3', 'top_vid',
                    'left_vid', 'bottom_vid', 'right_vid',
                    'start_vid', 'end_vid', 'is_test', 'is_valid']

    dataInfo = pd.read_csv(filename_path, header=0, sep=',', names=column_names, index_col=False, encoding="utf-8-sig")

    video_names = dataInfo['name']
    n_video = len(video_names)
    videos_dir = '/data/dataset/LSVQ'

🫓总结

综上,我们基本了解了“一项全新的技术啦” 🍭 ~~

恭喜你的内功又双叒叕得到了提高!!!

感谢你们的阅读😆

后续还会继续更新💓,欢迎持续关注📌哟~

💫如果有错误❌,欢迎指正呀💫

✨如果觉得收获满满,可以点点赞👍支持一下哟~✨

【传知科技 – 了解更多新知识】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream-Y.ocean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值