搜索
您的当前位置:首页正文

对图片做反标准化(python的transformers库实现)

来源:爱go旅游网

代码测试过程中需要对输出图片做反标准化,相当于以新的均值和标准差对输出图片做标准化,所以只需计算新的均值和标准差即可。

关键步骤:计算新的均值和标准差

像素标准化过程:
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' σ:用于反标准化的标准差

Python代码:
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()

因篇幅问题不能全部显示,请点此查看更多更全内容

Top