計算圖像數據集的均值和方差(mean, std)用於transforms.Normalize()標准化


Pytorch圖像預處理時,通常使用transforms.Normalize(mean, std)對圖像按通道進行標准化,即減去均值,再除以方差。這樣做可以加快模型的收斂速度。其中參數mean和std分別表示圖像每個通道的均值和方差序列。

Imagenet數據集的均值和方差為:mean=(0.485, 0.456, 0.406),std=(0.229, 0.224, 0.225),因為這是在百萬張圖像上計算而得的,所以我們通常見到在訓練過程中使用它們做標准化。而對於特定的數據集,選擇這個值的結果可能並不理想。接下來給出計算特定數據集的均值和方差的方法。

def getStat(train_data):
    '''
    Compute mean and variance for training data
    :param train_data: 自定義類Dataset(或ImageFolder即可)
    :return: (mean, std)
    '''
    print('Compute mean and variance for training data.')
    print(len(train_data))
    train_loader = torch.utils.data.DataLoader(
        train_data, batch_size=1, shuffle=False, num_workers=0,
        pin_memory=True)
    mean = torch.zeros(3)
    std = torch.zeros(3)
    for X, _ in train_loader:
        for d in range(3):
            mean[d] += X[:, d, :, :].mean()
            std[d] += X[:, d, :, :].std()
    mean.div_(len(train_data))
    std.div_(len(train_data))
    return list(mean.numpy()), list(std.numpy())
 
if __name__ == '__main__':
    train_dataset = ImageFolder(root=r'D:\cifar10_images\test', transform=None)
    print(getStat(train_dataset))

  


getState()方法接收一個Dataset類(ImageFolder),然后累加所有圖像三個通道的均值和方差,最后除以圖像總數並返回。

這里用cifar10做的測試,測試集返回的結果如下所示:

Compute mean and variance for training data.
10000
([0.4940607, 0.4850613, 0.45037037], [0.20085774, 0.19870903, 0.20153421])

  



————————————————
版權聲明:本文為CSDN博主「潛行隱耀」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/PanYHHH/article/details/107896526

_____________________________

注:這里涉及到兩種算法

1. 計算每張圖片的像素平均灰度值,再求和並除以總圖片數

2. 計算總灰度值,將每張圖像像素數求和,除以這個和

方法一更好,適用於圖片大小不一樣的情況

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM