Я хочу обрабатывать несколько видеопотоков в режиме реального времени.Я взял эту суть и внес некоторые изменения.Вот что у меня сейчас:
запускается один раз в основном потоке.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 ГБ видеопамяти, которые у меня есть, ипрежде чем я получу больше, я хотел бы знать:
- Это действительно параллельно или я что-то пропустил?Я начинающий с tf.
- Использует ли tf 3 ГБ (или еще больше, если бы у меня было) видеопамяти для всех потоков, или для каждого потока требуются свои собственные 3 ГБ?Если второе, могу ли я переписать код для выполнения первым?
- Почему не освобождается память после закрытия сеанса и завершения потока?Я прочитал это , но решения выглядят радикально.