Чтобы использовать PyStruct для выполнения сегментации изображения (с помощью вывода [1]), мне сначала нужно построить граф, узлы которого соответствуют пикселям, а ребра - это связь между этими пикселями.Как быстро построить график с помощью Numpy?
я таким образом написал функцию, которая работает, чтобы сделать так:
def create_graph_for_pystruct(mrf, betas, nb_labels):
M, N = mrf.shape
b1, b2, b3, b4 = betas
edges = []
pairwise = np.zeros((nb_labels, nb_labels))
# loop over rows
for i in range(M):
# loop over columns
for j in range(N):
# get rid of pixels belonging to image's borders
if i!=0 and i!=M-1 and j!=0 and j!=N-1:
# get the current linear index
current_linear_ind = i * N + j
# retrieve its neighborhood (yield a list of tuple (row, col))
neigh = np.array(getNeighborhood(i, j, M, N))
# convert neighbors indices to linear ones
neigh_linear_ind = neigh[:, 0] * N + neigh[:, 1]
# add edges
[edges.append((current_linear_ind, n)) for n in neigh_linear_ind]
mat1 = b1 * np.eye(nb_labels)
mat2 = b2 * np.eye(nb_labels)
mat3 = b3 * np.eye(nb_labels)
mat4 = b4 * np.eye(nb_labels)
pairwise = np.ma.dstack((pairwise, mat1, mat1, mat2, mat2, mat3, mat3, mat4, mat4))
return np.array(edges), pairwise[:, :, 1:]
Однако это медленно и мне интересно, где я могу улучшить свою функцию, чтобы ускорить его. [1] https://pystruct.github.io/generated/pystruct.inference.inference_dispatch.html
Небольшое изменение это должно помочь : переместите определение mat1, mat2 и т. д. из циклов, они не меняются, поэтому переопределение их каждый раз представляет собой огромную потерю времени. – jadsq
Действительно, я сделал это. Однако это ничего не ускоряет. – floflo29
Следующей большой проблемой было бы удалить те из-за-петли, но я не понимаю, что делает ваш код, поэтому я даже не уверен, можно ли его векторизовать ... – jadsq