手把手写深度学习(26):统计视频数据集的基本特性(帧数、帧率、长度)和预处理(切分)的自动化脚本

手把手写深度学习(0):专栏文章导航

前言:当算法工程师拿到一个新的视频数据集的时候,需要首先查看一下这个数据集的基本特性,方便后续处理和模型训练。这篇博客提供自动化脚本,帮助统计视频数据集的基本特性(如帧率、帧数、秒数)等,然后根据自己的需求对视频数据集进行切分预处理。

目录

获取文件夹下的所有视频文件

使用decord读取视频文件

统计文件夹下视频的平均帧率和fps

完整统计视频特性代码

数据剪切


获取文件夹下的所有视频文件

def get_video_files(directory):
    video_files = []
    # 遍历指定目录
    for root, dirs, files in os.walk(directory):
        for file in files:
            # 检查文件扩展名是否为视频格式
            if file.lower().endswith(('.mp4', '.avi', '.mov', '.mkv', '.wmv', '.flv')):
                video_files.append(os.path.join(root, file))
    return video_files

使用decord读取视频文件

def get_frame_count(video_path):
    # 创建VideoReader对象
    vr = VideoReader(video_path)
    # 获取视频的帧数
    frame_count = len(vr)
    fps = vr.get_avg_fps()

    return frame_count, fps

统计文件夹下视频的平均帧率和fps

# 统计文件夹下视频的平均帧率和fps
def get_average_frame_fps(video_path):
    
    video_files = get_video_files(video_paths)
    print(f'total videos: {len(video_files)}')

    frame_count_list = []
    fps_list = []
    second_list = []

    for index, video_file in enumerate(video_files):
        frame_count, fps = get_frame_count(video_file)
        second = frame_count / fps
        print(f'[{index}] The video has {frame_count} frames, fps is {fps}, seconds is {second}.')

        frame_count_list.append(frame_count)
        fps_list.append(fps)
        second_list.append(second)
    
    average_frame_count = sum(frame_count_list) / len(frame_count_list)
    average_fps = sum(fps_list) / len(fps_list)

    print(f"total videos numbers: {len(fps_list)}, average_frame_count is {average_frame_count}, average_fps is {average_fps}")

    return average_frame_count, average_fps

完整统计视频特性代码

import os
from decord import VideoReader
from decord import cpu, gpu

def get_video_files(directory):
    video_files = []
    # 遍历指定目录
    for root, dirs, files in os.walk(directory):
        for file in files:
            # 检查文件扩展名是否为视频格式
            if file.lower().endswith(('.mp4', '.avi', '.mov', '.mkv', '.wmv', '.flv')):
                video_files.append(os.path.join(root, file))
    return video_files

def get_frame_count(video_path):
    # 创建VideoReader对象
    vr = VideoReader(video_path)
    # 获取视频的帧数
    frame_count = len(vr)
    fps = vr.get_avg_fps()

    return frame_count, fps

# 统计文件夹下视频的平均帧率和fps
def get_average_frame_fps(video_path):
    
    video_files = get_video_files(video_paths)
    print(f'total videos: {len(video_files)}')

    frame_count_list = []
    fps_list = []
    second_list = []

    for index, video_file in enumerate(video_files):
        frame_count, fps = get_frame_count(video_file)
        second = frame_count / fps
        print(f'[{index}] The video has {frame_count} frames, fps is {fps}, seconds is {second}.')

        frame_count_list.append(frame_count)
        fps_list.append(fps)
        second_list.append(second)
    
    average_frame_count = sum(frame_count_list) / len(frame_count_list)
    average_fps = sum(fps_list) / len(fps_list)

    print(f"total videos numbers: {len(fps_list)}, average_frame_count is {average_frame_count}, average_fps is {average_fps}")

    return average_frame_count, average_fps


if __name__ == "__main__":

    # video_paths = 'your_own_path'
    get_average_frame_fps(video_paths)

    

至此,我们可以统计出视频数据集中的基本特性,下一步根据统计出来的特性剪切数据。

数据剪切

目前的视频生成模型大多数生成能力在30帧一下,所以训练的时候不能处理太长的视频;收集的视频一半的fps等于30或60,所以我们需要把收集到的视频进行剪切。

下面的函数实现了这一功能,frames_per_segment代表我们想要剪切视频的帧数量,fps是新保存视频的fps。

