百万youtube高清视频数据集采集

2023-11-07

HD-VILA-100M是什么?

HD-VILA-100M是一个大规模、高分辨率、多样化的视频语言数据集,有助于多模态表示学习。

在这里插入图片描述

数据统计

该数据集共包含330万个视频,视频质量较高,均衡分布在15个类别中。
HD-VILA-100M数据集的分类分布

下载(Download)

您可以通过此链接下载所有视频链接:视频链接

原始视频下载:

您可以根据上面的视频链接使用 下面代码 从 YouTube 下载原始视频

下载原始视频使用的是youtube-dl这个命令行下载工具,需要注意版本和补丁问题,这里提供了大部分youtube-dl运行问题和速度慢等解决方案:https://github.com/ytdl-org/youtube-dl/issues/30839

from joblib import Parallel, delayed
import multiprocessing
import youtube_dl
import jsonlines
import json
import argparse
from tqdm import tqdm
import time
import os
import logging
from urllib.request import urlopen

def parse_args():
    parser = argparse.ArgumentParser(description='youtube video downloader')
    parser.add_argument('--workdir', default='hdvila_100m',type=str, help='Working Directory')
    parser.add_argument('--metafile', default='hdvila_part0.jsonl', type=str, help='youtube video meta')
    parser.add_argument('--log', default='log_part0.log', type=str, help='log')
    parser.add_argument('--audio_only', action='store_true')
    args = parser.parse_args()
    return args


def check_dirs(dirs):
    if not os.path.exists(dirs):
        os.makedirs(dirs, exist_ok=True)
        print(f'no path{dirs}')
    else:
        print(f'exists: {dirs}')


class YouTubeVideoDownloader():
    def __init__(self, metafile, workdir):
        self.videourls = self.readvideourls(metafile)
        self.workdir = workdir

    def readvideourls(self, metafile):
        vs = []
        with open(metafile,'r') as f:
            for l in jsonlines.Reader(f):
                vs.append(l['url'])
        logger.info('Number of videos to download: %d', len(vs))
        return vs

    def downloadvideo(self,vurl):
        format_id='22' # for 720p videos with audio
        if args.audio_only:
            format_id='140' # audio_only
        ydl_opts = {
            'outtmpl':os.path.join(self.workdir, 'download_videos') +'/%(id)s.%(ext)s',
            'merge_output_format':'mp4',
            'format':format_id, # 720P
            'skip_download':False,
            'ignoreerrors':True,
            'quiet':True
        }
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            start = time.time()
            result = ydl.download([vurl])
            end = time.time()
            if result != 0:
                logger.error('Fail to download %s', vurl)
            logger.info('Time for download video %.2f sec', end-start)
            return result   
            
    def downloadallParallel(self):
        num_cores = multiprocessing.cpu_count()
        logger.info(f"num cores: {num_cores}")
        results = Parallel(n_jobs=50, backend='threading')(delayed(self.downloadvideo)(v) for v in tqdm(self.videourls))
        results = [x for x in results if x is not None]
        logger.info(f"Number of videos downloaded: {len(results)}")


if __name__ == '__main__':
    args = parse_args()
    
    metafile = os.path.join(args.workdir, 'metafiles', args.metafile)
    logdir = os.path.join(args.workdir,'download_video_log')

    check_dirs(os.path.join(args.workdir, 'download_videos'))
    check_dirs(logdir)

    logging.basicConfig(level=logging.INFO,
                    filename=os.path.join(logdir, args.log),
                    datefmt='%Y/%m/%d %H:%M:%S',
                    format='%(asctime)s - %(name)s - %(levelname)s - %(lineno)d - %(module)s - %(message)s')

    logger = logging.getLogger(__name__)
    logger.info(args)

    yvd = YouTubeVideoDownloader(metafile, args.workdir)
    yvd.downloadallParallel()

youtube访问过高有ip反爬,可以通过修改下面代码设置代理ip:

import youtube_dl
 # 设置代理IP
