当前位置:   article > 正文

PyTorch如何标准化图片数据?如何计算全局标准差以及均值_python计算图像的均值、标准差

python计算图像的均值、标准差

MNIST数据集为例子,由于该数据集是1channel的,所以以下代码可能不具有泛用性,但是核心部分是一致的

方法1:

stackoverflow上有以下代码:

  1. from torchvision.datasets import MNIST
  2. import torchvision.transforms as transforms
  3. trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True)
  4. print('Min Pixel Value: {} \nMax Pixel Value: {}'.format(trainset.data.min(), trainset.data.max()))
  5. print('Mean Pixel Value {} \nPixel Values Std: {}'.format(trainset.data.float().mean(), trainset.data.float().std()))
  6. print('Scaled Mean Pixel Value {} \nScaled Pixel Values Std: {}'.format(trainset.data.float().mean() / 255, trainset.data.float().std() / 255))

输出(注意,由于数据没有经过 torchvision.transforms.ToTensor()进行变换,所以仍然是[0,255]范围):

  1. Min Pixel Value: 0
  2. Max Pixel Value: 255
  3. Mean Pixel Value 33.31002426147461
  4. Pixel Values Std: 78.56748962402344
  5. Scaled Mean: 0.13062754273414612
  6. Scaled Std: 0.30810779333114624

方法2:

利用如下公式:

  1. dataset_img_width = train_dataset.data.shape[2]
  2. dataset_img_height = train_dataset.data.shape[1]
  3. # 像素点总数,相当于总样本数
  4. total_pixels_count = train_dataset.__len__() * dataset_img_height * dataset_img_width
  5. pixels_sum = 0.0
  6. pixels_sum_sq = 0.0
  7. for data, targets in train_loader:
  8. # 像素点值的和,一个像素点就是一个样本
  9. pixels_sum += data.sum(axis=[0, 2, 3])
  10. # 像素点值的平方和
  11. pixels_sum_sq += data.square().sum(axis=[0, 2, 3])
  12. total_mean = pixels_sum / total_pixels_count
  13. std = torch.sqrt(pixels_sum_sq/total_pixels_count-total_mean.square())
  14. print(std)

有误差的方法3:算每个batch(批次)的标准差,再除以批次数,这个肯定会有误差,但没有实际验证过误差到底有多大。

了解以下

从局部方差和均值计算整体方差:

图片转自局部均值与方差计算总体均值与方差 - 知乎

手写推导,留给自己看的,你们就别看了:

博客或者描述或者代码有错误欢迎指正

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/133116
推荐阅读
相关标签
  

闽ICP备14008679号