我使用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 边缘需要很长时间的步骤。我真的不能说,因为每个文件只使用一个创建的模型。