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

HMDB51数据集划分

生成训练集、验证集和测试集

每个split文件应该包含:

  • 训练集(id=1): 70个视频
  • 测试集(id=2): 30个视频
  • 未使用(id=0): 剩余视频
    这是一个70/30的训练/测试分割比例。标记为0的视频被排除在当前实验之外。
  • 实际上训练集(id=1),验证集(id=2),测试集(id=0),测试集和验证集可以互换
import os
import glob
from pathlib import Path# 设置数据处理的路径
SPLIT_DIR = r"C:/Users/yanho/Desktop/testTrainMulti_7030_splits"  # split文件所在目录
OUTPUT_DIR = r"C:/Users/yanho/Desktop/hmdb51_annotations"  # 输出目录def process_split_file(split_file, action_class):"""处理单个split文件并生成训练、验证和测试列表"""train_videos = []val_videos = []test_videos = []with open(split_file, 'r') as f:for line in f:video_name, label = line.strip().split()# 为每个视频添加类别标签(action_class)video_info = f'{video_name} {action_class}\n'if label == '1':train_videos.append(video_info)elif label == '2':val_videos.append(video_info)elif label == '0':test_videos.append(video_info)return train_videos, val_videos, test_videosdef main():# 创建输出目录output_dir = Path(OUTPUT_DIR)output_dir.mkdir(parents=True, exist_ok=True)# 用于收集所有训练、验证和测试样本all_train_videos = []all_val_videos = []all_test_videos = []# 处理所有split1文件split_files = glob.glob(os.path.join(SPLIT_DIR, '*_test_split1.txt'))for split_file in split_files:# 从文件名中提取动作类别action_class = Path(split_file).stem.split('_test_split1')[0]# 获取当前类别的动作类别索引class_idx = split_files.index(split_file)print(f'处理类别: {action_class} (索引: {class_idx})')# 处理当前split文件train_videos, val_videos, test_videos = process_split_file(split_file, class_idx)all_train_videos.extend(train_videos)all_val_videos.extend(val_videos)all_test_videos.extend(test_videos)# 写入训练集文件train_file = output_dir / 'train_split1.txt'with open(train_file, 'w') as f:f.writelines(all_train_videos)# 写入验证集文件val_file = output_dir / 'val_split1.txt'with open(val_file, 'w') as f:f.writelines(all_val_videos)# 写入测试集文件test_file = output_dir / 'test_split1.txt'with open(test_file, 'w') as f:f.writelines(all_test_videos)print(f'\n处理完成!')print(f'训练集样本数: {len(all_train_videos)}')print(f'验证集样本数: {len(all_val_videos)}')print(f'测试集样本数: {len(all_test_videos)}')print(f'文件保存在: {output_dir}')if __name__ == '__main__':main()

合并视频到统一目录

import os
import shutil
from pathlib import Pathdef merge_videos(src_dir, dst_dir):"""合并所有视频到统一目录Args:src_dir: 源视频目录dst_dir: 目标目录"""# 创建目标目录Path(dst_dir).mkdir(parents=True, exist_ok=True)# 遍历源目录for root, dirs, files in os.walk(src_dir):for file in files:if file.endswith('.avi'):  # 只处理视频文件# 获取类别名称category = os.path.basename(os.path.dirname(root))# 创建类别子目录category_dir = os.path.join(dst_dir, category)Path(category_dir).mkdir(exist_ok=True)# 源文件和目标文件路径src_path = os.path.join(root, file)dst_path = os.path.join(category_dir, file)# 复制文件shutil.copy2(src_path, dst_path)print(f"Copied {src_path} -> {dst_path}")if __name__ == "__main__":src_dir = "videos_src"  # 源视频目录dst_dir = "data/hmdb51/videos"  # 目标目录merge_videos(src_dir, dst_dir)  # 合并视频到统一目录,一共6766个视频

相关文章:

  • 深入解析:java.sql.SQLException: No operations allowed after statement closed 报错
  • Halcon算子应用和技巧14
  • 物联网赋能7×24H无人值守共享自习室系统设计与实践!
  • Elasticsearch 查询与过滤(Query vs. Filter)面试题
  • 怎么在excel单元格1-5行中在原来内容前面加上固定一个字?
  • STM32 | 软件定时器
  • 告别“知识孤岛”:RAG赋能网络安全运营
  • 线程(二)OpenJDK 17 中线程启动的完整流程用C++ 源码详解之主-子线程通信机制
  • 南航无人机大规模户外环境视觉导航框架!SM-CERL:基于语义地图与认知逃逸强化学习的无人机户外视觉导航
  • 【AI】SpringAI 第二弹:基于多模型实现流式输出
  • STM32+ESP8266连接onenet新平台
  • cursor/vscode启动项目connect ETIMEDOUT 127.0.0.1:xx
  • JavaScript防抖与节流全解析
  • 多平台屏幕江湖生存指南
  • 专题四:综合练习(组合问题的决策树与回溯算法)
  • 编译原理7~9
  • 数据库实验报告 数据定义操作 3
  • Oracle 高水位线(High Water Mark, HWM)
  • 【数据结构】线性表--队列
  • Echart地图数据源获取
  • 复旦大学艺术馆开馆:以当代视角再看文科文脉
  • 专访|《内沙》导演杨弋枢:挽留终将失去的美好
  • 俄乌谈判开始
  • 小雨伞保险经纪母公司手回集团通过港交所聆讯
  • 李公明︱一周书记:当前科学观中的盲点、危机与……人类命运
  • 陕西旱情实探:大型灌区农业供水有保障,大旱之年无旱象