您提到的解决方法似乎没问题。但使用for...loop
计算标准化为each RGB通道为单幅图像当您处理数据管道中的大型数据集时可能会有点问题(generator
or tf.data
)。但无论如何都没关系。这是您的方法的演示,稍后我们将提供两种可能适合您的替代方案。
from PIL import Image
from matplotlib.pyplot import imshow, subplot, title, hist
# load image (RGB)
img = Image.open('/content/9.jpg')
def normalize_image(image, mean, std):
for channel in range(3):
image[:,:,channel] = (image[:,:,channel] - mean[channel]) / std[channel]
return image
OP_approach = normalize_image(np.array(img) / 255.0,
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
现在,让我们观察一下变换属性。
plt.figure(figsize=(25,10))
subplot(121); imshow(OP_approach); title(f'Normalized Image \n min-px: \
{OP_approach.min()} \n max-pix: {OP_approach.max()}')
subplot(122); hist(OP_approach.ravel(), bins=50, density=True); \
title('Histogram - pixel distribution')
归一化后最小和最大像素的范围是(-2.1179039301310043
, 2.6399999999999997
) 分别。
Option 2
我们可以使用tf。 keras...标准化 https://www.tensorflow.org/api_docs/python/tf/keras/layers/experimental/preprocessing/Normalization预处理层做同样的事情。它需要两个重要的论点,它们是mean
and, variance
(的平方std
).
from tensorflow.keras.experimental.preprocessing import Normalization
input_data = np.array(img)/255
layer = Normalization(mean=[0.485, 0.456, 0.406],
variance=[np.square(0.299),
np.square(0.224),
np.square(0.225)])
plt.figure(figsize=(25,10))
subplot(121); imshow(layer(input_data).numpy()); title(f'Normalized Image \n min-px: \
{layer(input_data).numpy().min()} \n max-pix: {layer(input_data).numpy().max()}')
subplot(122); hist(layer(input_data).numpy().ravel(), bins=50, density=True);\
title('Histogram - pixel distribution')
归一化后最小和最大像素的范围是(-2.0357144
, 2.64
) 分别。
Option 3
这更像是减去平均值mean
并除以平均值std
.
norm_img = ((tf.cast(np.array(img), tf.float32) / 255.0) - 0.449) / 0.226
plt.figure(figsize=(25,10))
subplot(121); imshow(norm_img.numpy()); title(f'Normalized Image \n min-px: \
{norm_img.numpy().min()} \n max-pix: {norm_img.numpy().max()}')
subplot(122); hist(norm_img.numpy().ravel(), bins=50, density=True); \
title('Histogram - pixel distribution')
归一化后最小和最大像素的范围是(-1.9867257
, 2.4380531
) 分别。最后,如果我们比较pytorch
方式,这些方法之间没有太大区别。
import torchvision.transforms as transforms
transform_norm = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]),
])
norm_pt = transform_norm(img)
plt.figure(figsize=(25,10))
subplot(121); imshow(np.array(norm_pt).transpose(1, 2, 0));\
title(f'Normalized Image \n min-px: \
{np.array(norm_pt).min()} \n max-pix: {np.array(norm_pt).max()}')
subplot(122); hist(np.array(norm_pt).ravel(), bins=50, density=True); \
title('Histogram - pixel distribution')
归一化后最小和最大像素的范围是(-2.117904
, 2.64
) 分别。