视频质量评价SimpleVQA

目录

  • 一、研究意义
    • 例子
  • 二、介绍
  • 三、文章解读
      • 3.1 论文动机
      • 3.2论文思路
      • 3.3方法
            • 3.3.1网络框架
            • 3.3.2公式解读
            • 3.3.3核心创新
            • 3.3.4理解
    • !!!作者对模型的改进
      • 本人算法框体
      • 视频抽帧
      • 美学特征提取网络:
      • 3.3.5实验细节:
    • 四、代码复现
      • 4.1代码文件简介
      • 4.2数据集下载
      • 4.3环境
      • 4.4.1复现结果


一、研究意义

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

参考文献:https://www.aspiringcode.com?url=https://www.aspiringcode.com

例子

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

在这里插入图片描述

二、介绍

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

源码中给出了LSVQ数据集上的训练的模型,本文补充KoNViD、youtube_ugc数据集上的训练模型
源码中REDME文件中只给出了如何运行代码,本文对代码进行详细解读,解释每一块的作用
本文提供多个数据集的下载连接,方便读者快速下载使用

三、文章解读

3.1 论文动机

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

3.2论文思路

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

视频抽帧处理:将视频每一秒抽取一帧关键帧
空间信息处理:使用ImageNet上预训练的ResNet提取视频的空间信息
时间信息处理:使用冻结参数的slowfast网络提取时间信息
时空信息融合:使用concatenate连接时空特征
质量分数回归:使用多层感知机MLP进行质量回归

3.3方法

3.3.1网络框架

在这里插入图片描述
Input video即是数据集中训练数据,将输入视频进行Frame extraction,代码中是每一秒抽取第一帧作为视频的关键帧,并且只使用8秒,不足8秒的视频复制前面的帧。所以,最终一个视频得到的帧数为8
Chunks即代表一个视频的所有帧,2D frames代表抽出来的帧。将Chunks馈送到Motion feature extraction模块,将2D frames馈送到Spatial feature extraction模块,分别进行特征提取
Motion feature extraction模块是参数冻结的,可以直接使用训练好的参数进行特征提取,这个模块其内涵是使用3D CNN,Spatial feature extraction模块是可训练的,这个模块其内涵是预训练的ResNet,预训练的ResNet可以帮助模型提取充分的语义信息,并且将4个stage的特征图进行全局平均值和标准差池化,以满足多尺度视频
使用cat操作进行特征融合,就是很简单的在通道维度进行特征拼接。再到MLP进行质量回归,MLP也是需要训练的

3.3.2公式解读

抽取关键帧:将视频每一秒提取关键帧,对于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 framesvideo_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  # the width of frames# 按短边进行等比例缩放if video_height > video_width:video_width_resize = 520video_height_resize = int(video_width_resize / video_width * video_height)else:video_height_resize = 520video_width_resize = int(video_height_resize / video_height * video_width)dim = (video_width_resize, video_height_resize)video_read_index = 0frame_idx = 0video_length_min = 8for i in range(video_length):has_frames, frame = video_capture.read()if has_frames:# key frameif (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 += 1frame_idx += 1if 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)returndef exit_folder(folder_name):if not os.path.exists(folder_name):os.makedirs(folder_name)returnif __name__ == "__main__":# train subsetfilename_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'save_folder = 'LSVQ_image'for i in range(n_video):video_name = video_names.iloc[i]print('start extract {}th video: {}'.format(i, video_name))extract_frame(videos_dir, video_name, save_folder)

提取时空特征:空间特征提取就是对每一张的图像进行特征提取,时间特征提取就是对整个视频进行处理,提取视频的时间信息。空间特征提取器公式中使用fw.空间特征提取器是在Imgenet上预训练的Resnet50,fwk是提取出的特征图。在这里插入图片描述
时间特征提取器是预训练的Slowfast网络,时间特征提取器论文中公式使用MOTION表示.

3.3.3核心创新

提出了一种有效、高效的基于深度学习的UGC VQA模型,该模型包括特征提取模块、质量回归模块和质量池模块。该模型不仅在五个流行的UGC VQA数据库上取得了显著的性能,而且具有较低的计算复杂度,非常适合实际应用。
特征提取模块提取两种质量感知特征:空间失真的空间特征和运动失真的时空特征,其中空间特征通过端到端的方式从视频帧的原始像素中学习,时空特征通过预训练的动作识别网络来提取。
提出了一种多尺度质量融合策略来解决不同分辨率的质量评价问题,其中多尺度权重是通过考虑观看环境信息从人类视觉系统的对比度敏感度函数中获得的。

