【问题标题】:Batch glimpse sensor with numpy使用 numpy 批量查看传感器
【发布时间】:2017-03-12 15:49:36
【问题描述】:

我正在尝试从 Recurrent models of visual attention paper (https://arxiv.org/abs/1406.6247) 中实现 glimpse sensor。

基本上,我需要从二维 numpy 数组中提取一个矩形裁剪。对单个输入执行此操作没有问题,但我似乎无法弄清楚如何使用批处理执行此操作。

所以输入是:

  • 图像 - 样本 x 高 x 宽数组
  • 位置 - 样本 x 2 数组 - 每个样本图像的 x、y 坐标集

输出应该是某个大小的每个样本裁剪区域(例如 100x100),其中裁剪的左上角由相应的位置条目指定,因此它应该是样本 x 100 x 100。现在我忽略了所有极端情况,因此可以假设裁剪完全包含在图像中,并且位置已经采用可用于 numpy 索引的格式。

对于单个图像,任务很简单:

image[location[0]:location[0]+100, location[1]:location[1]+100]

但将其应用于批处理有点困难。正在做

image[:, location[:,0]:location[:,0]+100, location[:,1]:location[:,1]+100]

不起作用,因为切片不接受 numpy 数组。

为任意作物大小提供全套索引似乎对我也不起作用。

另一种选择是循环遍历批处理并分别从每个图像中提取裁剪,但我不确定这会有多有效。

那么,这种索引在 numpy 中是否可能不使用循环?

【问题讨论】:

    标签: python numpy deep-learning


    【解决方案1】:

    这似乎可行:我只是提供了完整的索引集,正如您在上面指定的那样。我们可以先简单地生成范围:

    ranges_x = [list(range(i, i+10)) for i, _ in locations]
    ranges_y = [list(range(j, j+10)) for _, j in locations]
    

    然后,只需应用这些索引:

    images[:, ranges_x, ranges_y]
    

    这是我尝试过的一个玩具示例:

    >>> images = np.random.random(size=(10, 100, 100))
    >>> images[0].shape
    (100, 100)
    >>> locations = np.random.random_integers(0, 25, size=(10, 2))
    >>> ranges_x = [list(range(i, i+10)) for i, _ in locations]
    >>> ranges_y = [list(range(j, j+10)) for _, j in locations]
    >>> crops = images[:, ranges_x, ranges_y]
    >>> crops[0].shape
    (10, 10)
    >>> locations[0]
    array([16,  1])
    >>> images[0][16][1]
    0.078065688223271312
    >>> crops[0][0][0]
    0.078065688223271312
    

    【讨论】:

    • 形状正确,但crops 不是从给定图像中裁剪出来的。您可以通过使用numpy.arange(10*100*100).reshape(10, 100, 100) 初始化images 并查看crops[0] 来轻松检查这一点。
    猜你喜欢
    • 2021-08-12
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多