def clip_and_save_video(video_path, output_folder, frames_per_segment=60, fps=None):
    
    video_name = video_path.split('/')[-1].split('.')[0]

    os.makedirs(output_folder, exist_ok=True)
    
    # 打开视频文件
    cap = cv2.VideoCapture(video_path)

    # 获取视频帧率
    if fps is None:
        fps = int(cap.get(cv2.CAP_PROP_FPS))

    # 初始化帧计数器和片段索引
    frame_count = 0
    segment_index = 0

    # 定义视频编码器和输出视频参数
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')

    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break

        # 如果是片段的第一帧,创建新的视频写入对象
        if frame_count % frames_per_segment == 0:
            if frame_count > 0:
                out.release()
            segment_filename = os.path.join(output_folder, f'{video_name}_{segment_index:03d}.mp4')
            out = cv2.VideoWriter(segment_filename, fourcc, fps, (int(cap.get(3)), int(cap.get(4))))
            segment_index += 1

        # 将当前帧写入视频
        out.write(frame)
        frame_count += 1

    # 释放视频捕获和写入对象
    cap.release()
    if 'out' in locals():
        out.release()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++入门(以c为基础)——学习笔记

1.前言 首先&#xff0c;c兼容c语言百分之九十八、九十九的内容&#xff0c;可以认为这是两种不分家的语言 c的语法几乎能在c上都能跑 在一个后缀为.cpp的文件中&#xff0c;我们以面向过程的思考&#xff08;C语言的逻辑&#xff09;写下如下代码&#xff1a; #include <s…

基于STM32CubeMX移植freeModbus RTU(从站)-避坑篇

基于STM32CubeMX移植freeModbus RTU&#xff08;从站&#xff09;-避坑篇 &#xff08;重点&#xff09;Chapter0 移植Freemodbus到STM32(基于CubeMX,HAL库)-避坑篇&#xff08;1&#xff09;Freemodbus移植到TTL的USART1可行&#xff0c;但改为485的USART2不行&#xff08;2&a…

科研学习|论文解读——情感对感知偶然信息遭遇的影响研究(JASIST,2022)

原文题目 Investigating the impact of emotions on perceiving serendipitous information encountering 一、引言 serendipity一词最初是由霍勒斯沃波尔创造的&#xff0c;他将其定义为“通过意外和睿智发现你并不追求的事物”。信息研究中大多数现有的偶然性定义从几个角度看…

深度学习理解及学习推荐(持续更新)

主推YouTuBe和Bilibili 深度学习博主推荐&#xff1a; Umar Jamil - YouTubehttps://www.youtube.com/umarjamilai StatQuest with Josh Starmer - YouTubehttps://www.youtube.com/statquest RNN Illustrated Guide to Recurrent Neural Networks: Understanding the Int…

Java基础入门--面向对象课后题(1)

某公司正进行招聘工作&#xff0c;被招聘人员需要填写个人信息&#xff0c;编写“个人简历”的封装类Resume&#xff0c;并编写测试类进行实现。类图及输出效果如下。 类名&#xff1a;Resumename : String (private)sex : String (private)age : int (private)Resume( ) // 没…

【产品设计】四句口诀,搞懂支付交易设计

01 支付交易介绍 支付是交易的一部分&#xff0c;订单是信息流支付是资金流&#xff0c;交易系统通过信息和资金的匹配来完成交易履约。这么说有点抽象&#xff0c;我们通过大家熟悉的电商购物流程来介绍下。 1.1、交易链路 我们做交易设计的时候听到最多的就是“要掌握交易…

数据结构八大常见的排序

数据结构八大常见的排序 常见排序算法分类1.插入排序2.希尔排序(缩小增量排序)3.选择排序4.堆排序5.冒泡排序6.快速排序7.归并排序归并排序非递归的实现8.计数排序 常见排序算法分类 1.插入排序 基本思想&#xff1a;把待排序的数组按大小逐个插入到一个已经排好序的有序序列中…

结构体与位段的定义以及在内存中的存储

目录 结构体的声明 完全声明 不完全声明 结构体变量的定义和初始化 结构体的嵌套 结构体成员的直接访问和间接访问 结构体的自引用 typedef对结构体类型重命名 结构体内存对齐 对齐规则 练习 为什么存在内存对齐 修改默认对齐数 结构体传参 结构体实现位段 位段…

【Linux】认识线程池 AND 手撕线程池(正常版)

