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

将 PyTorch 训练出的 PySlowFast(.pyth)模型转换为 ONNX 格式

将 PyTorch 训练出的 PySlowFast(.pyth)模型转换为 ONNX 格式的关键在于:模型是双路径(Dual-Pathway)输入。因此,在导出 ONNX 时,我们需要构建一个包含两个 Tensor(Slow 路径和 Fast 路径)的元组作为 dummy input(虚拟输入)。

以下是完整的转换代码脚本:

importtorchimportnumpyasnp# 1. 定义与训练时完全一致的模型结构(以标准的 SlowFast R50 为例)defload_slowfast_model(checkpoint_path,num_classes=10):# 使用 pytorchvideo 快速构建符合 SlowFast 架构的网络model=torch.hub.load('facebookresearch/pytorchvideo','slowfast_r50',pretrained=False)# 修改分类头model.blocks[6].proj=torch.nn.Linear(model.blocks[6].proj.in_features,num_classes)# 加载权重checkpoint=torch.load(checkpoint_path,map_location="cpu")if"model_state"incheckpoint:model.load_state_dict(checkpoint["model_state"])else:model.load_state_dict(checkpoint)model.eval()returnmodel# 2. 初始化模型CHECKPOINT_PATH="checkpoints/checkpoint_epoch_00050.pyth"NUM_CLASSES=10# 替换为你的分类数model=load_slowfast_model(CHECKPOINT_PATH,num_classes=NUM_CLASSES)# 3. 构造虚拟输入 (Dummy Input)# 假设输入视频为 32 帧,采样率/结构对应:# Slow 路径: 4 帧, 尺寸 256x256 (BatchSize=1, 通道=3)# Fast 路径: 32 帧, 尺寸 256x256 (BatchSize=1, 通道=3)batch_size=1channels=3height,width=256,256dummy_slow_input=torch.randn(batch_size,channels,4,height,width)dummy_fast_input=torch.randn(batch_size,channels,32,height,width)# SlowFast 期望的输入是一个包含两个路经 Tensor 的列表或元组dummy_inputs=(dummy_slow_input,dummy_fast_input)# 4. 执行 ONNX 导出onnx_output_path="slowfast_model.onnx"print(f"正在转换模型并保存至:{onnx_output_path}...")torch.onnx.export(model,args=dummy_inputs,# 传入双路径虚拟输入f=onnx_output_path,# 输出的 ONNX 文件路径export_params=True,# 导出训练后的权重参数opset_version=12,# 建议使用 opset 11 或 12,对视频 3D 算子支持较好do_constant_folding=True,# 是否执行常量折叠优化input_names=['slow_input','fast_input'],# 指定输入节点的名称output_names=['output'],# 指定输出节点的名称dynamic_axes={# 支持动态 BatchSize(可选)'slow_input':{0:'batch_size'},'fast_input':{0:'batch_size'},'output':{0:'batch_size'}})print("ONNX 模型转换成功!")# 5. 验证 ONNX 模型有效性importonnx onnx_model=onnx.load(onnx_output_path)onnx.checker.check_model(onnx_model)print("ONNX 模型结构检查完毕,未发现异常。")

💡 关键踩坑与避雷指南

  1. 3D 算子不兼容问题
    SlowFast 内部大量使用了 3D 卷积(Conv3d)和 3D 池化(MaxPool3d)。部分旧版本的 ONNX Opset 对其支持不佳。如果导出报错,请尝试将opset_version提升至121314
  2. PyTorchVideo 依赖兼容性
    如果您在导出时遇到类似TracerWarning导致导出失败,可以尝试使用官方的原版 PySlowFast 代码库中的slowfast/models/build.py来构建model,而非pytorchvideo
  3. 推理时如何传参(以 ONNX Runtime 为例)
    在后续部署时,由于设置了两个输入节点,你需要将处理好的 Slow 路径和 Fast 路径 Tensor 分别作为字典的 Key 传给推理器:
importonnxruntimeasort ort_session=ort.InferenceSession("slowfast_model.onnx")# 准备好你的两个经过预处理的 numpy 数组outputs=ort_session.run(["output"],{"slow_input":slow_tensor_np,"fast_input":fast_tensor_np})
http://www.jsqmd.com/news/1164346/

相关文章:

  • ROS 2 Humble vs Noetic:树莓派4B性能实测与5个关键选型建议
  • 系统规划与管理师-数据标准化与数据管理(占 6-8 分)
  • 数字电路信号上下拉配置原理与工程实践
  • Linux 账户安全校验:pwck 命令详解,一键检测 passwd 与 shadow 完整性
  • 大模型推理服务的延迟优化与成本控制策略
  • 【面试算法笔记】0101-数组-二分查找 相关
  • NTN全局控制器集中管理的优势
  • 2026年宁波刑事律师推荐怎么选?看这三点关键不踩雷 - 本地品牌推荐
  • FL Studio Producer Edition 26.1.0 Build 5530 全插件版新功能介绍
  • machine 一般公差、未注公差的线性和角度尺寸的公差(GB/T1804-2000)
  • 2026国内最受机构欢迎的教务管理系统是哪个品牌,看看适不适合你
  • ADB 无线调试实战:Android 11+ 免USB配对与多设备并发连接(3步完成)
  • Meta Muse Image:AI图像生成工具在社交场景的应用与实操指南
  • 2026年7月最新烟台浪琴官方售后服务网点地址及客服电话一览 - 浪琴官方售后服务中心
  • 2026年宁波离婚律师推荐指南:从财产分割到抚养权全程 - 本地品牌推荐
  • 层次聚类算法复杂度分析:从 O(n³) 到 O(n² log n) 的3种优化策略
  • K-Means vs DBSCAN vs 层次聚类:3大算法实战对比与5个选型决策点
  • OpenCode + Ollama 本地智能编程实战指南
  • 2026主流业务数据报表工具对比测评|企业个人工具选型参考
  • ip2region 3.17.0 版本更新:新增多项功能,开源数据大升级!
  • LlamaIndex:RAG工程化中的数据框架与索引架构解析
  • 直流有刷电机驱动设计与STM32控制实现
  • AD7490与STM32F334R8高精度ADC硬件设计与优化
  • 亲身到店探访杭州亨得利官方名表服务中心|服务热线及全部维修详细地址(2026年7月更新) - 亨得利官方
  • 快速入门openEuler LFS实践:5个核心脚本详解与实战
  • 传统监控升级AI方案公司推荐|AI视频监控定制公司哪家靠谱?2026优质传统监控升级AI方案与AI视频监控定制服务商盘点 - 栗子测评
  • 学历证书制作流程藏着多少灰色地带?4个关键问题说清楚
  • Cocos Creator游戏微信小游戏移植实战:从源码适配到性能优化
  • Vue3 模板引用实战:useTemplateRef 与 ref 的 3 种 DOM 操作模式
  • 微信同声传译插件 3大核心API对比:语音识别、翻译、合成性能实测