PaddleSeg转换为ONNX后精度丢失改进方法

先前博主将PaddleSeg的语义分割模型转换为ONNX后,其结果发生了明显下降,经过分析,发现可能是其预处理过程中的meanstd值不太合理:

python 复制代码
def preprocess(image, size):
    h, w = image.shape[:2]
    resized = cv2.resize(image, size, interpolation=cv2.INTER_LINEAR)
    # 确保用 float32 计算
    resized = resized.astype(np.float32)
    mean = np.array([0.485, 0.456, 0.406], dtype=np.float32)
    std = np.array([0.229, 0.224, 0.225], dtype=np.float32)
    normalized = (resized / 255.0 - mean) / std
    input_tensor = normalized.transpose(2, 0, 1)[np.newaxis, ...].astype(np.float32)  
    return input_tensor, (h, w)

其中:

python 复制代码
mean = np.array([0.485, 0.456, 0.406], dtype=np.float32)
std = np.array([0.229, 0.224, 0.225], dtype=np.float32) 

是取自ImageNet数据集的值,相较于遥感数据集,其存在差异:

这里博主将其改为

python 复制代码
mean = np.array([0.5, 0.5, 0.5], dtype=np.float32)
std = np.array([0.5, 0.5, 0.5], dtype=np.float32)

其结果如下图所示,其结果好了很多:

但这个方法也并不完美,最好是我们在训练时便指定好meanstd,如下:

python 复制代码
- type: Normalize
      mean: [0.5, 0.5, 0.5]   # ← 显式写明
      std: [0.5, 0.5, 0.5]    # ← 显式写明

完整配置文件如下:

python 复制代码
batch_size: 8
iters: 10000

train_dataset:
  type: Dataset
  dataset_root: D:/BaiduNetdiskDownload/yaogan/output
  train_path: D:/BaiduNetdiskDownload/yaogan/output/train.txt
  num_classes: 4
  mode: train
  transforms:
    - type: ResizeStepScaling
      min_scale_factor: 0.5
      max_scale_factor: 2.0
      scale_step_size: 0.25
    - type: RandomPaddingCrop
      crop_size: [512, 512]
    - type: RandomHorizontalFlip
    - type: RandomDistort
      brightness_range: 0.5
      contrast_range: 0.5
      saturation_range: 0.5
    - type: Normalize
      mean: [ 0.5, 0.5, 0.5 ]
      std: [ 0.5, 0.5, 0.5 ]

val_dataset:
  type: Dataset
  dataset_root: D:/BaiduNetdiskDownload/yaogan/output
  val_path: D:/BaiduNetdiskDownload/yaogan/output/val.txt
  num_classes: 4
  mode: val
  transforms:
    - type: Normalize
      mean: [ 0.5, 0.5, 0.5 ]
      std: [ 0.5, 0.5, 0.5 ]

optimizer:
  type: SGD
  momentum: 0.9
  weight_decay: 4.0e-5

lr_scheduler:
  type: PolynomialDecay
  learning_rate: 0.01
  end_lr: 0
  power: 0.9

loss:
  types:
    - type: CrossEntropyLoss
  coef: [1, 1, 1]


model:
  type: PPLiteSeg
  backbone:
    type: STDC2
    pretrained: https://bj.bcebos.com/paddleseg/dygraph/PP_STDCNet2.tar.gz

这样,我们重新训练后,其结果就好很多了。

最终效果如下:

相关推荐
逸模3 小时前
告别熬夜手工整理台账,逸模智能归集实现项目数据自动化存档
大数据·运维·人工智能·笔记·其他·信息可视化·自动化
weixin_397574093 小时前
生产管理和设备管理:制造执行层的AI痛点
人工智能·制造
冬奇Lab4 小时前
Agent 系列(16):工具链设计——让 LLM 用对工具的五个原则
人工智能·llm·agent
冬奇Lab4 小时前
每日一个开源项目(第125篇):taste-skill - 给 AI 装上审美,让前端不再千篇一律
人工智能·开源·agent
Ajie'Blog4 小时前
Copilot Agent Tasks API 开放:AI 编程开始进入后台任务时代
服务器·前端·javascript·人工智能·copilot·ai编程
SEONIB_Explorer4 小时前
AI SEO 与传统SEO成本对比:哪种更划算?
人工智能
一次旅行4 小时前
AI领域每日资讯报告
人工智能
Python私教4 小时前
Cursor + Claude Code 全流程实战:搭一套生产级 AI 编程工作流(2026 最新版)
人工智能·语言模型·qwen·ollama·本地大模型·大模型部署·deepseek
来让爷抱一个4 小时前
MonkeyCode 的 Git 协作功能:团队开发新范式
人工智能·ai编程