text: import tensorflow as tf
  import numpy as np
  import argparse
  import socket
  import importlib
  import time
  import os
  import scipy.misc
  import sys
  BASE_DIR = os.path.dirname(os.path.abspath(__file__))
  sys.path.append(BASE_DIR)
  sys.path.append(os.path.join(BASE_DIR, 'models'))
  sys.path.append(os.path.join(BASE_DIR, 'utils'))
  import provider
  import show3d_balls
  sys.path.append(os.path.join(ROOT_DIR, 'data_prep'))
  import part_dataset
  
  
  parser = argparse.ArgumentParser()
  parser.add_argument('--gpu', type=int, default=0, help='GPU to use [default: GPU 0]')
  parser.add_argument('--num_point', type=int, default=2048, help='Point Number [default: 2048]')
  parser.add_argument('--category', default='Airplane', help='Which single class to train on [default: Airplane]')
  parser.add_argument('--model', default='pointnet2_part_seg', help='Model name [default: pointnet2_part_seg]')
  parser.add_argument('--model_path', default='log/model.ckpt', help='model checkpoint file path [default: log/model.ckpt]')
  FLAGS = parser.parse_args()
  
  
  MODEL_PATH = FLAGS.model_path
  GPU_INDEX = FLAGS.gpu
  NUM_POINT = FLAGS.num_point
  MODEL = importlib.import_module(FLAGS.model) # import network module
  NUM_CLASSES = 4
  DATA_PATH = os.path.join(ROOT_DIR, 'data', 'shapenetcore_partanno_segmentation_benchmark_v0_normal')
  TEST_DATASET = part_dataset.PartDataset(root=DATA_PATH, npoints=NUM_POINT, classification=False, class_choice=FLAGS.category, split='test')
  
  def get_model(batch_size, num_point):
      with tf.Graph().as_default():
          with tf.device('/gpu:'+str(GPU_INDEX)):
              pointclouds_pl, labels_pl = MODEL.placeholder_inputs(batch_size, num_point)
              is_training_pl = tf.placeholder(tf.bool, shape=())
              pred, end_points = MODEL.get_model(pointclouds_pl, is_training_pl)
              loss = MODEL.get_loss(pred, labels_pl, end_points)
              saver = tf.train.Saver()
          # Create a session
          config = tf.ConfigProto()
          config.gpu_options.allow_growth = True
          config.allow_soft_placement = True
          sess = tf.Session(config=config)
          # Restore variables from disk.
          saver.restore(sess, MODEL_PATH)
          ops = {'pointclouds_pl': pointclouds_pl,
                 'labels_pl': labels_pl,
                 'is_training_pl': is_training_pl,
                 'pred': pred,
                 'loss': loss}
          return sess, ops
  
  def inference(sess, ops, pc, batch_size):
      ''' pc: BxNx3 array, return BxN pred '''
      assert pc.shape[0]%batch_size == 0
      num_batches = pc.shape[0]/batch_size
      logits = np.zeros((pc.shape[0], pc.shape[1], NUM_CLASSES))
      for i in range(num_batches):
          feed_dict = {ops['pointclouds_pl']: pc[i*batch_size:(i+1)*batch_size,...],
                       ops['is_training_pl']: False}
          batch_logits = sess.run(ops['pred'], feed_dict=feed_dict)
          logits[i*batch_size:(i+1)*batch_size,...] = batch_logits
      return np.argmax(logits, 2)
  
  if __name__=='__main__':
  
      import matplotlib.pyplot as plt
      cmap = plt.cm.get_cmap("hsv", 4)
      cmap = np.array([cmap(i) for i in range(10)])[:,:3]
  
      for i in range(len(TEST_DATASET)):
          ps, seg = TEST_DATASET[i]
          sess, ops = get_model(batch_size=1, num_point=ps.shape[0])
          segp = inference(sess, ops, np.expand_dims(ps,0), batch_size=1)
          segp = segp.squeeze()
  
          gt = cmap[seg, :]
          pred = cmap[segp, :]
          show3d_balls.showpoints(ps, gt, pred, ballradius=8)
  