张量流对象检测-并行线程中的许多检测器

时间:2019-01-26 16:38:39

标签: python multithreading tensorflow object-detection

我想实时处理几个视频流。我接受了this gist并进行了一些更改。这是我现在拥有的:

在主线程中运行一次。 self是主类的唯一对象:

self.detection_graph = tf.Graph()
with self.detection_graph.as_default():
    od_graph_def = tf.GraphDef()
    with tf.gfile.GFile(model_path, 'rb') as fid:
        serialized_graph = fid.read()
        od_graph_def.ParseFromString(serialized_graph)
        tf.import_graph_def(od_graph_def, name='')

在每个线程中运行。现在self是扩展Thread的类的对象:

self.default_graph = self.detection_graph.as_default()
self.sess = tf.Session(graph=self.detection_graph)
self.image_tensor = self.detection_graph.get_tensor_by_name('image_tensor:0')
self.detection_boxes = self.detection_graph.get_tensor_by_name('detection_boxes:0')
self.detection_scores = self.detection_graph.get_tensor_by_name('detection_scores:0')
self.detection_classes = self.detection_graph.get_tensor_by_name('detection_classes:0')
self.num_detections = self.detection_graph.get_tensor_by_name('num_detections:0')

# ...

frame_np_expanded = np.expand_dims(frame, axis=0) 
boxes, scores, classes, num = self.sess.run(
        [self.detection_boxes, self.detection_scores,
        self.detection_classes, self.num_detections],
        feed_dict={self.image_tensor: frame_np_expanded})

# ...

self.sess.close()

现在看起来它在运行时是并行的,但此刻甚至单个检测器线程都消耗了我拥有的所有3 GB视频内存,在获得更多信息之前,我想知道:

  1. 真的是平行的还是错过了什么?我是tf的初学者。
  2. tf是否为所有线程使用3 GB(或者如果有的话,还要更多)的视频内存,或者每个线程都需要自己的3 GB?如果是第二个,我可以重写代码做为第一个吗?
  3. 为什么在关闭会话并完成线程后tf无法释放内存?我读过this,但解决方案看起来很激进。

0 个答案:

没有答案