Фильтрация строк в тензоре pytorch

#pytorch

#pytorch

Вопрос:

Если у меня есть тензор, который содержит информацию об обнаруженных изображениях в следующей форме:

         [[595.00000, 179.62500, 628.00000, 283.00000,   0.89062,   0.00000],
        [142.87500, 167.62500, 201.62500, 324.00000,   0.88086,   0.00000],
        [311.75000, 170.50000, 368.75000, 320.50000,   0.87549,   0.00000],
        [555.50000, 173.75000, 593.50000, 280.50000,   0.85791,   0.00000],
        [398.50000, 179.00000, 425.50000, 265.00000,   0.84180,   0.00000],
        [445.75000, 177.75000, 479.25000, 270.75000,   0.82129,   0.00000]]
 

где каждая строка представляет изображение со следующими параметрами :

 [   top,    bottom, left,   right, confidence, class    ]
 

Какой наиболее эффективный способ удаления изображений (строк), размер которых меньше, чем некоторый пользовательский ввод для высоты, которая равна top-bottom ?

Естественно, я бы перебирал строки, а затем отбрасывал каждую строку, где top-bottom < someValue с некоторым пониманием списка, но я подозреваю, что может быть лучший способ сделать это.

Ответ №1:

Как насчет того, чтобы я отбросил некоторые тесты (если это будет вам интересно)?

Тесты

PyTorch-ic способ:

 In[2]: import torch
  ...: a = torch.Tensor(
  ...:      [[595.00000, 179.62500, 628.00000, 283.00000,   0.89062,   0.00000],
  ...:         [142.87500, 167.62500, 201.62500, 324.00000,   0.88086,   0.00000],
  ...:         [311.75000, 170.50000, 368.75000, 320.50000,   0.87549,   0.00000],
  ...:         [555.50000, 173.75000, 593.50000, 280.50000,   0.85791,   0.00000],
  ...:         [398.50000, 179.00000, 425.50000, 265.00000,   0.84180,   0.00000],
  ...:         [445.75000, 177.75000, 479.25000, 270.75000,   0.82129,   0.00000]])
In[3]: %timeit a[a[:, 0] - a[:, 1] > 300]
Out[3]: 24.5 µs ± 904 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
 

В терминах Numpy:

 In[4]: import numpy as np
In[5]: %timeit np_arr[np.where(np_arr[:, 0] - np_arr[:, 1] > 300)]
Out[5]: 4.75 µs ± 713 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In[6]: np_arr[np.where(np_arr[:, 0] - np_arr[:, 1] > 300)]
 

Справедливость

 In[7]: torch.equal(torch.from_numpy(np_arr[np.where(np_arr[:, 0] - np_arr[:, 1] > 300)]), a[a[:, 0] - a[:, 1] > 300])
Out[7]: True
 

Вывод заключается в том, что использование numpy для ваших сравнений будет намного быстрее, чем PyTorch.

Ответ №2:

Решение было бы:

 import torch
a = torch.Tensor(
     [[595.00000, 179.62500, 628.00000, 283.00000,   0.89062,   0.00000],
        [142.87500, 167.62500, 201.62500, 324.00000,   0.88086,   0.00000],
        [311.75000, 170.50000, 368.75000, 320.50000,   0.87549,   0.00000],
        [555.50000, 173.75000, 593.50000, 280.50000,   0.85791,   0.00000],
        [398.50000, 179.00000, 425.50000, 265.00000,   0.84180,   0.00000],
        [445.75000, 177.75000, 479.25000, 270.75000,   0.82129,   0.00000]])

y = a[a[:, 0] - a[:, 1] > 300]

print(y)

> tensor([[595.0000, 179.6250, 628.0000, 283.0000,   0.8906,   0.0000],
>         [555.5000, 173.7500, 593.5000, 280.5000,   0.8579,   0.0000]])
 

Например, если вам нужно сохранить только изображения с высотой> 300 пикселей.