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

TSM行为识别实战:从UCF101抽帧到模型训练,保姆级避坑指南(附完整代码)

TSM行为识别实战从UCF101抽帧到模型训练全流程解析行为识别作为计算机视觉领域的重要研究方向正在智能监控、人机交互、体育分析等场景中发挥越来越大的作用。本文将手把手带你完成基于TSMTemporal Shift Module模型的行为识别全流程实战从UCF101数据集处理到模型训练调优每个步骤都配有详细的操作指南和避坑建议。1. 环境准备与数据获取在开始实战之前我们需要准备好开发环境和数据集。以下是推荐的环境配置硬件配置GPUNVIDIA GTX 1080 Ti或更高建议显存≥8GBCPU4核以上内存16GB以上存储空间至少100GB可用空间UCF101原始视频抽帧图片占用较大空间软件环境操作系统Ubuntu 18.04/20.04推荐或Windows 10Python3.7或3.8PyTorch1.7.0或更高版本CUDA10.2或11.1需与PyTorch版本匹配cuDNN与CUDA对应的版本提示建议使用conda创建虚拟环境避免依赖冲突。可使用以下命令创建环境conda create -n tsm python3.8 conda activate tsm pip install torch torchvision torchaudioUCF101数据集下载与结构UCF101是行为识别领域广泛使用的基准数据集包含101类动作的13320个视频片段。数据集可从官网下载解压后目录结构如下UCF101/ ├── ApplyEyeMakeup/ │ ├── v_ApplyEyeMakeup_g01_c01.avi │ ├── v_ApplyEyeMakeup_g01_c02.avi │ └── ... ├── ApplyLipstick/ │ ├── v_ApplyLipstick_g01_c01.avi │ └── ... └── ...2. 视频抽帧与数据预处理TSM模型需要以视频帧序列作为输入因此我们需要将视频文件转换为图像序列。以下是详细的抽帧流程2.1 安装FFmpegFFmpeg是处理视频的必备工具可通过以下命令安装# Ubuntu sudo apt-get update sudo apt-get install ffmpeg # Windows # 从官网下载编译好的二进制文件并添加到PATH环境变量2.2 编写抽帧脚本创建vid2img_ucf101.py脚本实现批量视频抽帧import os import subprocess import argparse def video_to_frames(video_path, output_dir, frame_size256): 将单个视频转换为帧序列 if not os.path.exists(output_dir): os.makedirs(output_dir) cmd fffmpeg -i {video_path} -vf scale{frame_size}:-1 -q:v 2 {output_dir}/image_%05d.jpg subprocess.call(cmd, shellTrue) def process_class(class_dir, output_root, class_name): 处理一个类别下的所有视频 class_output_dir os.path.join(output_root, class_name) if not os.path.exists(class_output_dir): os.makedirs(class_output_dir) for video_file in os.listdir(class_dir): if not video_file.endswith(.avi): continue video_name os.path.splitext(video_file)[0] video_path os.path.join(class_dir, video_file) output_dir os.path.join(class_output_dir, video_name) video_to_frames(video_path, output_dir) if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--input_dir, requiredTrue, helpUCF101视频根目录) parser.add_argument(--output_dir, requiredTrue, help输出图片根目录) args parser.parse_args() for class_name in os.listdir(args.input_dir): class_dir os.path.join(args.input_dir, class_name) if os.path.isdir(class_dir): process_class(class_dir, args.output_dir, class_name)运行脚本python vid2img_ucf101.py --input_dir /path/to/UCF101 --output_dir /path/to/output_frames2.3 生成标签文件创建gen_label_ucf101.py脚本生成训练所需的标签文件import os import glob def generate_label_files(frame_root, label_dir, class_ind_file, train_list_file, test_list_file): # 读取类别索引 class_ind {} with open(class_ind_file) as f: for line in f: idx, name line.strip().split() class_ind[name] int(idx) - 1 # 转换为0-based索引 # 生成训练集标签 train_samples [] with open(train_list_file) as f: for line in f: parts line.strip().split(/) class_name parts[0] video_name parts[1].split(.)[0] label class_ind[class_name] frame_dir os.path.join(frame_root, class_name, video_name) frame_count len(glob.glob(os.path.join(frame_dir, *.jpg))) if frame_count 0: # 确保有有效帧 train_samples.append(f{frame_dir} {frame_count} {label}\n) # 生成测试集标签 test_samples [] with open(test_list_file) as f: for line in f: parts line.strip().split(/) class_name parts[0] video_name parts[1].split(.)[0] label class_ind[class_name] frame_dir os.path.join(frame_root, class_name, video_name) frame_count len(glob.glob(os.path.join(frame_dir, *.jpg))) if frame_count 0: test_samples.append(f{frame_dir} {frame_count} {label}\n) # 写入文件 os.makedirs(label_dir, exist_okTrue) with open(os.path.join(label_dir, ucf101_rgb_train_split_1.txt), w) as f: f.writelines(train_samples) with open(os.path.join(label_dir, ucf101_rgb_val_split_1.txt), w) as f: f.writelines(test_samples) if __name__ __main__: generate_label_files( frame_root/path/to/output_frames, label_dir/path/to/labels, class_ind_file/path/to/classInd.txt, train_list_file/path/to/trainlist01.txt, test_list_file/path/to/testlist01.txt )3. TSM模型训练配置3.1 获取TSM官方代码克隆TSM官方仓库并安装依赖git clone https://github.com/mit-han-lab/temporal-shift-module.git cd temporal-shift-module pip install -r requirements.txt3.2 修改配置文件在ops/dataset_config.py中修改数据集路径ucf101 { rgb_train: /path/to/ucf101_rgb_train_split_1.txt, rgb_val: /path/to/ucf101_rgb_val_split_1.txt, root_dataset: /path/to/output_frames, num_class: 101, }3.3 下载预训练权重TSM提供了在Kinetics数据集上预训练的权重可从以下链接下载ResNet50版本TSM_kinetics_RGB_resnet50_shift8_blockres_avg_segment8_e50.pthMobileNetV2版本TSM_kinetics_RGB_mobilenetv2_shift8_blockres_avg_segment8_e100_dense.pth将下载的权重文件放入pretrained/目录。4. 模型训练与调优4.1 训练命令解析TSM提供了多种训练选项以下是常用参数说明参数说明推荐值--arch模型架构resnet50或mobilenetv2--num_segment时间片段数8--batch-size批次大小16-32根据GPU显存调整--lr初始学习率0.001--lr_steps学习率衰减步数10 20--epochs训练轮数25-50--dropoutDropout率0.5-0.8--shift_div时间移位除数8--tune_from预训练权重路径pretrained/xxx.pthResNet50训练命令python main.py ucf101 RGB \ --arch resnet50 \ --num_segment 8 \ --batch-size 16 \ --lr 0.001 \ --lr_steps 10 20 \ --epochs 25 \ --dropout 0.8 \ --consensus_type avg \ --eval-freq 1 \ --shift \ --shift_div 8 \ --shift_place blockres \ --tune_from pretrained/TSM_kinetics_RGB_resnet50_shift8_blockres_avg_segment8_e50.pthMobileNetV2训练命令python main.py ucf101 RGB \ --arch mobilenetv2 \ --num_segment 8 \ --batch-size 32 \ --lr 0.001 \ --lr_steps 10 20 \ --epochs 25 \ --dropout 0.5 \ --consensus_type avg \ --eval-freq 1 \ --shift \ --shift_div 8 \ --shift_place blockres \ --tune_from pretrained/TSM_kinetics_RGB_mobilenetv2_shift8_blockres_avg_segment8_e100_dense.pth4.2 常见问题解决问题1预训练权重加载失败MobileNetV2版本可能出现权重加载错误解决方法是在main.py中修改权重加载逻辑if args.arch mobilenetv2: model_dict model.module.state_dict() # 处理权重名称不匹配问题 new_sd {} for k, v in sd.items(): if k.startswith(module.): new_k k[7:] # 去除module.前缀 new_sd[new_k] v else: new_sd[k] v model_dict.update(new_sd) model.module.load_state_dict(model_dict)问题2显存不足如果遇到CUDA out of memory错误可以尝试减小batch-size如从32降到16减小输入分辨率修改--new_length和--new_width参数使用梯度累积添加--accumulate_grad参数问题3训练精度不理想可以尝试以下调优策略增加数据增强修改transform.py中的增强策略调整学习率策略如使用余弦退火增加训练轮数--epochs尝试不同的shift_div值如4或165. 模型测试与部署5.1 视频行为识别Demo创建video_demo.py实现视频行为识别import torch import cv2 import numpy as np from models import TSN from transforms import GroupScale, GroupCenterCrop, Stack, ToTorchFormatTensor, GroupNormalize # 初始化模型 num_class 101 arch resnet50 pretrain checkpoints/TSM_ucf101_RGB_resnet50_shift8_blockres_avg_segment8_e25.pth model TSN(num_class, 8, RGB, base_modelarch, consensus_typeavg, dropout0.8, shift_div8) checkpoint torch.load(pretrain) model.load_state_dict(checkpoint[state_dict]) model.eval() # 定义预处理 transform torchvision.transforms.Compose([ GroupScale(256), GroupCenterCrop(224), Stack(), ToTorchFormatTensor(), GroupNormalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) # 加载类别标签 with open(ucf101_labels.txt) as f: class_names [line.strip() for line in f] # 视频处理函数 def process_video(video_path): cap cv2.VideoCapture(video_path) frames [] while True: ret, frame cap.read() if not ret: break # 转换为RGB frame cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) frames.append(Image.fromarray(frame)) # 采样8帧 num_frames len(frames) indices np.linspace(0, num_frames-1, 8, dtypenp.int32) sampled_frames [frames[i] for i in indices] # 预处理 input_tensor transform(sampled_frames).unsqueeze(0) # 推理 with torch.no_grad(): output model(input_tensor) # 获取预测结果 pred output.argmax(dim1).item() return class_names[pred] # 测试视频 video_path test_video.avi prediction process_video(video_path) print(fPredicted action: {prediction})5.2 性能优化技巧模型量化使用PyTorch的量化功能减小模型大小提升推理速度model torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtypetorch.qint8 )多线程预处理使用DataLoader的num_workers参数加速数据加载TensorRT加速将模型转换为TensorRT引擎提升推理性能帧采样策略优化根据视频长度动态调整采样间隔确保覆盖关键动作在实际项目中TSM模型在UCF101数据集上通常能达到85%-90%的top-1准确率。通过合理的调参和数据增强可以进一步提升模型性能。

