import torch
import torchvision
from torchvision import models


model = models.segmentation.deeplabv3_resnet101(pretrained=True)
model.eval()  # 必须切换到推理模式，关闭 dropout/batchnorm 等训练特有的层

# 2. 定义输入张量（需与模型期望的输入尺寸匹配，DeepLabv3通常为513x513）
input_tensor = torch.randn(1, 3, 513, 513)  # N=1, C=3, H=513, W=513（NCHW格式）

# 3. 导出ONNX模型
onnx_file = "../Resource/Models/deeplabv3_resnet101.onnx"
torch.onnx.export(
    model,                  # 待导出的模型
    input_tensor,           # 示例输入（用于确定计算图结构）
    onnx_file,              # 输出文件路径
    opset_version=12,       # ONNX算子集版本（建议≥11，支持更多算子）
    input_names=["input"], # 输入节点名称（需与后续推理时一致）
    output_names=["output"],# 输出节点名称
    dynamic_axes={          # 关键：指定 input 和 output 的批量维度（第 0 维）为动态
        "input": {0: "batch_size"},
        "output": {0: "batch_size"}
    },
)