proxy_ip = 'YOUR_PROXY_IP_ADDRESS'
proxy_port = 'YOUR_PROXY_PORT'
 # 创建ydl_opts字典并设置代理
ydl_opts = {
    'proxy': f'http://{proxy_ip}:{proxy_port}',
}
 # 使用带有代理设置的YoutubeDL对象
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    # 在这里添加您的代码逻辑
    pass

视频剪切为剪辑

import jsonlines
import os
from tqdm import tqdm
import logging
import argparse
import re
import subprocess
import multiprocessing
from joblib import Parallel, delayed


def parse_args():
    parser = argparse.ArgumentParser(description='youtube video processing')
    parser.add_argument('--workdir', default='./hdvila_100m',type=str, help='Working Directory')
    parser.add_argument('--metafile', default='meta_part0.jsonl', type=str, help='youtube video meta')
    parser.add_argument('--resultfile', default='cut_part0.jsonl', type=str, help='processed videos')
    parser.add_argument('--log', default='log_part0.log', type=str, help='log')
    args = parser.parse_args()
    return args


def check_dirs(dirs):
    if not os.path.exists(dirs):
        os.makedirs(dirs, exist_ok=True)


class Cutvideos():
    def __init__(self, metafile, workdir, resultfile):
        self.workdir = workdir
        self.metafile = metafile
        self.resultfile = resultfile
        self.metas = self.loadmetas()

    def loadmetas(self):
        metas = []
        with open(self.metafile, 'r') as f:
            for l in jsonlines.Reader(f):
                metas.append(l)
        return metas

    def hhmmss(self, timestamp1, timestamp2):
        hh,mm,s = timestamp1.split(':')
        ss,ms = s.split('.')
        timems1 = 3600*1000*int((hh)) +  60*1000*int(mm) + 1000*int(ss) + int(ms)
        hh,mm,s = timestamp2.split(':')
        ss,ms = s.split('.')
        timems2 = 3600*1000*int((hh)) +  60*1000*int(mm) + 1000*int(ss) + int(ms)
        dur = (timems2 - timems1)/1000
        return str(dur)

    def run(self, cmd):
        proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        out, _ = proc.communicate()
        return out.decode('utf-8')

    def extract_single_clip(self,sb, in_filepath, out_filepath):
        cmd = ['ffmpeg', '-ss', sb[0], '-t', self.hhmmss(sb[0], sb[1]),'-accurate_seek', '-i', in_filepath, '-c', 'copy',
            '-avoid_negative_ts', '1', '-reset_timestamps', '1',
            '-y', '-hide_banner', '-loglevel', 'panic', '-map', '0',out_filepath]
        self.run(cmd)
        if not os.path.isfile(out_filepath):
            raise Exception(f"{out_filepath}: ffmpeg clip extraction failed")

    def extract_clips(self, meta):
        clips = meta['clip']
        vid = meta['video_id']
        outfolder = os.path.join(self.workdir,'video_clips', vid)
        check_dirs(outfolder)
        result = []
        # try:
        for c in clips:
            self.extract_single_clip(c['span'], os.path.join(self.workdir,'download_videos', vid + '.mp4'), os.path.join(outfolder, c['clip_id']))
            result.append(c['clip_id'])
        # except:
        #     pass

        return result

    def extract_all_clip(self):
        results = []
        for v in tqdm(self.metas):
            result = self.extract_clips(v)
            results.extend(result)

        logger.info(f"Number of clips processed: {len(results)}")
        with jsonlines.open(os.path.join(self.workdir, 'cut_video_results', self.resultfile), 'w') as f:
            for l in results:
                f.write(l)
        

