Несколько графов в одном сеансе Tensorflow

В настоящее время я пытаюсь реализовать код, который позволит моему дрону перемещаться в помещении с использованием tenorflow. Мне нужно запустить две модели за один сеанс.

Одна предназначена для основной навигации - это переработанная модель Inception V3, отвечающая за классификацию изображений в коридоре и выполнение решения о движении вперед, влево или вправо - вторая - модель отслеживания объектов, которая будет отслеживать объекты и вычислять их относительное расстояние до камера.

Я не знаю, как использовать несколько графиков в одном сеансе, поэтому я попытался создать отдельный сеанс внутри цикла, что создает большие накладные расходы и заставляет мой скрипт работать с 0 FPS.

def inception_model():
# Graph for the InceptionV3 Model
graph = load_graph('inception_v3_frozen/inception_v3_2016_08_28_frozen.pb')

with tf.Session(graph = graph) as sess:
    while camera.isOpened():
        ok, img = camera.read()
        cv.imwrite("frame_temp.jpeg", img)
        t = read_tensor_from_image('frame_temp.jpeg')

        input_layer = "input"
        output_layer = "InceptionV3/Predictions/Reshape_1"

        input_name = "import/" + input_layer
        output_name = "import/" + output_layer

        input_operation = graph.get_operation_by_name(input_name)
        output_operation = graph.get_operation_by_name(output_name)

        results = sess.run(output_operation.outputs[0], {
            input_operation.outputs[0] : t
        })
        results = np.squeeze(results)

        top_k = results.argsort()[-5:][::-1]
        for i in top_k:
            print(labels[i], results[i])

# inception_model()
with tf.Session(graph = object_detection_graph) as sess:
    while camera.isOpened():
        ok, img = camera.read()
        cv.imwrite("frame_temp.jpeg", img)
        img = np.array(img)
        rows = img.shape[0]
        cols = img.shape[1]

        inp = cv.resize(img, (299, 299))

        # inception_model()
        # # Graph for the InceptionV3 Model
        # graph = load_graph('inception_v3_frozen/inception_v3_2016_08_28_frozen.pb')

        # t = read_tensor_from_image('frame_temp.jpeg')

        # input_layer = "input"
        # output_layer = "InceptionV3/Predictions/Reshape_1"

        # input_name = "import/" + input_layer
        # output_name = "import/" + output_layer

        # input_operation = graph.get_operation_by_name(input_name)
        # output_operation = graph.get_operation_by_name(output_name)

        # with tf.Session(graph = graph) as sess:
        #     results = sess.run(output_operation.outputs[0], {
        #         input_operation.outputs[0] : t
        #     })
        # results = np.squeeze(results)

        # top_k = results.argsort()[-5:][::-1]
        # for i in top_k:
        #     print(labels[i], results[i])


        inp = inp[:, :, [2, 1, 0]]  # BGR2RGB


        # Run the model
        out = sess.run([object_detection_graph.get_tensor_by_name('num_detections:0'),
                        object_detection_graph.get_tensor_by_name('detection_scores:0'),
                        object_detection_graph.get_tensor_by_name('detection_boxes:0'),
                        object_detection_graph.get_tensor_by_name('detection_classes:0')],
                    feed_dict={'image_tensor:0': inp.reshape(1, inp.shape[0], inp.shape[1], 3)})

person Mark Anthony Sulleza    schedule 14.04.2018    source источник


Ответы (1)


Вам не нужно создавать новые сеансы на каждой итерации. Создайте их один раз и продолжайте вызывать их методы выполнения. Tensorflow поддерживает несколько активных сессий.

Другой вариант - иметь один объект Graph и один объект Session. График может содержать обе ваши модели как несвязанные подграфы. Когда вы запрашиваете тензор в Session.run(), Tensorflow запускает только то, что необходимо для вычисления запрошенного вами тензора. Таким образом, другой подграф не будет работать (хотя потребуется некоторое, возможно, очень небольшое, время, чтобы его удалить)

person iga    schedule 19.04.2018
comment
Привет! Не могли бы вы описать, как это сделать? Спасибо. - person Shreyas Pimpalgaonkar; 08.08.2018
comment
Что делать? Если вы говорите о другом варианте, то с вашей стороны делать нечего. просто создайте свой график и используйте session.run, чтобы вычислить то, что вы хотите. Я просто указал, что TensorFlow не будет выполнять ненужные операции. - person iga; 08.08.2018