文章目录 0.回顾进程池1.计算机层面的池化技术2.线程池预备知识2.1介绍线程池2.2设计线程池的意义是什么&#xff1f;2.3其他知识 3.回顾C类与对象3.1cpp什么情况下成员函数必须是静态的&#xff1f;3.1可变参数列表3.2格式化输出函数3.3预定义符号 4.图解线程池运作原理4.0完整…

创意艺术信息图表绘制方法(六边形图)

创意艺术信息图表绘制方法&#xff08;六边形图&#xff09; 在网络科技发展进步的当下&#xff0c;原来一些传统的统计图表都有了进一步的创新。以前企业的PPT都依赖微软的各应用软件来制作图表&#xff0c;现时企业的PPT展示的图表应用不再满足于Excle&#xff0c;Word等的图…

设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声。

设计一个动物声音“模拟器”&#xff0c;希望模拟器可以模拟许多动物的叫声。要求如下&#xff1a; &#xff08;1&#xff09;编写接口Animal Animal接口有2个抽象方法cry()和getAnimaName()&#xff0c;即要求实现该接口的各种具体动物类给出自己的叫声和种类名称。 &…

【Linux系列】tree和find命令

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

腾讯云TDSQL(MySQL版)和(PostgreSQL版)TCP认证介绍

腾讯云TDSQL&#xff08;MySQL版&#xff09;TCP认证介绍 数据库交运维高级工程师-腾讯云TDSQL&#xff08;MySQL版&#xff09;-课程体系-云贝教育&#xff08;yunbee.net&#xff09; 培训概述 数据库交付运维高级工程师-腾讯云TDSQL&#xff08;MySQL版&#xff09;培训&…

PetaLinux使用简介

1 概述 PetaLinux 工具提供在 Xilinx 处理系统上定制、构建和调配嵌入式 Linux 解决方案所需的所有组件。该解决方案旨在提升设计生产力&#xff0c;可与 Xilinx 硬件设计工具配合使用&#xff0c;以简化针对 Versal、Zynq™ UltraScale™ MPSoC、Zynq™ 7000 SoC、和 MicroBl…

基于ssm的家庭食谱管理系统(java项目+文档+源码)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的家庭食谱管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 家庭食谱管理系统的主要使用者…

前端 - 基础 表单标签 - 表单元素 input - type 属性 ( 单选按钮和复选按钮 )

input 标签 type 属性 &#xff0c;上一篇讲了 输入框 和 密码框 这节看看 单选按钮 和 复选 按钮 目录 单选按钮 &#xff1a; 复选按钮 # 看上图就可以看到 单选按钮 -- radio 和 复选 按钮 -- checkbox 单选按钮 &#xff1a; 所谓单选按钮就是 有时…

Can‘t connect to server on ‘localhost‘ (10061)

问题&#xff1a;电脑关机重启后&#xff0c;连接不上mysql了&#xff0c;报错信息如下&#xff1a;2002 - Cant connect to server on localhost (10061)解决办法&#xff1a;很大的原因是mysql服务没有启动&#xff0c;需要你重启一下mysql&#xff1a; 以管理员的身份运行cm…

R使用netmeta程序包实现二分类数据的频率学网状meta分析

该研究检索了Cochrane对照试验中心注册&#xff0c;CINAHL&#xff0c;Embase&#xff0c;LILACS数据库&#xff0c;MEDLINE&#xff0c;MEDLINEIn-Process&#xff0c;PsycINFO&#xff0c;监管机构网站&#xff0c;以及从一开始就发布和未发表的双盲随机对照试验的国际注册20…

重构智能防丢产品,苹果Find My技术引领市场发展

目前市场上最主要的防丢技术是蓝牙防丢和GPS防丢&#xff0c;蓝牙防丢是通过感应防丢器与绑定手机的距离来实现防丢的。一般防丢会默认设置一个最远安全距离&#xff0c;超过这个安全距离后&#xff0c;与手机蓝牙信号断开&#xff0c;触发防丢报警&#xff0c;用户根据防丢报警…

百度贝塞尔曲线证码识别代码

一、前言 百度出了如图所示的验证码&#xff0c;需要拖动滑块&#xff0c;与如图所示的曲线轨迹进行重合。经过不断研究&#xff0c;终于解决了这个问题。我把识别代码分享给大家。 下面是使用selenium进行验证的&#xff0c;这样可以看到轨迹滑动的过程&#xff0c;如果需要…