if __name__ == '__main__':
    args = parse_args()
    
    metafile = os.path.join(args.workdir, 'metafiles', args.metafile)
    logdir = os.path.join(args.workdir,'cut_video_log')

    check_dirs(os.path.join(args.workdir, 'video_clips'))
    check_dirs(os.path.join(args.workdir, 'cut_video_results'))
    check_dirs(logdir)

    logging.basicConfig(level=logging.INFO,
                    filename=os.path.join(logdir, args.log),
                    datefmt='%Y/%m/%d %H:%M:%S',
                    format='%(asctime)s - %(name)s - %(levelname)s - %(lineno)d - %(module)s - %(message)s')

    logger = logging.getLogger(__name__)
    logger.info(args)

    cvd = Cutvideos(metafile, args.workdir, args.resultfile)
    cvd.extract_all_clip()

如果您发现该数据集对您的研究有用,请记得点赞关注收藏!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

百万youtube高清视频数据集采集 的相关文章

  • Python:在列表理解本身中引用列表理解?

    这个想法刚刚出现在我的脑海中 假设您出于某种原因想要通过 Python 中的列表理解来获取列表的唯一元素 i if i in created comprehension else 0 for i in 1 2 1 2 3 1 2 0 0 3
  • Django 代理模型的继承和多态性

    我正在开发一个我没有启动的 Django 项目 我面临着一个问题遗产 我有一个大模型 在示例中简化 称为MyModel这应该代表不同种类的物品 的所有实例对象MyModel应该具有相同的字段 但方法的行为根据项目类型的不同而有很大差异 到目
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 如何在 Python 中检索 for 循环中的剩余项目?

    我有一个简单的 for 循环迭代项目列表 在某些时候 我知道它会破裂 我该如何退回剩余的物品 for i in a b c d e f g try some func i except return remaining items if s
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 如何计算 pandas 数据帧上的连续有序值

    我试图从给定的数据帧中获取连续 0 值的最大计数 其中包含来自 pandas 数据帧的 id date value 列 如下所示 id date value 354 2019 03 01 0 354 2019 03 02 0 354 201
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2