相关文章:

TSM行为识别实战:从UCF101抽帧到模型训练,保姆级避坑指南(附完整代码)

TSM行为识别实战:从UCF101抽帧到模型训练全流程解析 行为识别作为计算机视觉领域的重要研究方向,正在智能监控、人机交互、体育分析等场景中发挥越来越大的作用。本文将手把手带你完成基于TSM(Temporal Shift Module)模型的行为识…...

如何构建终极智能电池管理系统:DIY爱好者的完整解决方案

如何构建终极智能电池管理系统:DIY爱好者的完整解决方案 【免费下载链接】SmartBMS Open source Smart Battery Management System 项目地址: https://gitcode.com/gh_mirrors/smar/SmartBMS 在当今能源转型的时代,锂电池已成为从电动汽车到家庭储…...

MSG文件高效提取工具:解放双手的Outlook邮件解析方案

MSG文件高效提取工具:解放双手的Outlook邮件解析方案 【免费下载链接】msg-extractor Extracts emails and attachments saved in Microsoft Outlooks .msg files 项目地址: https://gitcode.com/gh_mirrors/ms/msg-extractor 副标题:你是否还在为…...

PFC-FLAC3D耦合学习案例解析

pfc-flac3D耦合学习案例 !岩土工程师的桌面摆满了数值模拟手册 在边坡监测现场见到裂缝的那一刻,我突然意识到离散元与连续介质耦合不再是教科书里的概念——PFC的颗粒崩落和FLAC的应力云图必须握手言和。今天咱们用Python当翻译官,看看这对冤家怎么在滑…...

