IDM-VTON 中的 Detectron2 模型部署导出指南:TorchScript / ONNX / Caffe2 转换全解析

发布时间:2026/10/3 8:30:17

IDM-VTON 中的 Detectron2 模型部署导出指南:TorchScript / ONNX / Caffe2 转换全解析 计算机视觉深度学习媒体生成【免费下载链接】IDM-VTON[ECCV2024] IDM-VTON : Improving Diffusion Models for Authentic Virtual Try-on in the Wild项目地址https://gitcode.com/GitHub_Trending/id/IDM-VTON点击查看免费下载导读本指南围绕 gradio_demo/detectron2/export/README.md 展开系统讲解 IDM-VTON 仓库内嵌的 detectron2 部署工具链如何将训练好的检测/分割模型转换为 TorchScript、ONNX 与已弃用的Caffe2 三种可部署格式。读完你将掌握导出 API 的完整调用链Caffe2Tracer→Caffe2Model、Caffe2 兼容模型的底层改写机制、TorchScript 脚本化Instances对象的特殊处理以及模型校验、持久化与可视化排错的具体方法——这套能力对任何需要把 PyTorch 视觉模型送入生产推理引擎TorchScript Runtime、ONNX Runtime、Caffe2的工程实践都直接可复用。1. 该模块在整个项目中的位置IDM-VTON 是一个虚拟试穿Virtual Try-on项目其gradio_demo目录内置了一个完整的 detectron2 及其 DensePose 扩展gradio_demo/densepose用于人体解析、DensePose 姿态估计等前置任务。export子目录gradio_demo/detectron2/export正是 detectron2 官方“模型部署导出”代码的嵌入式副本它的职责非常单一且明确把训练/推理用的 PyTorch 模型改写成可被工业推理引擎直接加载的序列化模型。原文档给出的定位如下该目录包含一套将 detectron2 模型“准备用于部署”的代码目前支持导出为TorchScript、ONNX与已弃用Caffe2三种格式其使用方式指向外部部署文档本文以仓库内源码为准不再依赖外部链接。从源码结构看gradio_demo/detectron2/export 由十个左右的模块组成它们共同构成“重写模型 → 追踪/脚本化 → 导出 → 校验/可视化”的完整流水线模块职责api.py对外的统一入口Caffe2Tracer与Caffe2Modelcaffe2_modeling.py把 detectron2 meta-arch 改写成“可被 Caffe2 追踪”的版本caffe2_export.py导出 ONNX、Caffe2 protobuf以及图可视化shared.py共享工具设备推断、图优化、protobuf 参数读写caffe2_inference.py用 Caffe2 运行时模拟 detectron2 推理接口c10.pyRPN / ROIPooler / 检测头等组件的 Caffe2 算子实现torchscript.pyTorchScript 脚本化辅助与 IR 导出torchscript_patch.py对不可脚本化类Instances等的动态补丁flatten.py富结构输入/输出的张量化Schema 机制caffe2_patch.py递归替换模型中特定组件为 Caffe2 兼容类2. 三种导出格式的取舍TorchScript / ONNX / Caffe2原文档声明了三种目标格式源码则进一步揭示了各自的实现深度与适用场景。2.1 TorchScript最贴近 PyTorch 生态的导出路径TorchScript 导出通过Caffe2Tracer.export_torchscript()触发api.py其核心只有一步with torch.no_grad(): return torch.jit.trace(self.traceable_model, (self.traceable_inputs,))即对“Caffe2 兼容版模型”做一次trace得到torch.jit.TracedModule可进一步调用.save()落盘。注意这里使用的是trace而非script因为检测模型的输出中包含Instances等动态结构直接脚本化困难。当模型以script方式导出时torchscript.py 提供了专门的辅助函数scripting_with_instances(model, fields)它会在脚本化前创建一个属性全部“静态化”的new_Instances类并强制编译期编译器在遇到Instances时使用它脚本化完成后自动还原进程状态。调用示例fields {proposal_boxes: Boxes, objectness_logits: torch.Tensor} torchscript_model scripting_with_instances(model, fields)注意其前置约束——只支持evaluation mode下的模型源码中以assert not model.training强制校验。scripting_with_instances的底层依赖 torchscript_patch.py 中的动态补丁patch_instances(fields)在临时目录中生成一个静态字段的脚本化Instances子类模块通过_clear_jit_cache()清空 JIT 编译缓存后注册到 TorchScript 编译器并支持__len__、to、__getitem__、cat、get_fields等常用方法freeze_training_mode(model)把各子模块的training属性标注为torch.jit.Final[bool]常量让训练分支代码在脚本编译时被“元编译”裁剪掉patch_nonscriptable_classes()为ResNet、FPN注入__prepare_scriptable__将其内部nn.Sequential替换为nn.ModuleList规避 PyTorch 已知的脚本化缺陷并把StandardROIHeads的mask_on/keypoint_on标注为常量。此外dump_torchscript_IR(model, dir)会把 TracedModule / ScriptModule 的代码与 IR 输出到目录用于调试导出后的图结构产出model_ts_code.txt、model_ts_IR.txt、model_ts_IR_inlined.txt、model.txt四个排错文件。2.2 ONNX经 Caffe2 兼容模型导出ONNX 导出路径在 caffe2_export.py 的export_onnx_model中实现torch.onnx.export( model, inputs, f, operator_export_typeOperatorExportTypes.ONNX_ATEN_FALLBACK, )几个值得注意的实现事实导出前会递归断言所有模块都处于eval模式model.apply(_check_eval)避免训练/推理状态不一致导致 ONNX 图错误采用ONNX_ATEN_FALLBACK算子导出类型允许某些无法标准化的 PyTorch 算子以ATen形式落入 ONNX 图中api.py 的export_onnx()文档明确警告经此路径导出的 ONNX 模型含 Caffe2 专属自定义算子无法被 onnxruntime 或 TensorRT 直接执行如需对接这些运行时需要额外的后处理/变换 pass而本项目并不提供。因此从源码可以推断当前仓库中 ONNX 是通往 Caffe2 的中间表示见下文 2.3而非面向通用 ONNX Runtime 的最终产物。2.3 Caffe2经 ONNX 中转的完整导出链路已弃用Caffe2 导出的完整链路如下对应 caffe2_export.py 的export_caffe2_detection_model深拷贝模型并断言其具备encode_additional_info方法Caffe2 兼容 meta-arch 的标志先走 ONNX 导出export_onnx_model日志明确提示“ONNX 的一些警告是预期的通常无需担心”用Caffe2Backend.onnx_graph_to_caffe2_net(onnx_model)把 ONNX 图转为 Caffe2 的init_net与predict_net两个 protobuf依次执行图优化 passfuse_alias_placeholder移除追踪期插入的AliasWithName占位算子GPU 输入时执行fuse_copy_between_cpu_and_gpu合并多余的 CPU/GPU 拷贝算子、remove_dead_end_ops、_assign_device_option为每个算子标注设备选项remove_reshape_for_fcCaffe2 的 FC 算子原生支持 4D 张量因此可移除 ONNX 导出时为nn.Linear插入的动态 Reshape 子图group_norm_replace_aten_with_caffe2把 ONNX 图中的ATen group_norm原位替换为 Caffe2 的GroupNorm算子调用model.encode_additional_info(predict_net, init_net)把推理所需的元信息如size_divisibility、device、meta_architecture写入 protobuf 参数输出每个网络的算子统计表便于人工审查导出质量。export_caffe2_detection_model返回(predict_net, init_net)交给Caffe2Model包装后即可在 PyTorch 侧以“假 nn.Module”的形式驱动见第 4 节。3. 核心导出入口Caffe2Tracer 与 Caffe2Modelapi.py 定义了两个对外核心类也是原文档所述“部署准备”能力的最直接体现。3.1 Caffe2Tracer构造可追踪的 Caffe2 兼容模型Caffe2Tracer.__init__做三件事校验cfg必须是CfgNode、模型必须是torch.nn.Module根据cfg.MODEL.META_ARCHITECTURE从META_ARCH_CAFFE2_EXPORT_TYPE_MAP查表用深拷贝的原始模型构造对应的 Caffe2 兼容 meta-arch通过get_caffe2_inputs(inputs)把 PyTorch 风格的输入转换为 Caffe2 风格的两个张量。其导出后的计算图固定接收两个输入张量docstring 明确给出data(1, C, H, W)的 float 图像取值通常在[0, 255](H, W)通常需按模型结构补齐到 32 的倍数im_infoN×3的 float 张量每行为(height, width, 1.0)其中 height/width 是补齐前的真实图像尺寸。同时Caffe2Tracer只支持内建的 meta-arch源码META_ARCH_CAFFE2_EXPORT_TYPE_MAP目前只有GeneralizedRCNN与RetinaNet两项且不支持 batch 推理代码注释中欢迎社区贡献。3.2 Caffe2Modelprotobuf 模型的 PyTorch 风格包装Caffe2Model是一个包裹 Caffe2 protobuf 的nn.Module始终处于eval模式提供以下方法save_protobuf(output_dir)落盘三个文件——model.pb图定义、model_init.pb模型参数、model.pbtxt人类可读的图定义部署时不需要load_protobuf(dir)从model.pbmodel_init.pb反向加载save_graph(output_file, inputsNone)把网络导出为 SVG 图若提供输入则会实际运行网络并记录每个 blob 的 shape把 shape 信息一起画进图里用于可视化排错__call__(inputs)通过ProtobufDetectionModel模拟 detectron2 模型的输入/输出格式方便与原始 Torch 模型逐项对比结果caffe2_inference.py。代码注释还提示__call__因为包含 PyTorch/Caffe2 间的额外转换不适合用来做性能基准测试——它服务于正确性校验而非性能测量。4. Caffe2 兼容模型的底层改写机制Caffe2 导出能成立前提是先把原始模型“翻译”成只含 Caffe2 算子的版本。这条链路由三个文件协同完成。4.1 Caffe2 兼容 meta-arch 基类caffe2_modeling.py 定义了Caffe2MetaArch基类其关键设计是forward必须“可追踪、且只用 Caffe2 兼容算子”这样被 trace 的图才能转换成 Caffe2 图。它还把输入预处理归一化、按size_divisibility批量补齐收敛到统一的_caffe2_preprocess_image并将pixel_mean/pixel_std归一化直接编入图中图输入即为未归一化的data。典型实现是Caffe2GeneralizedRCNN它的 trace forward 依次执行预处理 → backbone 提特征 → proposal 生成 → ROI heads 推理 →tuple(detector_results[0].flatten())扁平化输出。与此同时patch_generalized_rcnncaffe2_patch.py递归地把模型里的rpn.RPN换成Caffe2RPN、poolers.ROIPooler换成Caffe2ROIPoolerROIHeadsPatcher会把 Fast R-CNN / Mask R-CNN / Keypoint R-CNN 的推理函数 mock 成 Caffe2 版分别对应Caffe2FastRCNNOutputsInference、Caffe2MaskRCNNInference、Caffe2KeypointRCNNInference并受配置项EXPORT_CAFFE2.USE_HEATMAP_MAX_KEYPOINT控制是否输出稀疏关键点。encode_additional_info会把size_divisibility、device、meta_architecture等元信息写进 protobuf供后续推理时读取。4.2 算子级 Caffe2 实现c10.py 提供了检测流水线关键环节的 Caffe2 算子实现例如Caffe2RPN._generate_proposals使用torch.ops._caffe2.GenerateProposals/CollectRpnProposals完成多尺度 RPN 提案合并并在pre_nms_topk/post_nms_topk/nms_thresh/min_size等参数上与 detectron2 对齐Caffe2ROIPooler.forward在 FPN 多级场景下用DistributeFpnProposals 各级RoIAlignBatchPermutation还原原始顺序caffe2_fast_rcnn_outputs_inference用BBoxTransformBoxWithNMSLimit完成检测头推理与 NMS 后处理其 softmax/sigmoid 分类分支、旋转框RotatedBoxes分支都做了兼容处理。由此可以推断Caffe2 导出并不等于“全图展开成简单算子”而是尽量把高层的 RPN、NMS、RoIAlign 等逻辑映射到 Caffe2 原生复合算子从而保证执行效率与语义一致。4.3 共享图工具protobuf 读写与设备推断shared.py 是整个 export 模块的“工具箱”涵盖protobuf 参数读写get_pb_arg_valf/get_pb_arg_vali/get_pb_arg_vals/get_pb_arg_floats及写入用的check_set_pb_arg支持 float/int/string/floats 等参数类型设备类型静态推断infer_device_type基于 SSA 形式前后向传播已知 blobs 的 CPU/GPU 状态并通过CopyCPUToGPU/CopyGPUToCPU的更新规则处理跨设备拷贝算子/参数图变换fuse_alias_placeholder、rename_op_input/output、remove_reshape_for_fc、fuse_copy_between_cpu_and_gpu等图导出与可视化save_graph通过 pydot 生成 PNG/PDF/SVG可带 blob shape 标注workspace 管理ScopedWS上下文管理器隔离 Caffe2 工作空间避免不同模型实例相互污染。5. 富结构输入/输出如何被“张量化”Schema 与 TracingAdapterdetectron2 的模型输入是list[dict]每张图一个 dict含image等字段输出是Instances等富结构对象而torch.jit.trace只接受/产生张量元组。这一矛盾由 flatten.py 解决Schema.flatten(obj)把任意对象压平成张量元组同时记录一张“重建蓝图”可序列化的 dataclass随后用schema(flattened_values)即可还原原对象支持的 schema 类型覆盖IdentitySchema、ListSchema、TupleSchema、DictSchema、InstancesSchema、TensorWrapSchema用于Boxes、RotatedBoxes、ROIMasks等张量包装类TracingAdapter是连接“富接口模型”与“trace 接口”的适配器它负责把输入压平、在no_grad与patch_builtin_len()把内置len替换为__len__避免追踪期生成 ONNX 常量下执行推理再压平输出并缓存outputs_schema。有了它任何 detectron2 模型都能被torch.jit.trace并能通过 schema 把扁平输出还原为原始结构用于比对。TracingAdapter还支持allow_non_tensorTrue的宽松模式此时仅保留张量用于追踪、丢弃 schema 重建能力适合只关心单次执行图例如 FLOP 统计的场景。6. 校验、持久化与可视化排错6.1 导出结果与原模型的正确性对比Caffe2Model.__call__的设计初衷之一就是与原始 Torch 模型逐项比对输出。文档注释给出了最小用法c2_model Caffe2Tracer(cfg, torch_model, inputs).export_caffe2() inputs [{image: img_tensor_CHW}] outputs c2_model(inputs) orig_outputs torch_model(inputs)其背后由 caffe2_inference.py 的ProtobufDetectionModel支撑它包装ProtobufModel运行 Caffe2 网络从 protobuf 参数中读取size_divisibility、device、meta_architecture再通过对应 meta-arch 的get_outputs_converter把 Caffe2 的扁平输出还原成 detectron2 标准格式list[Instances]。6.2 protobuf 落盘与加载部署时只需三个文件的model.pbmodel_init.pbmodel.pbtxt供人工阅读。加载方Caffe2Model.load_protobuf(dir)要求目录中包含这两个二进制文件并从它们反序列化出网络定义与参数。6.3 图可视化save_graph支持 SVG/PNG/PDF 输出run_and_save_graphcaffe2_export.py则会在给定输入上实际运行init_netpredict_net收集每个 numpy blob 的 shape连同算子依赖关系一起渲染到图中是排查“算子缺失 / 尺寸不匹配”类导出问题的高效手段。若网络运行中途抛错该函数会捕获RuntimeError并以 warning 记录仍继续保存已有的 blob shape 信息。7. 在 IDM-VTON 中实践导出适用前提与限制结合仓库实际情况本模块的使用存在以下必须知晓的前提与限制支持范围META_ARCH_CAFFE2_EXPORT_TYPE_MAP仅覆盖GeneralizedRCNN与RetinaNet两种内建 meta-arch见 caffe2_modeling.py自定义结构需自行扩展导出要求追踪输入能产生有效检测结果源码断言“没有检测结果的追踪会导致错误 trace”。Caffe2 已弃用原文档明确标注 Caffe2 为 deprecatedONNX 导出产物含 Caffe2 专属算子不能直接被 onnxruntime / TensorRT 运行。实际可无缝落地的是 TorchScript 路径Caffe2Tracer.export_torchscript().save()或 Caffe2 生态自身。单图推理Caffe2Tracer不支持 batch 推理追踪图以(data, im_info)两个固定张量为输入图像需按 backbone 的size_divisibility补齐常见为 32 的倍数。部分算子仅有 CPU 实现源码 docstring 指出 Caffe2 中部分算子没有 GPU 实现跨设备部署前需核对该问题。读者可继续阅读仓库中的以下文件深入研习统一入口 api.py、导出流水线 caffe2_export.py、兼容模型构造 caffe2_modeling.py、算子级实现 c10.py、共享工具 shared.py以及脚本化辅助 torchscript.py 与 torchscript_patch.py。赞分享计算机视觉深度学习媒体生成【免费下载链接】IDM-VTON[ECCV2024] IDM-VTON : Improving Diffusion Models for Authentic Virtual Try-on in the Wild项目地址https://gitcode.com/GitHub_Trending/id/IDM-VTON点击查看免费下载相关推荐Detectron2 模型部署导出指南TorchScript / ONNX / Caffe2 的完整导出方案Detectron2 模型部署导出指南TorchScript / ONNX / Caffe2 的完整导出方案 本指南基于 Detectron2 仓库中的 de人工智能计算机视觉深度学习机器学习IDM-VTON 人体解析预处理中的 detectron2 模型部署导出基于 ONNX 的 Caffe2 格式转换实践指南IDM VTON 人体解析预处理中的 detectron2 模型部署导出基于 ONNX 的 Caffe2 格式转换实践指南 在 IDM VTONECCV 2计算机视觉深度学习媒体生成Meteor accounts-facebook 包实战指南在 Meteor 3 应用中集成 Facebook OAuth 登录Meteor accounts facebook 包实战指南在 Meteor 3 应用中集成 Facebook OAuth 登录 accounts faceb人工智能大模型媒体生成本地部署深度学习上一篇Ninja从入门到上手5分钟安装并编译你的第一个项目快速开始完整教程下一篇seaborn 声明式绘图接口 Plot 全解从 autosummary 模板到源码级方法体系与 Plot.config 配置机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/3 9:30:22

