我正在运行具有多个线程的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)
感谢任何想法。