Сбой класса трекера TensorFlow при создании второго экземпляра - сеансы должны быть уникальными?
У меня есть трекер TensorFlow, который я собираю, чтобы он соответствовал стандартному формату OpenCV Tracker. Эти трекеры могут быть использованы так (я заменил вычисления и вещи, которые не используют тензорный поток с ~<this>~
):
tracker = cv2.Tracker_create("type")
status_init = tracker.init( initial_frame, bbox)
while True:
status, frame = camera.read()
bbox = tracker.update(frame)
~<draw bbox onto frame>~
cv2.imshow("Tracking", frame)
cv2.waitKey(1)
И вот как я хотел бы структурировать использование моего класса трекера TensorFlow.
ТЕМ НЕ МЕНИЕ! В настоящее время мой код класса выглядит так:
class MyTracker(object):
'My Tracking class code'
with tf.Session() as sess:
print "Session Created!"
def __init__(self, params):
~<non-tensorflow object variables being set>~
self.sess.run(tf.global_variables_initializer())
def __del__(self):
print "Session Closed?"
def init(self, initial_image, initial_bbox)
try:
~<non-tensorflow calculations and things>~
self.templates = self.sess.run(self.templates_,
feed_dict={
~<vars into tf>~
})
return True
except:
return False
def update(self, image):
try:
~<non-tensorflow calculations and things>~
scores_ = self.sess.run(self.scores,
feed_dict={
~<vars into tf>~
})
~<more non-tensorflow stuff>~
bbox = ~<non-tensorflow things>~
if ~<stuff>~:
new_templates = self.sess.run(self.templates_,
feed_dict={
~vars into tf>~
})
~<yet more non-tensorflow calculations>~
return True, bbox
except:
return False, (0, 0, 0, 0)
Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно иметь возможность создавать несколько трекеров в моем коде одновременно, однако они пытаются использовать один и тот же сеанс, и это вызывает проблему (на самом деле я заменяю старый, надеясь, что это будет мусором). собрал, но я должен иметь возможность иметь два объекта трекера в случае необходимости):
ValueError: Variable conv1/W already exists, disallowed. Did you mean to set reuse=True in VarScope?
Я хотел бы, чтобы любой экземпляр этого класса создавал свою собственную сессию. Однако вместо того, чтобы использовать обертку "with tf.Session() as sess:" для всех моих функций-членов класса, я попытался просто добавить:
self.sess = tf.Session()
к __init__
функция, чтобы попытаться дать каждому экземпляру свой уникальный сеанс, но у него точно такая же проблема, и, кроме того, я не могу использовать хороший __enter__
а также __exit__
методы, которые приходят с использованием with
заявление.
Поскольку в моем тестовом коде в настоящее время я использую только один трекер, я могу просто вызвать мою функцию 'init' для моего объекта трекера с новыми initial_image и initial_bbox, не создавая совершенно новый объект.
ОДНАКО, мне нужно уметь!
Любая помощь с этой надоедливой проблемой была бы очень признательна!