AM32电调源码深度解析:FOC算法与ARM实时控制实战

1. 项目概述:为什么AM32电调值得“吃透”?AM32不是某个厂商的型号代号,而是指基于ARM Cortex-M32内核(实际为Cortex-M3/M4/M7系列中面向高实时电机控制优化的衍生架构)构建的一类高性能无刷电调软硬件平台。它早已超越…

2026/10/3 9:30:22

梯级水光互补系统短期优化调度的Python复现实战与避坑指南

做电力系统调度优化的朋友,应该没少看到“梯级水光互补”这个题目。EI期刊上相关论文一大把,题目往往写着“最大化可消纳电量期望”,但真正动手复现时,你会发现想要把数学公式变成能跑的Python代码,并且得到一张合理的…

2026/10/3 9:30:22

Python数据分析全栈:Pandas+NumPy+Matplotlib实战指南

对于刚接触数据分析的朋友来说,最容易陷入的困境不是“不知道学什么”,而是“学了一堆零散的API,却不知道如何串成一条完整的实战链路”。市面上的教程要么单讲一个库,要么直接甩给你一个高深莫测的项目,中间缺了“如何…

2026/10/3 9:30:22

基于微信生态的学生知识成果展示与交流平台搭建实践

1. 为什么学生知识成果展示与交流平台值得专门搭建先说个我观察了很久的现象:学生平时在作业本、项目报告、比赛作品里产出了大量成果,但这些成果多半只在交作业那一刻被老师看见,随后就被塞进文件夹、网盘、抽屉里,再也没有"…

