【问题标题】:How to calculate mean for batch of images in Python in a non vectorized way?如何以非矢量化方式计算 Python 中一批图像的平均值?
【发布时间】:2017-01-12 13:03:22
【问题描述】:

为了计算图像均值,如果我没记错的话,可以使用numpy.mean()

mean() 所做的只是简单地将所有元素相加,然后除以所有元素的总和数。此外,如果我想计算平均通道,(每个通道都有自己的平均计算),并且我有一个形状输入:(num_batch, num_channel, width, height),我会写:

numpy.mean(a,axis=(0,2,3)) 

现在,我尝试编写它的非矢量化版本,但我不确定我是否正确地做所有事情。

这是假定计算平均通道的代码,(它的输出应该与上面给出的命令相匹配:

def calc_mean_classic(a):
    #sum all elements in each channel and divide by the number of elements
    batch = a.shape[0]
    channel = a.shape[1]
    width = a.shape[2]
    height = a.shape[3]

    sum = np.zeros((channel))
    for i in range(batch):
        for c in range(channel):
            for w in range(width):
                for h in range(height):
                    sum[c] += a[i,c,w,h]

    return sum, (sum/(width*height))

当我使用numpy.mean(a,axis=(0,2,3)) 运行我的数据时,我得到:

[ 125.30691805  122.95039414  113.86538318]

但是当我运行我编写的函数时,我得到:

sum,m3 = calc_mean_classic(data_train)
print 'sum=',sum
print 'm3=',m3
print m3[0]/(32*32)

输出:

sum= [  6.41571420e+09   6.29506018e+09   5.82990762e+09]
m3= [ 6265345.90234375  6147519.70703125  5693269.15917969]
6118.50185776

这里有一个讽刺意味,图像大小是32*32,这就是为什么我在做m3[0]/(32*32) (sum/width*height) 看看我是否可以生成sum[0] 值!如您所见,它们是完全不同的值,但它们应该产生相同的值!

我不知道这里发生了什么。

【问题讨论】:

  • 我的快速而肮脏的故障排除技巧:加、减、乘和除预期输出与当前输出。如果你得到奇怪的相关性,那就是线索。如果您将循环输出除以矢量化输出,您将得到 50000,我希望这是您的批量大小 - 这将导致您在下面得到 Divakar 的答案。
  • @DanielForsman:非常感谢,这是一个非常方便的提示 :)

标签: python image numpy


【解决方案1】:

沿这三个轴使用sum,然后除以块大小,即width*height,即a.shape[2]*a.shape[3] -

batch_mean = np.sum(a,axis=(0,2,3))/(a.shape[2]*a.shape[3])

对于np.mean(a,axis=(0,2,3)),您还除以沿第一个轴的元素数,这似乎不是在那里的预期操作,至少对于带有您的函数calc_mean_classicsum/(width*height)


否则,如果您打算用循环的calc_mean_classic 模拟np.mean(a,axis=(0,2,3)) 的行为,只需编辑return 语句以合并a.shape[0] -

return sum, (sum/(width*height*a.shape[0]))

【讨论】:

    【解决方案2】:

    这对我有用,谢谢!

        # YOUR CODE HERE
        a = batch.asnumpy()
    
        #sum all elements in each channel and divide by the number of elements
        batch = a.shape[0]
        channel = a.shape[1]
        width = a.shape[2]
        height = a.shape[3]
    
        sum = np.zeros((channel))
        for i in range(batch):
            for c in range(channel):
                for w in range(width):
                    for h in range(height):
                        sum[c] += a[i,c,w,h]
    
        sum = sum/(width*height*a.shape[0])
    
        return mx.nd.array(sum)  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 2020-10-20
      • 1970-01-01
      • 2011-12-04
      • 2014-03-01
      • 2017-09-23
      • 1970-01-01
      相关资源
      最近更新 更多