В: Как ускорить это?
Ниже приведена моя реализация Matlab im2col "скользящая" с дополнительной функцией возврата каждого n-го столбца. Функция принимает изображение (или любой 2-мерный массив) и слайды слева направо, сверху вниз, выделяя каждый дублирующий суб-образ заданного размера и возвращая массив, столбцы которого являются суб-изображениями.
import numpy as np
def im2col_sliding(image, block_size, skip=1):
rows, cols = image.shape
horz_blocks = cols - block_size[1] + 1
vert_blocks = rows - block_size[0] + 1
output_vectors = np.zeros((block_size[0] * block_size[1], horz_blocks * vert_blocks))
itr = 0
for v_b in xrange(vert_blocks):
for h_b in xrange(horz_blocks):
output_vectors[:, itr] = image[v_b: v_b + block_size[0], h_b: h_b + block_size[1]].ravel()
itr += 1
return output_vectors[:, ::skip]
Пример:
a = np.arange(16).reshape(4, 4)
print a
print im2col_sliding(a, (2, 2)) # return every overlapping 2x2 patch
print im2col_sliding(a, (2, 2), 4) # return every 4th vector
возвращает:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
[[ 0. 1. 2. 4. 5. 6. 8. 9. 10.]
[ 1. 2. 3. 5. 6. 7. 9. 10. 11.]
[ 4. 5. 6. 8. 9. 10. 12. 13. 14.]
[ 5. 6. 7. 9. 10. 11. 13. 14. 15.]]
[[ 0. 5. 10.]
[ 1. 6. 11.]
[ 4. 9. 14.]
[ 5. 10. 15.]]
Производительность невелика, особенно учитывая, что я называю im2col_sliding(big_matrix, (8, 8))
(столбцы 62001) или im2col_sliding(big_matrix, (8, 8), 10)
(столбцы 6201, сохраняя только каждый 10-й вектор), это займет столько же времени [где big_matrix имеет размер 256 x 256].
Я ищу любые идеи, чтобы ускорить это.