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

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

最终效果如下:

相关推荐
Elastic 中国社区官方博客5 小时前
搜索倍增器:推动收入、生产力和 AI 实现规模化
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
wjkjpcba5 小时前
机器人控制板PCBA怎么加工?从SMT贴片到BGA焊接解析机器人电子制造工艺
大数据·人工智能
青 春 记 忆5 小时前
Dify Docker Compose 通用无损升级指南:从备份、双版本预演到切换与回滚
运维·人工智能·python·docker·容器
小猪妈咪爱学法5 小时前
欧盟最新发布《AI数字综合法案(Digital Omnibus‑on‑AI,AI综合修订法案)
人工智能·网络安全
ZGIAI5 小时前
ZGI Workflow 变量池:接住节点输出
人工智能·架构
梵构广告6 小时前
提升品牌识别度有哪些方法?
人工智能
ZGIAI6 小时前
ZGI 记忆隔离:多人共用不串号
人工智能·架构
星栈独行6 小时前
决定 Agent 交付下限的「操作系统」:Harness 六层架构拆解
人工智能·架构
AKAMAI7 小时前
实时可观测性:Akamai Cloud Pulse 警报功能正式发布
人工智能·云计算
Capricorn19887 小时前
解决全网抄 Karpathy 导致的 LLM Wiki 污染?基于知芽 Notebook Skill 的 raw/ 笔记法排障指南
大数据·论文阅读·人工智能·笔记·论文笔记