添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

pytorch计算机视觉——计算图片数据集的标准差和平均值

8 个月前 · 来自专栏 pytorch_cv学习笔记

问题动机

在训练模型以前,对数据进行预处理,往往能够:(1)加快训练模型时的收敛速度;(2)减少异常值对模型的影响。数据标准化即是预处理中较为关键的一步,具体而言,即是通道的每个值减去该通道的平均值,然后将结果除以该通道的标准差。那么如何计算平均值和标准差?

通常我们在看cv代码的时候,标准化函数的值通常指定成以下格式:

normalize = torchvision.transforms.Normalize(
    [0.485, 0.456, 0.406], [0.229, 0.224, 0.225])

这个值是从哪里来的呢?这是在百万张图像上计算而得的,所以我们通常见到在训练过程中使用它们做标准化[1]。针对一些特殊的数据集,这对数值可能不适用,那么就需要我们自己计算。

解决方法

import torch
import torchvision
def getMeanAndBias(dataset):
            iter_dataloader 要求:元素为tensor类型、转换为torch.utils.data.Dataset类
    # 1. dataloader加载数据
    # 注意batch_size的用法。这种条件下,数据集会被逐样本分割,而不是成批在一起
    data_iter = torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, num_workers=0)
    # 2. 初始化通道平均值和标准差
    means = torch.zeros(3)
    bias = torch.zeros(3)
    # 3. 计算每张图片的每个通道的平均值和以及方差和
    for img, _ in data_iter:
        for d in range(3):
            # 注意针对单个通道计算平均值和标准差的方法
            means[d] += img[:, d, :, :].mean()
            bias[d] += img[:, d, :, :].std()
    means = means / len(data_iter)
    bias = bias / len(data_iter)
    return [means, bias]

实验效果

我们调用这个API试试效果

# 注意要设计转换器,将元素转换为tensor类型
transfroms = torchvision.transforms.Compose([torchvision.transforms.ToTensor()])