def get_instance_seg_v1_net(point_cloud, one_hot_vec, is_training, bn_decay, end_points):
    ' 3D instance segmentation PointNet v1 network.\n    Input:\n        point_cloud: TF tensor in shape (B,N,4)\n            frustum point clouds with XYZ and intensity in point channels\n            XYZs are in frustum coordinate\n        one_hot_vec: TF tensor in shape (B,3)\n            length-3 vectors indicating predicted object type\n        is_training: TF boolean scalar\n        bn_decay: TF float scalar\n        end_points: dict\n    Output:\n        logits: TF tensor in shape (B,N,2), scores for bkg/clutter and object\n        end_points: dict\n    '
    batch_size = point_cloud.get_shape()[0].value
    num_point = point_cloud.get_shape()[1].value
    net = tf.expand_dims(point_cloud, 2)
    net = tf_util.conv2d(net, 64, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv1', bn_decay=bn_decay)
    net = tf_util.conv2d(net, 64, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv2', bn_decay=bn_decay)
    point_feat = tf_util.conv2d(net, 64, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv3', bn_decay=bn_decay)
    net = tf_util.conv2d(point_feat, 128, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv4', bn_decay=bn_decay)
    net = tf_util.conv2d(net, 1024, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv5', bn_decay=bn_decay)
    global_feat = tf_util.max_pool2d(net, [num_point, 1], padding='VALID', scope='maxpool')
    global_feat = tf.concat([global_feat, tf.expand_dims(tf.expand_dims(one_hot_vec, 1), 1)], axis=3)
    global_feat_expand = tf.tile(global_feat, [1, num_point, 1, 1])
    concat_feat = tf.concat(axis=3, values=[point_feat, global_feat_expand])
    net = tf_util.conv2d(concat_feat, 512, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv6', bn_decay=bn_decay)
    net = tf_util.conv2d(net, 256, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv7', bn_decay=bn_decay)
    net = tf_util.conv2d(net, 128, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv8', bn_decay=bn_decay)
    net = tf_util.conv2d(net, 128, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv9', bn_decay=bn_decay)
    net = tf_util.dropout(net, is_training, 'dp1', keep_prob=0.5)
    logits = tf_util.conv2d(net, 2, [1, 1], padding='VALID', stride=[1, 1], activation_fn=None, scope='conv10')
    logits = tf.squeeze(logits, [2])
    return (logits, end_points)
3D instance segmentation PointNet v1 network.
Input:
    point_cloud: TF tensor in shape (B,N,4)
        frustum point clouds with XYZ and intensity in point channels
        XYZs are in frustum coordinate
    one_hot_vec: TF tensor in shape (B,3)
        length-3 vectors indicating predicted object type
    is_training: TF boolean scalar
    bn_decay: TF float scalar
    end_points: dict
Output:
    logits: TF tensor in shape (B,N,2), scores for bkg/clutter and object
    end_points: dict
def get_instance_seg_v1_net(point_cloud, one_hot_vec, is_training, bn_decay, end_points):
    ' 3D instance segmentation PointNet v1 network.\n    Input:\n        point_cloud: TF tensor in shape (B,N,4)\n            frustum point clouds with XYZ and intensity in point channels\n            XYZs are in frustum coordinate\n        one_hot_vec: TF tensor in shape (B,3)\n            length-3 vectors indicating predicted object type\n        is_training: TF boolean scalar\n        bn_decay: TF float scalar\n        end_points: dict\n    Output:\n        logits: TF tensor in shape (B,N,2), scores for bkg/clutter and object\n        end_points: dict\n    '
    batch_size = point_cloud.get_shape()[0].value
    num_point = point_cloud.get_shape()[1].value
    net = tf.expand_dims(point_cloud, 2)
    net = tf_util.conv2d(net, 64, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv1', bn_decay=bn_decay)
    net = tf_util.conv2d(net, 64, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv2', bn_decay=bn_decay)
    point_feat = tf_util.conv2d(net, 64, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv3', bn_decay=bn_decay)
    net = tf_util.conv2d(point_feat, 128, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv4', bn_decay=bn_decay)
    net = tf_util.conv2d(net, 1024, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv5', bn_decay=bn_decay)
    global_feat = tf_util.max_pool2d(net, [num_point, 1], padding='VALID', scope='maxpool')
    global_feat = tf.concat([global_feat, tf.expand_dims(tf.expand_dims(one_hot_vec, 1), 1)], axis=3)
    global_feat_expand = tf.tile(global_feat, [1, num_point, 1, 1])
    concat_feat = tf.concat(axis=3, values=[point_feat, global_feat_expand])
    net = tf_util.conv2d(concat_feat, 512, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv6', bn_decay=bn_decay)
    net = tf_util.conv2d(net, 256, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv7', bn_decay=bn_decay)
    net = tf_util.conv2d(net, 128, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv8', bn_decay=bn_decay)
    net = tf_util.conv2d(net, 128, [1, 1], padding='VALID', stride=[1, 1], bn=True, is_training=is_training, scope='conv9', bn_decay=bn_decay)
    net = tf_util.dropout(net, is_training, 'dp1', keep_prob=0.5)
    logits = tf_util.conv2d(net, 2, [1, 1], padding='VALID', stride=[1, 1], activation_fn=None, scope='conv10')
    logits = tf.squeeze(logits, [2])
    return (logits, end_points)