【问题标题】:Calculating Mean & STD for Batch [Python/Numpy]计算批次的平均值和标准差 [Python/Numpy]
【发布时间】:2018-06-17 23:29:34
【问题描述】:

希望有效地计算批次中每个通道的平均值和标准差。


详情:

  • 批量:128
  • 图片:32x32
  • 3 通道 (RGB)

所以每个批次的大小为 [128, 32, 32, 3]。

有很多批次(幼稚的方法在所有批次中需要大约 4 分钟)。

我想输出 2 个数组:(meanR, meanG, meanB) 和 (stdR, stdG, stdB)


(另外,如果有一种有效的方法在计算后对批次执行算术运算,那将很有帮助。例如,从每张图像中减去整个数据集的平均值)

【问题讨论】:

  • 您想获得 all 图像或 每个 图像的每个通道的平均值吗? IE。你可以为你想要的数组指定形状吗?

标签: python numpy tensorflow batch-processing channel


【解决方案1】:

如果我理解正确并且您想计算 所有图像的平均值和标准值:

演示:2 个 (2,2,3) 形状的图像(为简单起见):

In [189]: a
Out[189]:
array([[[[ 1,  2,  3],
         [ 4,  5,  6]],

        [[ 7,  8,  9],
         [10, 11, 12]]],


       [[[13, 14, 15],
         [16, 17, 18]],

        [[19, 20, 21],
         [22, 23, 24]]]])

In [190]: a.shape
Out[190]: (2, 2, 2, 3)

In [191]: np.mean(a, axis=(0,1,2))
Out[191]: array([ 11.5,  12.5,  13.5])

In [192]: np.einsum('ijkl->l', a)/float(np.prod(a.shape[:3]))
Out[192]: array([ 11.5,  12.5,  13.5])

速度测量:

In [202]: a = np.random.randint(255, size=(128,32,32,3))

In [203]: %timeit np.mean(a, axis=(0,1,2))
9.48 ms ± 822 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [204]: %timeit np.einsum('ijkl->l', a)/float(np.prod(a.shape[:3]))
1.82 ms ± 22.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

【讨论】:

  • 非常感谢!这个解决方案正是我想要的!
【解决方案2】:

您可以使用此方法计算 R、G、B 的均值和标准差。

a = np.random.rand(128,32,32,3)
for i in range(3):
    means = [m for m in np.mean(a, axis = (3, i))]
for i in range(3):
    stds = [s for s in np.std(a, axis = (3, i))]

axis=(3,i) 3 代表通道,i 代表颜色(R、G、B)。你也可以参考这个链接。Get mean of 2D slice of a 3D array in numpy 。我希望这可以帮助你。

【讨论】:

    【解决方案3】:

    假设你想得到多轴的平均值(如果我没弄错的话)。 numpy.mean(a, axis=None) 已经支持多轴,如果轴是 tuple

    我不太清楚你所说的幼稚方法是什么意思。

    【讨论】:

    • 谢谢。这比我做的方式优雅得多。
    最近更新 更多