Пакет оконных масок с уникальными позициями в векторизации - Python / NumPy - PullRequest
1 голос
/ 20 марта 2020

Мне нужно создать стохастические c логические маски для набора изображений. Каждая маска представляет собой массив из 1 с 6 случайными квадратами, в которых значения равны 0. Длина квадратов составляет 56 пикселей. Маска может быть создана с помощью следующего кода:

mask = np.ones(shape=(3, h, w))
for _ in range(6):
        x_coordinate = np.random.randint(0, w)
        y_coordinate = np.random.randint(0, h)
        mask[:, x_coordinate: x_coordinate + 56, y_coordinate: y_coordinate + 56] = 0

Теперь самое сложное, что я хочу сделать, это векторизовать этот процесс для пакета изображений. Это вообще возможно? Сейчас я просто вызываю эту функцию, используя простой for-l oop для каждого изображения в моем пакете, но мне было интересно, есть ли способ вообще избежать for-l oop.

ТАКЖЕ: маска должна быть разной для каждого изображения в пакете (нельзя использовать одну и ту же маску для каждого изображения)

1 Ответ

1 голос
/ 20 марта 2020

Мы можем использовать np.lib.stride_tricks.as_strided на основе scikit-image's view_as_windows, чтобы получить скольжение windows и, следовательно, решить наш случай здесь. Больше информации об использовании as_strided на основе view_as_windows.

На основе views, это будет настолько эффективно, насколько это возможно!

from skimage.util.shape import view_as_windows

N = 3 # number of images in the batch
image_H,image_W = 5,7 # edit to image height, width
bbox_H,bbox_W = 2,3  # edit to window height, width to be set as 0s

w_off = image_W-bbox_W+1
h_off = image_H-bbox_H+1
M = w_off*h_off

R,C = np.unravel_index(np.random.choice(M, size=N, replace=False), (h_off, w_off))

mask_out = np.ones(shape=(N, image_H, image_W), dtype=bool)
win = view_as_windows(mask_out, (1, bbox_H,bbox_W))[...,0,:,:]
win[np.arange(len(R)),R,C] = 0

Если вы не возражаете против дублирующих масок, просто используйте replace=True в коде.

Пример вывода с заданными входными параметрами -

In [6]: mask_out
Out[6]: 
array([[[ True,  True,  True,  True,  True,  True,  True],
        [ True,  True, False, False, False,  True,  True],
        [ True,  True, False, False, False,  True,  True],
        [ True,  True,  True,  True,  True,  True,  True],
        [ True,  True,  True,  True,  True,  True,  True]],

       [[ True,  True,  True,  True,  True,  True,  True],
        [ True, False, False, False,  True,  True,  True],
        [ True, False, False, False,  True,  True,  True],
        [ True,  True,  True,  True,  True,  True,  True],
        [ True,  True,  True,  True,  True,  True,  True]],

       [[ True,  True,  True,  True,  True,  True,  True],
        [ True,  True,  True,  True,  True,  True,  True],
        [False, False, False,  True,  True,  True,  True],
        [False, False, False,  True,  True,  True,  True],
        [ True,  True,  True,  True,  True,  True,  True]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...