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

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

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

像素标准化过程:
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()
如果你在使用 scikit-learn 的 Pipeline 或 ColumnTransformer 时遇到了错误,提示你需要实现 transformers,那么你需要编写一个 transformer 类来处理你的数据。 在 scikit-learn 中,transformer 是一个实现了 fit 和 transform 方法的 Python 类。它可以用来对数据进行预处理、特征提取、降维等操作。通常情况下,你需要继承 BaseEstimator 和 TransformerMixin 这两个类,并实现 fit 和 transform 方法来创建一个 transformer 类。 例如,下面是一个用于对数据进行标准化transformer 类的示例代码: ```python from sklearn.base import BaseEstimator, TransformerMixin from sklearn.preprocessing import StandardScaler class MyStandardScaler(BaseEstimator, TransformerMixin): def __init__(self): self.scaler = StandardScaler() def fit(self, X, y=None): self.scaler.fit(X) return self def transform(self, X, y=None): return self.scaler.transform(X) ``` 这个类实现了 fit 和 transform 方法,它使用 sklearn.preprocessing 中的 StandardScaler 类来对数据进行标准化。在 fit 方法中,它使用训练数据来计算均值和标准差,并将其保存在 self.scaler 中;在 transform 方法中,它使用保存的均值和标准差来对数据进行标准化。 你可以根据你的需要编写自己的 transformer 类,以实现对数据的预处理、特征提取、降维等操作。然后将这个类作为 Pipeline 或 ColumnTransformer 的组件来使用,来处理你的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

diqiudq

人过留名,雁过留声。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值