代码测试过程中需要对输出图片做反标准化,相当于以新的均值和标准差对输出图片做标准化,所以只需计算新的均值和标准差即可。
像素标准化过程:
p
′
=
p
−
μ
σ
p'=\frac{p-\mu}{\sigma}
p′=σp−μ
反标准化过程:
p
=
σ
p
′
+
μ
=
σ
(
p
′
+
μ
σ
)
\begin{aligned} p&=\sigma p' + \mu \\ &=\sigma (p'+\frac{\mu}{\sigma}) \end{aligned}
p=σp′+μ=σ(p′+σμ)
得到:
{
σ
′
=
1
/
σ
μ
′
=
−
μ
σ
′
\left\{\begin{aligned} \sigma' &= 1/\sigma \\ \mu' &= -\mu \sigma' \end{aligned} \right.
{σ′μ′=1/σ=−μσ′
其中:
p
∈
[
0
,
1
]
p \in [0,1]
p∈[0,1]:原图中某像素值
μ
\mu
μ:原图像素所在通道均值
σ
\sigma
σ:原图像素所在通道标准差
p
′
∈
[
0
,
1
]
p' \in [0,1]
p′∈[0,1]:标准化后的像素值
μ
′
\mu'
μ′:用于反标准化的均值
σ
′
\sigma'
σ′:用于反标准化的标准差
from transformers.image_transforms import rescale, normalize
from transformers.image_utils import infer_channel_dimension_format
import numpy as np
from PIL import Image
# 用于标准化的均值和标准差
OPENAI_CLIP_MEAN = np.array([0.48145466, 0.4578275, 0.40821073])
OPENAI_CLIP_STD = np.array([0.26862954, 0.26130258, 0.27577711])
# 原图
image = Image.open('/home/ubuntun/图片/C20210508205013041.jpg')
image.show()
image = np.asarray(image)
input_data_format = infer_channel_dimension_format(image)
# 标准化
after_rescale = rescale(image=image, scale=1/255, input_data_format=input_data_format)
after_normalize = normalize(image=after_rescale, mean=OPENAI_CLIP_MEAN, std=OPENAI_CLIP_STD, input_data_format=input_data_format)
# 新的均值和标准差(关键部分)
DENORMALIZE_STD = 1 / OPENAI_CLIP_STD
DENORMALIZE_MEAN = - OPENAI_CLIP_MEAN * DENORMALIZE_STD
# 反标准化
after_denormalize = normalize(image=after_normalize, mean=DENORMALIZE_MEAN, std=DENORMALIZE_STD, input_data_format=input_data_format)
after_derescale = rescale(image=after_denormalize, scale=255, input_data_format=input_data_format)
# 反标准化后的图(可视化效果应该和原图相同)
image = Image.fromarray(after_derescale.astype(np.uint8))
image.show()
因篇幅问题不能全部显示,请点此查看更多更全内容