PySlowFast模型训练实操步骤及Python 实时摄像头动作识别代码示例
PySlowFast 是由 Meta (Facebook AI Research) 开源的、专注于视频行为识别的经典深度学习框架。由于其模型输入需要一个固定帧数的视频片段Video Clip因而在进行摄像头实时推理时我们需要通过队列Queue循环维护一个滑窗来缓存摄像头采集到的帧。下面为您梳理 PySlowFast 从模型训练到使用 Python 进行摄像头实时动作识别的完整闭环方案。一、 模型训练 (Model Training)PySlowFast 推荐使用其内置的命令行工具tools/run_net.py进行高效的多卡/单卡训练。在编写代码前需要准备好数据集如 Kinetics400 或自定义行为数据集并生成对应的train.csv和val.csv。1. 配置文件修改首先拷贝并修改官方的configs/Kinetics/SLOWFAST_8x8_R50.yaml配置文件TRAIN:ENABLE:TrueDATASET:kineticsBATCH_SIZE:8# 根据显存调整EVAL_PERIOD:10CHECKPOINT_PERIOD:1DATA:NUM_FRAMES:32# 采样帧数SAMPLING_RATE:2# 帧采样间隔PATH_TO_DATA_DIR:/path/to/your/annotations/# 存放 train.csv 的路径PATH_PREFIX:/path/to/your/videos/# 视频文件根目录MODEL:NUM_CLASSES:10# 替换为你的自定义动作类别数量NUM_GPUS:1OUTPUT_DIR:.# 权重文件保存目录2. 执行训练命令python tools/run_net.py--cfgpath/to/your_custom_slowfast.yaml训练结束后在OUTPUT_DIR下会生成形如checkpoints/checkpoint_epoch_00050.pyth的模型权重文件。二、 核心Python 实时摄像头动作识别代码以下是在 Python 脚本中调用训练好的 PySlowFast 模型并通过 OpenCV 读取摄像头或直播流进行滑动窗口预测的完整示例代码。注意事项由于 PySlowFast 自带的内部加载器对实时流不够灵活此代码使用PyTorchVideoPySlowFast 官方底层配套的轻量化库或纯torch方式来构造网络。importcollectionsimportcv2importnumpyasnpimporttorchfrompytorchvideo.modelsimportcreate_resnetfromtorchvision.transformsimportCompose,Lambdafromtorchvision.transforms._transforms_videoimportCenterCropVideo,NormalizeVideo# # 1. 配置参数与模型加载# DEVICEcudaiftorch.cuda.is_available()elsecpu# 这里的参数需要和训练时的 YAML 配置文件严格对齐NUM_FRAMES32# 模型的总输入帧数SAMPLING_RATE2# 采样步长每隔2帧取1帧REQUIRED_FRAMESNUM_FRAMES*SAMPLING_RATE# 缓存区总共需要容纳的帧数 (64帧)# 加载自定义模型结构 (以标准的 SlowFast ResNet50 为例)# 如果你使用的是原版 PySlowFast 权重建议使用 torch.hub 或通过 slowfast.models 构建defload_slowfast_model(checkpoint_path,num_classes10):# 这里通过 pytorchvideo 快速构建符合 SlowFast 架构的网络modeltorch.hub.load(facebookresearch/pytorchvideo,slowfast_r50,pretrainedFalse)# 修改最后的分类头以匹配你训练时的类别数model.blocks[6].projtorch.nn.Linear(model.blocks[6].proj.in_features,num_classes)# 加载训练好的权重checkpointtorch.load(checkpoint_path,map_locationDEVICE)ifmodel_stateincheckpoint:model.load_state_dict(checkpoint[model_state])else:model.load_state_dict(checkpoint)model.to(DEVICE)model.eval()returnmodel# 替换为你的权重路径和标签CHECKPOINT_PATHcheckpoints/checkpoint_epoch_00050.pythCLASS_NAMES[Label0,Label1,Label2,Label3,Label4,Label5,Label6,Label7,Label8,Label9]modelload_slowfast_model(CHECKPOINT_PATH,num_classeslen(CLASS_NAMES))# # 2. 图像预处理流水线# transformCompose([Lambda(lambdax:x/255.0),NormalizeVideo(mean[0.45,0.45,0.45],std[0.225,0.225,0.225]),CenterCropVideo(crop_size256)])defpack_pathway_output(cfg,frames): 将视频帧分割为 Slow 路径和 Fast 路径所需的输入格式 Slow 路径低帧率采样较少帧空间特征强 Fast 路径高帧率采样较多帧时间运动特征强 # frames 形状: [C, T, H, W]fast_pathwayframes# 根据采样比例抽取 Slow 路径对应的帧# 比如在 SlowFast 8x8 中Slow 采样率一般是 Fast 的 4 倍即每 4 帧取 1 帧slow_step4slow_pathwaytorch.index_select(frames,1,torch.linspace(0,frames.shape[1]-1,frames.shape[1]//slow_step).long().to(DEVICE),)return[slow_pathway,fast_pathway]# # 3. 摄像头实时视频流循环# capcv2.VideoCapture(0)# 0 代表本地自带摄像头也可以填入 RTSP 视频流地址frame_buffercollections.deque(maxlenREQUIRED_FRAMES)# 循环队列缓冲区print(开始实时动作识别按 q 退出...)current_predictionWaiting...withtorch.no_grad():whilecap.isOpened():ret,framecap.read()ifnotret:break# 1. 转换色彩空间并存入缓冲区rgb_framecv2.cvtColor(frame,cv2.COLOR_BGR2RGB)# 调整大小加快处理速度 (PySlowFast通常输入短边为256)resized_framecv2.resize(rgb_frame,(340,256))frame_buffer.append(resized_frame)# 2. 当缓冲区存满所需帧数时启动模型推理iflen(frame_buffer)REQUIRED_FRAMES:# 依采样步长从缓冲区中取帧实现稀疏采样sampled_frames[frame_buffer[i]foriinrange(0,REQUIRED_FRAMES,SAMPLING_RATE)]# 变换形状由 List 的 [H, W, C] 转换为 Tensor [C, T, H, W]video_tensortorch.from_numpy(np.array(sampled_frames)).permute(3,0,1,2).float().to(DEVICE)# 预处理 (归一化、裁剪)video_tensortransform(video_tensor)# 构建 SlowFast 双路径输入inputspack_pathway_output(None,video_tensor)# 增加 Batch 维度 [[1, C, T_slow, H, W], [1, C, T_fast, H, W]]inputs[x.unsqueeze(0)forxininputs]# 模型前向传播predsmodel(inputs)# 获取预测结果top1_val,top1_idxpreds.topk(1,dim1)probstorch.nn.functional.softmax(preds,dim1)confidenceprobs[0][top1_idx.item()].item()# 如果置信度高于阈值更新预测文本ifconfidence0.6:current_predictionf{CLASS_NAMES[top1_idx.item()]}({confidence:.2f})else:current_predictionBackground/Unknown# 3. 将预测结果实时渲染在画面上cv2.putText(frame,fAction:{current_prediction},(20,50),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2,cv2.LINE_AA)cv2.imshow(PySlowFast Real-time Action Recognition,frame)ifcv2.waitKey(1)0xFFord(q):breakcap.release()cv2.destroyAllWindows()三、 生产环境优化建议异步多线程 (Multi-threading)上面的示例是单线程的。在实际项目如服务器高帧率推流中cap.read()读取摄像头、缓冲区填充、与model(inputs)推理应当拆分到不同的线程中。否则由于深度学习模型前向传播的耗时会导致画面卡顿和网络延迟。硬件加速如果对实时性Latency要求极高建议将最终训练出来的 PyTorch.pyth权重转换为ONNX格式进而转为TensorRT(NVIDIA GPU) 或OpenVINO(Intel CPU) 进行边缘端部署帧率通常可提升数十倍。