BilibiliDown:专业B站Hi-Res音频下载工具全攻略

BilibiliDown:专业B站Hi-Res音频下载工具全攻略 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bili…...

PFC5.03D三轴流固耦合仿真:压力卸除下的网格分析

PFC5.03D三轴泄围压条件下的流固耦合 带网格。在岩石力学的仿真中,PFC5.03D软件提供了一种有效的方式来模拟颗粒的流动和结构稳定性。三轴试验是岩石力学中最常用的测试方法之一,特别是当压力发生卸除时,材料的表现往往最能反映其本质特性。…...

如何用G-Helper智能恢复ROG笔记本色彩显示:终极解决方案

如何用G-Helper智能恢复ROG笔记本色彩显示:终极解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地…...

如何使用Audacity:免费音频编辑与录制全攻略

如何使用Audacity:免费音频编辑与录制全攻略 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity Audacity是一款免费开源的音频编辑与录制软件,支持多轨录音、音频剪辑、效果处理等专业功能&am…...

用快马平台十分钟搭建你的第一个zotero式文献管理web原型

今天想和大家分享一个超实用的开发经验:如何用InsCode(快马)平台快速搭建文献管理系统的web原型。作为一个经常需要整理论文的研究狗,zotero这类工具简直是刚需,但有时候我们想验证一些定制化功能的想法,从零开发又太耗时。下面我…...