3.3.4理解

以下是我自己对这个模型的理解解释图,对输入维度做了一定解释。时间特征流由于多了时间信息会比空间特征流多一个维度特征。所有在进行cat操作的时候需要降维。降维处理:先进行全局平均池化再将帧数维度和通道维度融合成一个维度。

在这里插入图片描述

!!!作者对模型的改进

举个例子:同样的设备,同一个摄影师,同一个模特,拍照姿势也一样,只有背景不同,保持单一变量的条件下。站在垃圾堆前面拍摄的视频和站在来福士前面拍摄的视频,人们在进行主观评价做数据标注时,肯定会觉得在来福士前面拍摄的更好看。因为背景的美学已经开始影响视频的质量分数了。所以,本人从这个方面对论文模型进行改进。

本人算法框体

在这里插入图片描述

视频抽帧

空间信息提取分为两个分支:第一、美学特征提取网络;第二、技术特征提取网络
时间信息提取
特征融合与质量回归
由于本人改进主要针对图像美学分支,从而在这里重点概述。

美学特征提取网络:

特征提取网络使用Resnet50框架,使用现在图像美学质量评价领域最大的数据集AVA数据集进行预训练。然后加载预训练权重。再使用图像美学数据集AADB进行美学属性回归,从而使网络具有图像美学特征提取能力。保存训练最好的权重。1、2、3、4、5、6个特征分别使AADB数据集中的6种美学客观属性。得到美学特征提取网络后,将视频关键帧馈送到美学特征提取网络中提取美学特征。
注:附件中有美学分支详细代码

3.3.5实验细节:

损失函数:L1RankLoss
优化器:Adam
超参数设置如下:

parser = argparse.ArgumentParser()# input parametersparser.add_argument('--database', type=str, default='LSVQ')  # LSVQparser.add_argument('--model_name', type=str, default='UGC_BVQA_model')  # UGC_BVQA_model# training parametersparser.add_argument('--conv_base_lr', type=float, default=1e-5)parser.add_argument('--decay_ratio', type=float, default=0.9)  # 0.9parser.add_argument('--decay_interval', type=int, default=2)  #多少步长来控制权重衰减parser.add_argument('--n_trial', type=int, default=0)parser.add_argument('--results_path', type=str)parser.add_argument('--exp_version', type=int, default=0)  # 0parser.add_argument('--print_samples', type=int, default=1000)parser.add_argument('--train_batch_size', type=int, default=8) #16parser.add_argument('--num_workers', type=int, default=6)  # 6parser.add_argument('--resize', type=int, default=520)parser.add_argument('--crop_size', type=int, default=448)parser.add_argument('--epochs', type=int, default=20)# miscparser.add_argument('--ckpt_path', type=str, default='ckpts')   #用于存储最好的效果parser.add_argument('--multi_gpu', action='store_true')  # 当命令行中触发multi_gpu参数时,返回为True,没有触发的时候返回Falseparser.add_argument('--gpu_ids', type=list, default=None)parser.add_argument('--loss_type', type=str, default='L1RankLoss')config = parser.parse_args()

四、代码复现

在附件中下载代码文件,先看到对应的代码文件结构,以下是代码文件简介。

4.1代码文件简介

在这里插入图片描述
文件夹Aes存放图像美学代码
文件夹ckpts存放权重
文件夹data存放数据集的csv文件
datasettimages_originalsize存放的图像美学数据集AADB
文件夹model存放模型
data_loader.py数据集加载处理代码
extract_frame_.py抽取各个数据集的帧代码
extract_slowfast_feature_
.py抽取各个数据集的时间特征代码
test_on_pretrained_model.py和test_demo.py分别是美学和视频的测试代码
其他文件都是包文件或者本人该模型的测试代码

4.2数据集下载

数据集文件数据较大,自行下载

视频质量评价目前最大的数据集:LSVQ、Konvid1k
图像美学数据集:AVA、AADB

注:数据集下载链接放在附件README中!

4.3环境

