我一直在尝试在一批图像上运行对象检测,但图形不断使用越来越多的内存。我认为变量没有被删除(当重新分配时),只是不断添加。我尝试重置默认图形,清除会话并手动删除+垃圾收集。
这基本上就是for循环:
for i in range(num_images)
box, m, s = detect(imgs[i])
boxes.append(box)
this is detect
def detect(img):
height, width, channels = img.shape
detector_output = detector(tf.expand_dims(img, axis=0))
classes = detector_output['detection_classes'][0]
most_likely = tf.convert_to_tensor(classes[0])
second_ = 20
box = detector_output['detection_boxes'][0][0]
box = tf.math.multiply(box, [height, width, height, width])
box = tf.cast(box, tf.int16)
del detector_output
K.clear_session()
return (box, most_likely)
我一直在跟踪内存,它随着循环线性增加,所以我认为它是detector_output,只是每个循环添加。
我该如何解决这个问题,更聪明的方法是什么?
PS我有(认为我必须)这样做的原因是因为模型不支持批处理:https://tfhub.dev/tensorflow/collections/object_detection/2
Thank you very much
imgs
数组可能会占用大量内存,因为所有图像都已加载。您可以尝试逐个加载每个图像并运行detector()
for name in image_names:
# this function loads the image from disk and converts to a np array
image = load(name)
box, m, s = detect(image)
boxes.append(box)
如果你仍然用完内存,你可以尝试保存box
作为.npy
文件,而不是附加到boxes
列表,但boxes
列表不太可能导致内存问题。