相关新闻

AD7490与STM32F334R8高精度ADC硬件设计与优化

AD7490与STM32F334R8高精度ADC硬件设计与优化

1. AD7490与STM32F334R8的硬件协同设计AD7490是一款16位、1MSPS采样率的逐次逼近型(SAR)ADC芯片,而STM32F334R8则是ST公司搭载高速HRTIM和精密ADC模块的Cortex-M4微控制器。这对组合在工业传感器采集、医疗设备信号处理等场景中具有独特优势。1.1 芯片选型依据解析选…

2026/7/11 1:21:07 阅读更多 →
微信同声传译插件 3大核心API对比:语音识别、翻译、合成性能实测

微信同声传译插件 3大核心API对比:语音识别、翻译、合成性能实测

微信同声传译插件全能力评测:语音识别、翻译与合成的技术实践 在移动应用生态中,语音交互正逐渐成为提升用户体验的关键技术。微信同声传译插件作为微信生态内的AI能力集大成者,为开发者提供了从语音输入到多语言转换的一站式解决方案。本文将…

2026/7/11 1:19:07 阅读更多 →
K-Means vs DBSCAN vs 层次聚类:3大算法实战对比与5个选型决策点

K-Means vs DBSCAN vs 层次聚类:3大算法实战对比与5个选型决策点

