0

我使用tensorflow 1.15深度学习对点云进行语义分割。由于每个训练图块中有不同数量的点,我从该图块中随机选择 1.024 来为我的深度学习模型获得统一数量的点。但是,在测试时,我想使用所有点来预测。为了解决这个问题,我使用 bin 来组织点云。

import numpy as np

BIN_EDGES = np.arange(1000, 11000, 1000)   # 10 bin edges

我用来BIN_EDGES将我的点云上采样到所需的点数。例如,如果一个点云有 2244 个点,它会被上采样(随机重复)到下一个更大的 bin_edge,在这种情况下为 3000。

使用这种方法,我需要为每个 bin 边缘设置 1 个模型,并且预测效果很好。由于在我的情况下,过多的随机重复会导致性能下降,因此我想使用超过 10 个 bin 边缘。但是,如果我将 bin 边缘的数量增加到 100 甚至 1000,则该过程会变得非常缓慢。

这是我的问题的代码。不幸的是,我无法提供一个最低限度的工作示例,因为我的项目很大。

import tensorflow as tf
import numpy as np

NUM_FEATURES = 3
BATCH_SIZE = 1

BIN_EDGES = np.arange(1000, 11000, 1000)   # 10 bin edges
# BIN_EDGES = np.arange(100, 10100, 100)   # 100 bin edges
# BIN_EDGES = np.arange(10, 10010, 10)     # 1000 bin edges

with tf.Graph().as_default():
    with tf.device('/gpu:0'):

        pred_softmaxs = []
        pointcloud_pls = []
        labels_pls = []
        is_training_pls = []

        # create a models for each bin edge
        for bin_edge in BIN_EDGES:

            # get placeholders
            pointclouds_pl = tf.compat.v1.placeholder(tf.float32, shape=(BATCH_SIZE, bin_edge, NUM_FEATURES))
            labels_pl = tf.compat.v1.placeholder(tf.int32, shape=(BATCH_SIZE, bin_edge))
            is_training_pl = tf.placeholder(tf.bool, shape=())

            pred = get_model(pointclouds_pl, is_training_pl)

            pred_softmaxs.append(tf.nn.softmax(pred))
            pointcloud_pls.append(pointclouds_pl)
            labels_pls.append(labels_pl)
            is_training_pls.append(is_training_pl)
        
        # Add ops to save and restore all the variables.
        saver = tf.train.Saver()

    # Create a session
    config = tf.ConfigProto()
    config.gpu_options.allow_growth = True
    config.allow_soft_placement = True
    config.log_device_placement = True
    sess = tf.Session(config=config)

    # Restore variables from disk.
    saver.restore(sess, MODEL_PATH)
    print("Model restored.")

    ops = {'pointclouds_pl': pointcloud_pls,
        'labels_pl': labels_pls,
        'is_training_pl': is_training_pls,
        'pred_softmax': pred_softmaxs}

    for filename in filelist:

        # load data
        data, label = load_data(filename)

        # upsample to next bigger bin edge
        data, label, bin_idx = upsample(data, label, BIN_EDGES)

        feed_dict = {ops['pointclouds_pl'][bin_idx]: data,
                ops['labels_pl'][bin_idx]: label,
                ops['is_training_pl'][bin_idx]: False}

        # this step gets really slow for many bin edges
        pred_val = sess.run([ops['pred_softmax'][bin_idx]], feed_dict=feed_dict)[0]

有谁知道为什么会这样?这sess.run()是对于大量 bin 边缘需要很长时间的步骤。我真的不能说,因为每个文件只使用一个创建的模型。

4

0 回答 0