2026/10/3 9:25:22

用命令行管理虚拟机:从VBoxManage到virsh的实践指南

1. 为什么最终要把虚拟机操作搬进终端这两年我管理虚拟机的方式,已经从图形界面迁移到了命令行工具。三十多台虚拟机散落在几台没有显示器的宿主机上,日常操作不是敲命令,就是写脚本让任务自己跑。如果你也遇到过这种场景:批量创建…

2026/10/2 8:16:46

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/10/2 18:20:53

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 10:48:55

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 0:04:31

国内大学生必备的AI写作辅助软件是哪款?

国内高校学生在论文写作过程中,越来越依赖AI辅助工具提升效率,主流方案以本土化全流程工具为核心,结合通用大模型与专业插件,覆盖选题构思、框架搭建、初稿撰写、查重降重、格式调整等关键环节,本文将深入解析当前主流…

2026/10/3 0:04:31

Codex接入Jev模型完整指南:配置方法、本地部署与踩坑排查

最近不少人在讨论 Codex 搭配 Jev 这套玩法,我一开始没太当回事,直到自己把 Jev 接进 Codex跑了几轮编码任务之后,才明白那些说“直接起飞”的人是怎么想的。Codex 作为工具本身已经够能打了,但模型固定、上下文策略固定&#xff…

2026/10/3 0:04:31

GitHub 热门: NVIDIA/Model-Optimizer

👋 Hi,我擅长 AI 大模型应用落地、意识解码与 AI 开发工具链 。 💡 创业路上,用技术换时间,一起把 AI 变成生产力 🚀 >GitHub 热门: NVIDIA/Model-Optimizer 凌晨两点,你刚把跑通了的 Qwen3.…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