From 41f8bfe6b5cff97ae0fb6a8988ddfdc1efc0d65d Mon Sep 17 00:00:00 2001 From: ubuntu Date: Thu, 23 Aug 2018 22:44:10 +0900 Subject: [PATCH] modify the model so that it can take arbitrary batch size --- models/frustum_pointnets_v1.py | 3 +++ models/frustum_pointnets_v2.py | 5 ++++- models/model_util.py | 13 ++++++------- models/pointnet_util.py | 6 +++--- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/models/frustum_pointnets_v1.py b/models/frustum_pointnets_v1.py index afe21f96..dca59afd 100644 --- a/models/frustum_pointnets_v1.py +++ b/models/frustum_pointnets_v1.py @@ -163,6 +163,9 @@ def get_model(point_cloud, one_hot_vec, is_training, bn_decay=None): # select masked points and translate to masked points' centroid object_point_cloud_xyz, mask_xyz_mean, end_points = \ point_cloud_masking(point_cloud, logits, end_points) + + end_points['object_point_cloud_xyz'] = object_point_cloud_xyz + end_points['mask_xyz_mean'] = mask_xyz_mean # T-Net and coordinate translation center_delta, end_points = get_center_regression_net(\ diff --git a/models/frustum_pointnets_v2.py b/models/frustum_pointnets_v2.py index d8d383d6..dd692a6d 100644 --- a/models/frustum_pointnets_v2.py +++ b/models/frustum_pointnets_v2.py @@ -105,7 +105,7 @@ def get_3d_box_estimation_v2_net(object_point_cloud, one_hot_vec, is_training=is_training, bn_decay=bn_decay, scope='ssg-layer3') # Fully connected layers - net = tf.reshape(l3_points, [batch_size, -1]) + net = tf.contrib.layers.flatten(l3_points) net = tf.concat([net, one_hot_vec], axis=1) net = tf_util.fully_connected(net, 512, bn=True, is_training=is_training, scope='fc1', bn_decay=bn_decay) @@ -147,6 +147,9 @@ def get_model(point_cloud, one_hot_vec, is_training, bn_decay=None): # select masked points and translate to masked points' centroid object_point_cloud_xyz, mask_xyz_mean, end_points = \ point_cloud_masking(point_cloud, logits, end_points) + + end_points['object_point_cloud_xyz'] = object_point_cloud_xyz + end_points['mask_xyz_mean'] = mask_xyz_mean # T-Net and coordinate translation center_delta, end_points = get_center_regression_net(\ diff --git a/models/model_util.py b/models/model_util.py index 8d961e2c..26148868 100644 --- a/models/model_util.py +++ b/models/model_util.py @@ -81,8 +81,8 @@ def get_box3d_corners_helper(centers, headings, sizes): #print x_corners, y_corners, z_corners c = tf.cos(headings) s = tf.sin(headings) - ones = tf.ones([N], dtype=tf.float32) - zeros = tf.zeros([N], dtype=tf.float32) + ones = tf.ones(tf.shape(headings), dtype=tf.float32) + zeros = tf.zeros(tf.shape(headings), dtype=tf.float32) row1 = tf.stack([c,zeros,s], axis=1) # (N,3) row2 = tf.stack([zeros,ones,zeros], axis=1) row3 = tf.stack([-s,zeros,c], axis=1) @@ -106,16 +106,15 @@ def get_box3d_corners(center, heading_residuals, size_residuals): heading_bin_centers = tf.constant(np.arange(0,2*np.pi,2*np.pi/NUM_HEADING_BIN), dtype=tf.float32) # (NH,) headings = heading_residuals + tf.expand_dims(heading_bin_centers, 0) # (B,NH) - mean_sizes = tf.expand_dims(tf.constant(g_mean_size_arr, dtype=tf.float32), 0) + size_residuals # (B,NS,1) + mean_sizes = tf.expand_dims(tf.constant(g_mean_size_arr, dtype=tf.float32), 0) # (B,NS,1) sizes = mean_sizes + size_residuals # (B,NS,3) sizes = tf.tile(tf.expand_dims(sizes,1), [1,NUM_HEADING_BIN,1,1]) # (B,NH,NS,3) headings = tf.tile(tf.expand_dims(headings,-1), [1,1,NUM_SIZE_CLUSTER]) # (B,NH,NS) centers = tf.tile(tf.expand_dims(tf.expand_dims(center,1),1), [1,NUM_HEADING_BIN, NUM_SIZE_CLUSTER,1]) # (B,NH,NS,3) - N = batch_size*NUM_HEADING_BIN*NUM_SIZE_CLUSTER - corners_3d = get_box3d_corners_helper(tf.reshape(centers, [N,3]), tf.reshape(headings, [N]), tf.reshape(sizes, [N,3])) + corners_3d = get_box3d_corners_helper(tf.reshape(centers, [-1,3]), tf.reshape(headings, [-1,]), tf.reshape(sizes, [-1,3])) - return tf.reshape(corners_3d, [batch_size, NUM_HEADING_BIN, NUM_SIZE_CLUSTER, 8, 3]) + return tf.reshape(corners_3d, [-1, NUM_HEADING_BIN, NUM_SIZE_CLUSTER, 8, 3]) def huber_loss(error, delta): @@ -152,7 +151,7 @@ def parse_output_to_tensors(output, end_points): size_residuals_normalized = tf.slice(output, [0,3+NUM_HEADING_BIN*2+NUM_SIZE_CLUSTER], [-1,NUM_SIZE_CLUSTER*3]) size_residuals_normalized = tf.reshape(size_residuals_normalized, - [batch_size, NUM_SIZE_CLUSTER, 3]) # BxNUM_SIZE_CLUSTERx3 + [-1, NUM_SIZE_CLUSTER, 3]) # BxNUM_SIZE_CLUSTERx3 end_points['size_scores'] = size_scores end_points['size_residuals_normalized'] = size_residuals_normalized end_points['size_residuals'] = size_residuals_normalized * \ diff --git a/models/pointnet_util.py b/models/pointnet_util.py index 332e8cc2..193eb64d 100644 --- a/models/pointnet_util.py +++ b/models/pointnet_util.py @@ -69,9 +69,9 @@ def sample_and_group_all(xyz, points, use_xyz=True): ''' batch_size = xyz.get_shape()[0].value nsample = xyz.get_shape()[1].value - new_xyz = tf.constant(np.tile(np.array([0,0,0]).reshape((1,1,3)), (batch_size,1,1)),dtype=tf.float32) # (batch_size, 1, 3) - idx = tf.constant(np.tile(np.array(range(nsample)).reshape((1,1,nsample)), (batch_size,1,1))) - grouped_xyz = tf.reshape(xyz, (batch_size, 1, nsample, 3)) # (batch_size, npoint=1, nsample, 3) + new_xyz = tf.zeros(tf.shape(xyz[:,:1,:]),dtype=tf.float32) # (batch_size, 1, 3) + idx = tf.tile(np.array(range(nsample)).reshape((1,1,nsample)), tf.shape(xyz[:,:1,:1])) + grouped_xyz = tf.reshape(xyz, (-1, 1, nsample, 3)) # (batch_size, npoint=1, nsample, 3) if points is not None: if use_xyz: new_points = tf.concat([xyz, points], axis=2) # (batch_size, 16, 259)