当前位置: 首页 > news >正文

⌈ 传知代码 ⌋ 视频质量评价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 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'

🫓总结

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

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

感谢你们的阅读😆

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

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

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

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


http://www.mrgr.cn/news/53954.html

相关文章:

  • 每日一道算法题(Leetcode 20)
  • 可编辑PPT | 用户中台运营解决方案
  • 【OpenAI】第二节(Token)什么是Token?如何计算ChatGPT的Token?
  • 【Android】Jetpack入门知识总结(LifeCycle,ViewModel,LiveData,DataBinding等)
  • Java中的单元测试与JUnit
  • Veritas NetBackup 10.5 发布,新增功能概览
  • 代码训练营 day39|0-1背包问题,LeetCode 416
  • 基于语音识别的停车共享小程序(lw+演示+源码+运行)
  • setuptools封装自己python包
  • 图像梯度-Sobel算子、scharrx算子和lapkacian算子
  • 逆向工程入门02.if语句分析
  • 如何用联想电脑滚动截图
  • stablediffusion ControlNet选不了模型/报错/无效 的解决方法
  • 【Linux网络编程】Socket编程--UDP(第一弹):实现客户端和服务器互相发送消息
  • 14.归一化——关键的数据预处理方法
  • 【C++ 算法进阶】算法提升四
  • 【C++训练营】现代C++编程(隐藏)
  • 【Mysql】-锁机制-GAP锁
  • 2024年【N2观光车和观光列车司机】及N2观光车和观光列车司机模拟考试题
  • 【Hive】2-Apache Hive概述、架构、组件、数据模型
  • 好的口才是做领导的第一要务
  • SpringMVC一个拦截器和文件上传下载的完整程序代码示例以及IDEA2024部署报错 找不到此 Web 模块的 out\artifacts\..问题
  • CMOS晶体管的串联与并联
  • 【含文档】基于Springboot+Vue的地方特色美食分享管理系统(含源码+数据库+lw)
  • webAPI中的节点操作、高级事件
  • 在 Spring MVC 应用程序中使用 WebMvcTest 注释有什么用处?