python=3.8.8
torch=1.10.2
torchvision=0.11.3
scipy
4.4测试训练
以抽帧模块为演示。

安装相应的包代码中import部分,可以在终端使用pip install安装(简单方便)
在这里插入图片描述
数据集路径修改,其他代码类似操作,将路径修改到自己对应文件
在这里插入图片描述
在这里插入图片描述

4.4.1复现结果

本人挂在后台运行。实验结果如下

在这里插入图片描述

参考文献:https://www.aspiringcode.com?url=https://www.aspiringcode.com


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/478863.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【真实场景面试问题-2】

1 介绍一下低功耗设计手段–clock gating 和 clock domain&#xff1b; 芯片的低功耗设计尤其是在关注能耗的场景&#xff1a;移动设备、物联网和嵌入式系统&#xff1b;时钟门控&#xff08;Clock Gating&#xff09;和时钟域&#xff08;Clock Domain&#xff09;是两种常用…

c++编程玩转物联网:使用芯片控制8个LED实现流水灯技术分享

在嵌入式系统中&#xff0c;有限的GPIO引脚往往限制了硬件扩展能力。74HC595N芯片是一种常用的移位寄存器&#xff0c;通过串行输入和并行输出扩展GPIO数量。本项目利用树莓派Pico开发板与74HC595N芯片&#xff0c;驱动8个LED实现流水灯效果。本文详细解析项目硬件连接、代码实…

《白帽子讲Web安全》13-14章

《白帽子讲Web安全》13-14章 《白帽子讲Web安全》13-14章13、应用层拒绝服务攻击13.1、DDOS简介13.2、应用层DDOS13.2.1、CC攻击13.2.2、限制请求频率13.2.3、道高一尺&#xff0c;魔高一丈 13.3、验证码的那些事儿13.4、防御应用层DDOS13.5、资源耗尽攻击13.5.1、Slowloris攻击…

Linux—进程概念学习-03

目录 Linux—进程学习—31.进程优先级1.1Linux中的进程优先级1.2修改进程优先级—top 2.进程的其他概念3.进程切换4.环境变量4.0环境变量的理解4.1环境变量的基本概念4.2添加环境变量—export4.3Linux中环境变量的由来4.4常见环境变量4.5和环境变量相关的命令4.6通过系统调用获…

pikachu文件上传漏洞通关详解

声明&#xff1a;文章只是起演示作用&#xff0c;所有涉及的网站和内容&#xff0c;仅供大家学习交流&#xff0c;如有任何违法行为&#xff0c;均和本人无关&#xff0c;切勿触碰法律底线 目录 概念&#xff1a;什么是文件上传漏洞一、客户端check二、MIME type三、getimagesi…

从零开始学GeoServer源码(二)添加支持arcgis切片功能

文章目录 参考文章环境背景1、配置打包好的程序1.1、下载GeoServer的war包1.2、下载GeoWebCache1.3、拷贝jar包1.4、修改配置文件1.4.1、拷贝geowebcache-arcgiscache-context.xml1.4.2、修改geowebcache-core-context.xml1.4.3、修改geowebcache-servlet.xml 1.5、配置切片信息…

学习日志016--python实现双向循环列表与链栈

python中一些复合数据结构通过类的封装来实现的。双向循环链表与链栈也在其中。 双向循环链表 双向循环链表是一种特殊类型的链表&#xff0c;它结合了双向链表和循环链表的特点。在双向循环链表中&#xff0c;每个节点不仅包含数据&#xff0c;还持有指向前一个和后一个节点的…

【自动化Selenium】Python 网页自动化测试脚本(上)

目录 1、Selenium介绍 2、Selenium环境安装 3、创建浏览器、设置、打开 4、打开网页、关闭网页、浏览器 5、浏览器最大化、最小化 6、浏览器的打开位置、尺寸 7、浏览器截图、网页刷新 8、元素定位 9、元素交互操作 10、元素定位 &#xff08;1&#xff09;ID定位 &…

微软Ignite 2024:建立一个Agentic世界!

在今年的Microsoft Ignite 2024上&#xff0c;AI Agent无疑成为本次大会的重点&#xff0c;已经有十万家企业通过Copilot Studio创建智能体了。微软更是宣布&#xff1a;企业可以在智能体中&#xff0c;使用Azure目录中1800个LLM中的任何一个模型了&#xff01; 建立一个Agent…