K-Means vs DBSCAN vs 层次聚类:3大算法实战对比与5个选型决策点在数据科学项目中,聚类算法的选择往往决定了整个分析的有效性。面对K-Means、DBSCAN和层次聚类这三大主流算法,工程师们常常陷入选择困境。本文将带您深入理解每种算法的核心特…

2026/7/11 1:19:07 阅读更多 →

最新新闻

一文读懂光伏、储能,充电工作原理,是如何实现闭环的,其中微电网(ems)是什么;这个内容,就看懂了源网荷储。十五五规划里面最核心的能源管理内容

一文读懂光伏、储能,充电工作原理,是如何实现闭环的,其中微电网(ems)是什么;这个内容,就看懂了源网荷储。十五五规划里面最核心的能源管理内容

一、这套方案到底是做啥的? 一套三合一线上管理系统,专门管你手里的充电桩、太阳能板、储能大电池三件设备。 分三块功能:管充电做生意、自动省电少交电费、打包设备跟电网多赚一笔补贴。 所有软件、小程序所有权全是你自己的,云…

2026/7/11 2:37:33 阅读更多 →
2026年AI编程工具评测:索引机制与调试能力成核心分水岭

2026年AI编程工具评测:索引机制与调试能力成核心分水岭

1. 为什么2026年不能再只看“谁家模型参数大”——AI编程工具的本质已悄然迁移2026年,当“AI编程工具”这个词再次刷屏技术社区时,我注意到一个明显变化:讨论焦点正从“它用了多少B参数的模型”快速滑向“它能不能在我凌晨三点改完线上Bug后&…

2026/7/11 2:37:33 阅读更多 →
救命!2026年AI写作辅助软件排行榜,格式改到崩溃的应届生直接抄作业

救命!2026年AI写作辅助软件排行榜,格式改到崩溃的应届生直接抄作业

作为熬了 3 年论文、前后踩过十几款 AI 写作工具坑的老学长,今天直接给大家上硬货 ——2026 年 AI 写论文工具排行榜!结合《2025 论文写作工具白皮书》的用户实测数据,还有我从本科毕设到硕士小论文的全程使用体验,精选出 7 款真正…

2026/7/11 2:35:32 阅读更多 →
模电与数电接口设计:3种ADC/DAC关键电路与2个PCB布局要点

模电与数电接口设计:3种ADC/DAC关键电路与2个PCB布局要点

模电与数电接口设计:3种ADC/DAC关键电路与2个PCB布局要点 混合信号系统设计一直是硬件工程师面临的挑战之一。当模拟信号与数字信号在同一系统中共存时,如何确保信号完整性、降低噪声干扰成为设计成败的关键。本文将深入探讨模数转换(ADC)和数模转换(DAC…

2026/7/11 2:35:32 阅读更多 →
避开3大误区:网络安全毕设开题报告撰写与导师沟通实战策略

避开3大误区:网络安全毕设开题报告撰写与导师沟通实战策略

网络安全毕设开题避坑指南:从选题到导师沟通的实战策略每年毕业季,网络安全专业的学生们都会面临一个共同的挑战——如何顺利完成毕业设计开题。这个看似简单的环节,实则暗藏诸多陷阱。我曾亲眼目睹许多同学在开题阶段就栽了跟头,…

2026/7/11 2:35:32 阅读更多 →
Unity DOTS内存模型解析:NativeContainer生命周期管理与GC规避实战

Unity DOTS内存模型解析:NativeContainer生命周期管理与GC规避实战

1. 项目概述:为什么DOTS的内存模型如此重要?如果你在Unity里写过几年C#,大概率对GC(垃圾回收)带来的卡顿深恶痛绝。尤其是在移动平台或者需要稳定60FPS甚至更高帧率的游戏里,一个突如其来的GC峰值&#xff…

2026/7/11 2:31:32 阅读更多 →

日新闻

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

2026/7/11 0:02:12 阅读更多 →
PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

1. 项目背景与核心需求 在工业控制、安防系统和智能家居等领域,可靠的声音警报系统是不可或缺的基础组件。传统蜂鸣器存在音量不足、音质模糊等问题,而基于压电陶瓷技术的EPT-14A4005P蜂鸣器配合PIC18F45K42微控制器,能够构建一套适应性强、音…

2026/7/11 0:04:12 阅读更多 →
大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm Attention 的 CUDA Kernel 手写与验证 一、GPU 利用率 30%:分开的算子吃掉所有带宽 推理服务的 GPU 利用率监测显示一个反直觉的现象:计算核心(SM)利用率不到 30%,但…

2026/7/11 0:04:12 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/10 19:03:29 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