Efficiently Using Multiple Numpy Slices for Random Image Cropping

前端 未结 1 497
隐瞒了意图╮
隐瞒了意图╮ 2020-11-22 15:22

I have a 4-D numpy array, with the first dimension representing the number of images in a data set, the second and third being the (equal) width and height, and the 4th bein

相关标签:
1条回答
  • 2020-11-22 15:59

    Leverage strided-based method for efficient patch extraction

    We can leverage np.lib.stride_tricks.as_strided based scikit-image's view_as_windows to get sliding windows that would be merely views into the input array and hence incur no extra memory overhead and virtually free! We can surely use np.lib.stride_tricks.as_strided directly, but the setup work required is hard to manage especially on arrays with higher dimensions. If scikit-image is not available, we can directly use the source code that works standalone.

    Explanation on usage of view_as_windows

    The idea with view_as_windows is that we feed in the input arg window_shape as a tuple of length same as the number of dimensions in the input array whose sliding windows are needed. The axes along which we need to slide are fed with the respective window lengths and rest are fed with 1s. This would create an array of views with singleton dims/axes i.e. axes with lengths=1 corresponding to the 1s in window_shape arg. So, for those cases we might want to index into the zeroth element corresponding to the axes that are fed 1 as the sliding window lengths to have a squeezed version of the sliding windows.

    Thus, we would have a solution, like so -

    # Get sliding windows
    from skimage.util.shape import view_as_windows
    w = view_as_windows(X, (1,16,16,1))[...,0,:,:,0]
    
    # Index and get our specific windows
    out = w[np.arange(X.shape[0]),x,y]
    
    # If you need those in the same format as in the posted loopy code
    out = out.transpose(0,2,3,1)
    
    0 讨论(0)
提交回复
热议问题