嵌入式linux系统中图像处理基本方法

目录 2.1 BMP图像处理 2.1.1 BMP文件格式解析 2.1.2 代码实现:将BMP文件解析为RGB格式,在LCD上显示 2.2 JPEG图像处理 2.2.1 JPEG文件格式和libjpeg编译 2.2.2 libjpeg接口函数的解析和使用 2.2.3 使用libjpeg把JPEG文件解析为RGB格式,在LCD上显示 …

探索 GAN 的演变之路

2014 年&#xff0c;在论文Generative Adversarial Networks中&#xff0c;首次提出了 GAN&#xff0c;其核心思想是“生成”与“对抗”。GAN 由一个生成器 G(Generator)和一个判别器 D(Discriminator)构成&#xff0c;前者用于捕捉数据分布&#xff0c;后者用于判别某个样本是…

Vue实训---5-路由搭建

回顾之前的代码 我们在my-vue-project\src\router\index.js中的代码如下&#xff1a; // 什么是路由&#xff1f;路由就是url地址和组件的对应关系 // 1.引入vue-router import { createRouter, createWebHashHistory } from vue-router// 2.定义路由 const routes [{path: …

【GAMES101笔记速查——Lecture 19 Cameras,Lenses and Light Fields】

本章节内容&#xff1a;相机、棱镜、光场 计算机图形学的两种成像方法&#xff1a; 1.合成方法&#xff1a;光栅化、光线追踪&#xff08;展示出现实没有的东西&#xff09; 2.捕捉方法&#xff1a;相机&#xff08;捕捉现实已有的东西&#xff09; 目录 1 相机 1.1 针孔相…

MacOS系统上Jmeter 录制脚本遇到的证书坑位

一、JMeter介绍与安装 1&#xff0c;下载及安装 jmeter官网地址 二、录制百度链接https请求时&#xff0c;需要导入jmeter相关证书到macos系统的更目录中. 导入方式&#xff0c;直接拖入mac的系统中&#xff0c;始终新人就可以&#xff1b; 三、jmeter 创建相关的录制组件…

软件团队的共担责任

问责制被认为是个人与其社会系统之间的纽带&#xff0c;它创造了一种将个人与其行为和绩效联系起来的身份关系。在入门系列的第一篇文章《超越工具和流程&#xff1a;成功软件开发团队的策略》中&#xff0c;我们介绍了问责制的概念&#xff0c;并提出了以下定义&#xff1a; …

【Python爬虫实战】深入解析 Scrapy:从阻塞与非阻塞到高效爬取的实战指南

&#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、阻塞和非阻塞 &#xff08;一&#xff09;阻塞 &#xff08;二&#xff09;非阻塞 二、Scrapy的工作…

【Python数据分析五十个小案例】电影评分分析:使用Pandas分析电影评分数据,探索评分的分布、热门电影、用户偏好

博客主页&#xff1a;小馒头学python 本文专栏: Python数据分析五十个小案例 专栏简介&#xff1a;分享五十个Python数据分析小案例 在现代电影行业中&#xff0c;数据分析已经成为提升用户体验和电影推荐的关键工具。通过分析电影评分数据&#xff0c;我们可以揭示出用户的…

第八篇:CamX RawHdr Feature Enable

CamX RawHdr Feature Enable RawHdr feature介绍: 试用于拍照场景,输入3张Raw,输出一张Raw。 对应的pipeline: camxSWMFMergeRaw.xml (usecases: UsecaseZSL) featureGraph: RTRawHDRBayer2YUVJPEG ​ RT -> RawHdr -> Bayer2Yuv -> JPEG RTRawHDRBayer2YUVJPE…

Python毕业设计选题:基于django+vue的期货交易模拟系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 期货信息 个人中心 管理员登录界面 管理员功能界面 用户管理 期货公司管理…

文件内容扫描工具

简介 文件扫描助手是一款基于Vite Vue 3 Electron技术栈开发的跨平台桌面应用程序。它提供了强大的文件内容搜索功能&#xff0c;支持Word、Excel、PDF、PPT等常见办公文档格式。用户可以通过关键词快速定位到包含特定内容的文件&#xff0c;极大地提高了文件管理和查找效率…