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

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

最终效果如下:

相关推荐
个入资料5 小时前
阿里云ecs+飞书搭建openclaw
人工智能
孤烟6 小时前
【RAG 实战系列 02】检索精度翻倍!混合检索(稀疏 + 稠密)实战教程
人工智能·llm
明明如月学长7 小时前
OpenClaw 帮我睡后全自动完成了老板交代的任务
人工智能
uuware7 小时前
Lupine.Press + AI 助您分分钟搞定技术项目的文档网站
人工智能·前端框架
海上日出7 小时前
使用 QuantStats 进行投资组合绩效分析:Python 量化实战指南
人工智能
Qinana7 小时前
150行代码搞定私有知识库!Node.js + LangChain 打造最小化 RAG 系统全流程
人工智能·程序员·node.js
猿猿长成记7 小时前
AI专栏 | AI大法则之思维链、自洽性、思维树
人工智能
用户5191495848457 小时前
CrushFTP 条件竞争认证绕过漏洞利用工具 (CVE-2025-54309)
人工智能·aigc
一拳不是超人7 小时前
AI时代,35岁程序员焦虑终结:经验从负债变资产
人工智能·程序员
IT_陈寒8 小时前
Vite快得离谱?揭秘它比Webpack快10倍的5个核心原理
前端·人工智能·后端