#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 пикселей.