随机推荐

  • 在浏览器地址栏键入URL按下回车之后会经历什么?

    在浏览器地址栏键入URL按下回车之后主要会经历以下7个步骤 1 查找浏览器缓存 如果查找到缓存中有我们URL对应的文件 则判断是否命中强缓存 如果命中直接读取使用即可 如果强缓存没有命中 判断协商缓存是否命中 但协商缓存不论是否命中都会发送
  • es部署--生产环境--01--es单机

    es部署 生产环境 01 es单机 前提 使用hd用户登陆 完成基础环境搭建 https blog csdn net zhou920786312 article details 118212302 1 资源下载 elasticsearch
  • Asp.net页面之间传递参数的几种方法

    1 使用QueryString变量 QueryString是一种非常简单的传值方式 他可以将传送的值显示在浏览器的地址栏中 如果是传递一个或多个安全性要求不高或是结构简单的数值时 可以使用这个方法 但是对于传递数组或对象的话 就不能用这个方
  • 【C++】-- 哈希(上万字详细配图配代码从执行一步步讲解)

    目录 哈希 常见哈希函数 除留余数法 哈希冲突 哈希冲突解决 闭散列 a 线性探测 插入 查找 删除 线性探测的实现代码 b 二次探测 二次探测的实现 开散列 开散列实现 插入 查找 删除 析构函数 代码汇总 哈希 常见哈希函数 直接定址法
  • 2017第八届Java A组蓝桥杯省赛真题第九题:分巧克力

    第九题 分巧克力 儿童节那天有K位小朋友到小明家做客 小明拿出了珍藏的巧克力招待小朋友们 小明一共有N块巧克力 其中第i块是Hi x Wi的方格组成的长方形 为了公平起见 小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们 切出的巧克力
  • c++ 数据结构——链表

    1 链表概念 暂略 2 栈的相关题目 2 1 leetcode 237 Delete Node in a Linked List 注意 这个题没有给head Definition for singly linked list struct
  • mysatis中子查询剖析

    mybatis中查询代码是这样写的
  • 为什么要对基带信号进行脉冲成型【转载】

    数字信号在传输过程中受到叠加干扰与噪声 从而出现波形失真 瑞典科学家哈利 奈奎斯特在1928 年为解决电报传输问题提出了数字波形在无噪声线性信道上传输时的无失真条件 称为奈奎斯特准则 其中奈奎斯特第一准则是抽样点无失真准则 或无码间串扰 I
  • Java8 Stream学习笔记

    一 什么是Stream流 WHAT 在Java中 集合和数组是我们经常会用到的数据结构 需要经常对他们做增 删 改 查 聚合 统计 过滤等操作 相比之下 关系型数据库中也同样有这些操作 但是在Java 8之前 集合和数组的处理并不是很便捷
  • php微信公众号code获取不到,微信公众号调取用户信息,遇到invalid code的问题

    使用了php php部分如下 code GET code userinfo getUserInfo code function getUserInfo code appid 1111111111 appsecret 111111111111
  • Redis与数据库一致性问题分析

    缓存已经在项目中被广泛使用 在读取缓存方面 大家没啥疑问 都是按照下图的流程来进行业务操作 但是在更新缓存方面 对于更新完数据库 是更新缓存呢 还是删除缓存 又或者是先删除缓存 再更新数据库 其实大家存在很大的争议 所以参考了网上一些资料对
  • Linux文件I/O编程

    文章目录 一 文件描述符 二 打开文件 三 创建文件 四 关闭文件 五 读取文件 六 向文件写入数据 七 设定文件偏移量 八 获取文件状态 九 创建和删除目录项 十 文件锁定 十一 建立文件和内存映射 十二 mmap 和 共享内存对比 I
  • React中CodeMirror插件的使用及封装

    目录 一 CodeMirror是什么 二 React中CodeMirror的基本使用介绍 一 引入CodeMirror 1 安装CodeMirror插件 2 引入 CodeMirror 插件 二 引入文件配置 三 关键属性解读 1 valu
  • hive 表中常用的 增加/修改/替换列操作

    1 语法 更新列 ALTER TABLE table name CHANGE COLUMN col old name col new name column type COMMENT col comment FIRST AFTER colu
  • C++ 仿函数(二)

    在上一篇里我们讲了仿函数是什么 以及一元谓词 二元谓词的概念 C 仿函数 一 小梁今天敲代码了吗的博客 CSDN博客 这篇是讲 内建函数对象 主要包括 算术仿函数 关系仿函数 逻辑仿函数 目录 一 算术仿函数 示例 二 关系仿函数 示例 举
  • windows 开机启动脚本(亲测可用)

    1 打开计划任务 2 创建任务 3 添加一个启动触发器 4 添加一个脚本操作 5 点击确认 输入登录管理员密码即可 重启试试吧
  • 部署 Exsi 7.0.3

    文章目录 1 下载介质 2 u盘引导安装启动盘 3 硬件连接 4 安装 EXSI 7 0 3 1 下载介质 下载 VMware VMvisor Installer 7 0U3l 21424296 x86 64 iso 安装 EXSI 7 0
  • vue H5页面跳转微信小程序以及生成二维码跳转小程序

    研究了两种H5跳转小程序的方法 同时携带参数 1 手机浏览器打开H5页面 点击按钮拉起微信小程序 2 H5页面上生成小程序二维码 手机微信扫码跳转目标小程序 为了开发方便 以上两种均借助了微信小程序云函数来实现 事前准备 在vue工程的in
  • Oracle数据库的导入&导出

    1 权限配置及导入导出 1 1 配置导入导出目录及设置相应权限 SQL gt select from dba directories dir where dir DIRECTORY NAME in DUMPDIR DATA PUMP DIR
  • 百万youtube高清视频数据集采集

    HD VILA 100M是什么 HD VILA 100M是一个大规模 高分辨率 多样化的视频语言数据集 有助于多模态表示学习 数据统计 该数据集共包含330万个视频 视频质量较高 均衡分布在15个类别中 下载 Download 您可以通过此