手机越用越卡?Universal Android Debloater让Android设备重获新生

手机越用越卡?Universal Android Debloater让Android设备重获新生 【免费下载链接】universal-android-debloater Cross-platform GUI written in Rust using ADB to debloat non-rooted android devices. Improve your privacy, the security and battery life of …...

Charticulator:重构数据可视化创作范式的技术革命

Charticulator:重构数据可视化创作范式的技术革命 【免费下载链接】charticulator Interactive Layout-Aware Construction of Bespoke Charts 项目地址: https://gitcode.com/gh_mirrors/ch/charticulator 数据可视化正面临前所未有的创作困境——当业务需求…...

PDFMathTranslate深度解析:基于ONNX推理引擎的学术论文翻译技术评测

PDFMathTranslate深度解析:基于ONNX推理引擎的学术论文翻译技术评测 【免费下载链接】PDFMathTranslate PDF scientific paper translation with preserved formats - 基于 AI 完整保留排版的 PDF 文档全文双语翻译,支持 Google/DeepL/Ollama/OpenAI 等服…...

手把手教你用Gen6D制作个人数据集:从视频采集到6D姿态估计全流程

从零构建Gen6D个人数据集:6D姿态估计实战指南 引言:为什么需要自定义6D姿态数据集? 在计算机视觉领域,6D姿态估计(6D Pose Estimation)正成为增强现实、机器人抓取和自动驾驶等应用的核心技术。与传统的2D检测不同,6…...

OpenClaw主控Agent配置:任务分发、流程调度,打造专属SEO自动化团队

构建智能中枢:OpenClaw主控Agent的深度配置与SEO自动化团队实践引言在数字化营销日益激烈的今天,搜索引擎优化(SEO)已成为企业获取流量、提升品牌曝光不可或缺的策略。然而,传统的SEO操作往往涉及大量重复性、耗时耗力…...

别再自己憋大纲了!这4款AI写作工具能自动生成逻辑严密的论文框架

别再死磕大纲了!这 4 款 AI 工具能一键生成逻辑严密、贴合学术规范的论文框架,帮你快速搞定开题与写作第一步。一、PaperRed(国内论文首选,学术专属)核心定位:全流程学术写作,大纲 初稿一站式大…...

OpenClaw隐私保护方案:Qwen3-32B本地推理的医疗数据处理

OpenClaw隐私保护方案:Qwen3-32B本地推理的医疗数据处理 1. 为什么医疗数据需要本地化AI处理 去年参与一个医疗数据分析项目时,我首次意识到数据隐私的严峻性。客户提供的患者诊疗记录包含身份证号、住址和病史等敏感信息,而团队最初考虑使…...

查重降不下来?试试这4款AI改写软件,效果立竿见影

查重降不下来、AI 痕迹太重?这 4 款 AI 改写工具实测效果立竿见影,覆盖中文全能、全流程、免费文科、免费理工科四大场景,帮你快速把重复率压到合格线。1. PaperRed(中文双降王者,首选)核心定位&#xff1a…...

PyTorch版本冲突?手把手教你用conda解决torch和torchvision依赖问题(附常见错误排查)

PyTorch版本冲突?手把手教你用conda解决torch和torchvision依赖问题(附常见错误排查) 深度学习开发中,PyTorch环境的配置往往是项目启动的第一道门槛。许多开发者在安装torch和torchvision时都遇到过令人头疼的版本冲突问题——明…...

IC版图工程师的日常:用Magic/Cadence画版图时,那些图层到底对应FAB里的哪一步?

IC版图工程师的日常:揭秘Magic/Cadence图层与FAB工艺的映射关系 作为一名IC版图工程师,每天面对Magic或Cadence工具中那些五颜六色的图层时,你是否曾好奇过:这些抽象的几何图形最终如何在硅片上变成真实的晶体管结构?A…...

