一句话定义:图像归一化(Image Normalization,常写作 Mean/Std 标准化)是指在图片送进模型之前,对每个颜色通道减去一个固定的均值、再除以一个固定的标准差,把像素分布搬到“零均值、单位方差”附近的那一步预处理。
最常被抄来抄去的一组数字是 ImageNet 的统计量,按 RGB 顺序:均值 [0.485, 0.456, 0.406],标准差 [0.229, 0.224, 0.225]。它们是在 ImageNet 训练集上逐通道统计出来的,配套写法通常是先除以 255 把像素压到 0–1,再做减除:
```python
x = (x / 255 - mean) / std
```
打个比方:三个颜色通道就像三门科目的考卷,难度和给分尺度都不一样。直接加总分毫无意义,先换算成“标准分”(减平均分、除标准差),才谈得上比较。像素也一样:自然图像的绿色通道普遍偏亮、蓝色偏暗,不统一尺度,网络看到的输入就是三个脾气不同的信号。
不做会怎样:省掉这一步,人眼看图毫无差别,模型却会明显吃亏。用 ImageNet 预训练权重做迁移学习时尤其如此——权重是在特定输入分布上训出来的,你喂进去的分布整体偏移,它“认识”的东西就错位了,精度通常明显下降。具体幅度取决于模型、数据规模和训练轮数,没有放之四海皆准的数字,但方向一致:收敛变慢、对学习率更敏感、结果更不稳定。从头训练理论上能自己学出适应能力,实践中几乎没人省这一步。
和相邻概念的区别:
| 概念 | 作用位置 | 做什么 | 可学习参数 |
|---|---|---|---|
| 像素缩放 | 预处理 | 0–255 → 0–1 | 无 |
| 均值方差标准化 | 预处理 | 逐通道减均值、除标准差 | 无 |
| 批归一化 BatchNorm | 网络内部 | 用当前 batch 的统计量重新标准化激活值 | 有(γ、β) |
| 白化 Whitening | 预处理或层内 | 进一步去相关,让协方差接近单位阵 | 通常无 |
一句话记:前两个动的是数据,BatchNorm 动的是网络中间层,别混为一谈。
几个真会踩的坑:
1. 通道顺序。OpenCV 读进来是 BGR,PIL 是 RGB。顺序反了而均值方差没跟着换,等于拿错的尺子量,精度悄悄掉。
2. 尺度。忘了除 255 就直接减 0.485,标准化等于没做。
3. 训练与推理不一致。线上服务里漏掉这步,是典型的“离线指标好看、上线就崩”。
4. 用自己的数据。数据域和 ImageNet 差得远(医学影像、卫星图)时,建议在自己的训练集上重算均值和标准差;但只要用别人的预训练权重,就老老实实沿用对方配套的那组,以模型官方页面为准。
对从业者,这是预处理管线里最便宜也最容易被忽略的一行代码;对非技术的同事,可以这样解释:它不改图的内容,只把数据调成模型习惯的“音量”,让它听得清。
