【问题标题】:Numpy - Normalize RGB image datasetNumpy - 归一化 RGB 图像数据集
【发布时间】:2019-06-28 17:23:21
【问题描述】:

我的数据集是一个 Numpy 数组,维度为 (N, W, H, C),其中 N 是图像的数量,H 和 W 分别是高度和宽度,C 是通道数。

我知道那里有很多工具,但我想只使用 Numpy 来规范化图像。

我的计划是计算三个通道中每个通道的整个数据集的均值和标准差,然后减去均值并除以标准差。

假设我们在数据集中有两张图片,这两张图片的第一个通道如下所示:

x=array([[[3., 4.],
          [5., 6.]],

          [[1., 2.],
          [3., 4.]]])

计算平均值:

numpy.mean(x[:,:,:,0])
= 3.5

计算标准:

numpy.std(x[:,:,:,0])
= 1.5

标准化第一个通道:

x[:,:,:,0] = (x[:,:,:,0] - 3.5) / 1.5

这对吗?

谢谢!

【问题讨论】:

    标签: python image numpy machine-learning data-processing


    【解决方案1】:

    看起来不错,但是 NumPy 做的一些事情可以让它变得更好。我假设您想分别对每个通道进行标准化。

    首先,注意x 有一个方法mean,所以我们可以写x[..., 0].mean() 而不是np.mean(x[:, :, :, 0])。此外,mean 方法采用关键字参数axis,我们可以使用如下:

    means = x.mean(axis=(0, 1, 2)) # Take the mean over the N,H,W axes
    means.shape # => will evaluate to (C,)
    

    然后我们可以像这样从整个数据集中减去均值:

    centered = x - x.mean(axis=(0,1,2), keepdims=True)
    

    请注意,我们必须在这里使用keepdims

    还有一个 x.std 的工作方式相同,所以我们可以在 1 行中完成整个标准化:

    z = (x - x.mean(axis=(0,1,2), keepdims=True)) / x.std(axis=(0,1,2), keepdims=True)
    

    查看numpy.ndarray.meannp.ndarray.std 的文档以获取更多信息。 np.ndarray.method 方法是您在调用 x.method 而不是使用 np.method(x) 时遇到的。


    编辑:我后来了解到,当然,有一个scipy.stats.zscore。我不确定这是否是沿每个通道获取 zscores 的更易读的方式,但有些人可能更喜欢它:

    z = zscore(x.reshape(-1, 3)).reshape(x.shape)
    

    scipy 函数仅在单轴上运行,因此我们必须先重塑为 NHW x C 矩阵,然后再重塑。

    【讨论】:

    • 很好的答案,只建议链接到 Numpy 的文档,以便有兴趣的人可以阅读文档对参数的看法。
    • 如果整个数据集没有进入内存怎么办?
    • 可以以滚动或在线方式计算平均值和标准差,而无需一次将整个数据集加载到内存中——有一百万个 SO 问题和其他描述这一点的来源,例如stackoverflow.com/questions/15638612/…。然后,当您从磁盘加载部分数据以供以后使用时,您只需插入平均值和标准差来代替上面的x.mean(...)x.std(...)
    • 我不知道 keepdims 选项,非常有用,谢谢!
    猜你喜欢
    • 2023-03-31
    • 2015-01-12
    • 2015-08-04
    • 2017-11-13
    • 2016-08-26
    • 2014-02-27
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    相关资源
    最近更新 更多