Speech Seaco Paraformer问题解决:识别不准?试试热词功能提升准确率

Speech Seaco Paraformer问题解决:识别不准?试试热词功能提升准确率 1. 语音识别不准的常见困扰 语音识别技术在日常工作和生活中应用越来越广泛,但很多用户在使用过程中都会遇到一个共同问题:识别结果不准确。特别是当录音内容…...

Jessibuca播放器在低代码平台中的集成实践:5分钟为你的应用添加实时视频能力

Jessibuca播放器在低代码平台中的集成实践:5分钟为你的应用添加实时视频能力 当企业需要快速构建内部管理系统或行业解决方案时,低代码平台正成为提升开发效率的利器。而视频能力作为现代应用的基础需求,如何在不编写复杂代码的情况下实现专业…...

晶体塑性损伤模型的魔改日常——手把手拆解应力更新核心

基于huang晶体塑性有限元损伤演化代码,包含应力更新,送inp文件. (包含损伤演化)(损伤后应力更新)最近在折腾Huang的晶体塑性框架,发现原版代码在损伤处理上还是太"干净"了。趁着周末撸了个损伤演化模块&…...

6个维度教你选择Mac Mouse Fix的最佳部署渠道

6个维度教你选择Mac Mouse Fix的最佳部署渠道 【免费下载链接】mac-mouse-fix Mac Mouse Fix - A simple way to make your mouse better. 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 副标题:开发者、普通用户与企业用户的技术选型指南…...

AI漫剧软件2025推荐,助力漫画创作高效产出

AI漫剧软件2025推荐,助力漫画创作高效产出在当今数字化时代,AI漫剧软件市场正蓬勃发展。据中国动漫协会《2025中国动漫产业发展报告》显示,2025年AI漫剧软件市场规模同比增长了45%,越来越多的创作者开始借助此类软件提升创作效率。…...

罗氏线圈COMSOL建模与电磁模拟仿真

罗氏线圈comsol建模,电磁模拟仿真罗氏线圈这玩意儿在电磁测量里算是老演员了,今天咱们用COMSOL给它整活建模。先别急着开软件,核心思路得理清楚——这空心环状结构本质上就是个积分器,靠的是交变磁场在环形路径上感应出的电动势。…...

从零到一:OpenClaw对接百川2-13B量化模型的完整调试日志

从零到一:OpenClaw对接百川2-13B量化模型的完整调试日志 1. 项目背景与动机 上周在测试本地大模型自动化任务时,发现OpenClaw默认对接的Qwen模型对长文本处理容易截断。正好看到星图平台上线了百川2-13B量化镜像,显存需求仅10GB左右&#x…...

无人机组装调试仿真教学软件技术解析(架构+功能+落地)| 产品实测

在无人机职业教育领域,仿真教学软件的核心价值是“还原实操场景、降低落地成本、提升教学效率”,但目前多数同类软件普遍存在架构冗余、3D交互卡顿、功能与教学场景脱节、后台管理薄弱等痛点,难以满足院校规模化、标准化的组装调试教学需求。…...

解决Windows任务栏视觉单调问题的3个实用工具:RoundedTB个性化方案

解决Windows任务栏视觉单调问题的3个实用工具:RoundedTB个性化方案 【免费下载链接】RoundedTB Add margins, rounded corners and segments to your taskbars! 项目地址: https://gitcode.com/gh_mirrors/ro/RoundedTB 每天面对电脑时,那块占据屏…...

OpenClaw数据可视化:Qwen3.5-4B-Claude分析并绘制图表

OpenClaw数据可视化:Qwen3.5-4B-Claude分析并绘制图表 1. 为什么需要AI辅助的数据可视化 作为一个经常需要处理数据的开发者,我过去常常陷入这样的困境:花几个小时清洗和分析数据后,却在最后一步——可视化呈现上卡壳。该用折线…...

如何在广告泛滥的时代找到纯粹的音乐净土?铜钟音乐的极简听歌方案

如何在广告泛滥的时代找到纯粹的音乐净土?铜钟音乐的极简听歌方案 【免费下载链接】tonzhon-music 铜钟 (Tonzhon.com): 免费听歌; 没有直播, 社交, 广告, 干扰; 简洁纯粹, 资源丰富, 体验独特!(密码重置功能已回归) 项目地址: https://gitcode.com/Gi…...