У меня есть функция для деформации некоторых изображений лиц с использованием их целевых ориентиров. Но я заметил, что со временем произошла утечка памяти, и я проверил ее с помощью memory_profiler. Вот код:
def image_warping(src_img, src_landmarks, dest_landmarks):
expanded_src_landmarks = np.expand_dims(np.float32(src_landmarks), axis=0)
expanded_dest_landmarks = np.expand_dims(np.float32(dest_landmarks), axis=0)
expanded_src_img = np.expand_dims(np.float32(src_img) / 255, axis=0)
warped_img, dense_flows = sparse_image_warp.sparse_image_warp(expanded_src_img,
expanded_src_landmarks,
expanded_dest_landmarks,
interpolation_order=1,
regularization_weight=0.1,
num_boundary_points=2,
name='sparse_image_warp')
with tf.Session() as sess:
out_img = sess.run(warped_img)
warp_img = np.uint8(out_img[0, :, :, :] * 255)
session.close()
return warp_img
memory_profiler показывает 466,645 МБ и 174,574 МБ приращений для with tf.Session() as sess:
и out_img = sess.run(warped_img)
линий соответственно.
Есть ли другие способы преобразовать warped_img из тензорного в массив numpy вместо запуска по сеансу? Результаты этой tf-функции намного лучше, чем у любых других доступных кодов деформации изображения, но мне интересно, почему она возвращает тензор, так как все входные данные являются массивами. Я не использую эту функцию в алгоритме глубокого обучения.