You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

U2Net模型.pth转.onnx后性能下降,背景分割效果模糊

问题:U2Net转ONNX后分割Mask模糊失效

我要给网站添加汽车轮毂图像的背景移除功能,选用rembg库实现,该库依赖U2Net模型。标准U2Net只能移除轮毂外部背景,辐条、孔洞等内部区域无法处理,因此我对U2Net做了针对性微调。

微调后的.pth模型生成的黑白分割Mask完全符合需求,但将模型转换为rembg所需的.onnx格式后,生成的Mask变得模糊、边缘虚化。即使转换未微调的标准U2Net模型,结果同样模糊,背景分割功能失效,说明问题出在模型转换环节。

效果示例

生成Mask的命令

在U2Net中执行:

python3 u2net_test.py

在rembg中执行:

rembg i -om -m u2net_custom -x '{"model_path": "~/.u2net/u2net_custom.onnx"}' 55.jpg 55.png

尝试的两种模型转换方式

1. 转换已训练完成的模型

import torch
import torch.onnx
from model.u2net import U2NET

def load_model(model_path, model_class):
    checkpoint = torch.load(model_path, map_location='cpu')
    if isinstance(checkpoint, dict) and 'state_dict' in checkpoint:
        model = model_class()
        model.load_state_dict(checkpoint['state_dict'])
    else:
        model = model_class()
    model.eval()
    return model

def convert_to_onnx(model, output_path):
    dummy_input = torch.randn(1, 3, 320, 320)
    torch.onnx.export(model, dummy_input, output_path, opset_version=12,
                          dynamic_axes={'input': {0: 'batch_size', 2: 'height', 3: 'width'},
                                        'output': {0: 'batch_size', 2: 'height', 3: 'width'}})
    print(f"success {output_path}")

if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(description="conversion PyTorch to ONNX")
    parser.add_argument('--model-path', type=str, required=True, help='path to .pth file')
    parser.add_argument('--output-path', type=str, required=True, help='save ONNX file')

    args = parser.parse_args()
    model = load_model(args.model_path, U2NET)
    convert_to_onnx(model, args.output_path)

2. 训练过程中同步保存ONNX模型

if ite_num % save_frq == 0:
    timestamp = int(time.time())
    filePath = model_dir + model_name+"_%d_%d." % (ite_num, timestamp)

    torch.save(net.state_dict(), filePath + 'pth')

    dummy_input = torch.randn(1, 3, 320, 320)
    net.eval()
    torch.onnx.export(net, dummy_input, filePath + 'onnx', opset_version=12)

    running_loss = 0.0
    running_tar_loss = 0.0
    net.train()  # 恢复训练
    ite_num4val = 0

我尝试过调整转换设置、更换库版本、修改opset_version等方法,结果均一致:转换后的模型完全失效。请问问题出在哪里?


内容的提问来源于stack exchange,提问作者Yuriy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 06:06:00