Tensorflow线程减慢另一个线程

时间:2019-04-08 18:54:43

标签: python multithreading tensorflow parallel-processing

我正在运行具有多个线程的python程序。其中两个包含两个不同的张量流模型。一种更快,包含ssd_mobilenet_v1模型,另一种确实检测速度很慢:faster_rcnn。我的目标是在每个帧上运行快速线程(从另一个线程加载到输入队列中),并仅在每1000个上运行fast_rcnn。

将检测到的对象传递到管道,最后使用opencv在屏幕上绘制。

当我尝试写下来时,它运行起来相对平稳,直到第一次检测到fast_rcnn,然后结果的可视化效果(使用opencv)就达到了每秒1帧,并且保持不变。我怀疑tensorflow会消耗所有可用资源,而opencv没有处理空间。但是我不知道该怎么解决。

我的程序在一个模型上工作正常。 th大约30fps(不使用GPU,因为我的GPU不支持CUDA)。

我已经尝试指定

ConfigProto(inter_op_parallelism_threads=1, intra_op_parallelism_threads=1)

但效果不大。

我也在做一些调试,如果没有由于连接每个块的队列而导致速度下降,但是没有。

我想以某种方式降低用于tensorflow会话的资源。有什么可能吗?

这是我的代码:

class Detector(ThreadedPipeBlock):

    def __init__(self, info, model, output=None, detector_type_id=params.DETECTOR_CAR_ID, block=True, max_steps=np.inf):

        super().__init__(pipe_id=detector_type_id, output=output, max_steps=max_steps)
        self._info = info
        self.detection_graph = tf.Graph()
        self._block = block

        with self.detection_graph.as_default():
            od_graph_def = tf.GraphDef()

            with tf.gfile.GFile(model, 'rb') as fid:
                serialized_graph = fid.read()
                od_graph_def.ParseFromString(serialized_graph)
                tf.import_graph_def(od_graph_def, name='')

            self.image_tensor = self.detection_graph.get_tensor_by_name('image_tensor:0')
            self.d_boxes = self.detection_graph.get_tensor_by_name('detection_boxes:0')
            self.d_scores = self.detection_graph.get_tensor_by_name('detection_scores:0')
            self.d_classes = self.detection_graph.get_tensor_by_name('detection_classes:0')
            self.num_d = self.detection_graph.get_tensor_by_name('num_detections:0')

        self.sess = tf.Session(graph=self.detection_graph, config=
            tf.ConfigProto(inter_op_parallelism_threads=1, intra_op_parallelism_threads=1))

        print(self.id)

    def _step(self, seq):
        seq, image = self.receive(params.FRAME_LOADER_ID)
        img_expanded = np.expand_dims(image, axis=0)

        (boxes, scores, _, _) = self.sess.run(
            [self.d_boxes, self.d_scores, self.d_classes, self.num_d],
            feed_dict={self.image_tensor: img_expanded})

        packet_boxes = self.parse_boxes(boxes[0], scores[0])

        if len(self._output):
            self.send(packet_boxes, pipe_id=list(self._output.keys())[0], block=self._block)

感谢任何想法。

0 个答案:

没有答案