def main(): args = parser.parse_args() with open(args.config) as f: config = yaml.load(f) print("\n**************************") for k, v in config['common'].items(): setattr(args, k, v) print('\n[%s]:'%(k), v) print("\n**************************\n") try: os.makedirs(args.save_path) except OSError: pass train_transforms = transforms.Compose([ d_utils.PointcloudToTensor() ]) test_transforms = transforms.Compose([ d_utils.PointcloudToTensor() ]) train_dataset = ModelNet40Cls(num_points = args.num_points, root = args.data_root, transforms=train_transforms) train_dataloader = DataLoader( train_dataset, batch_size=args.batch_size, shuffle=True, num_workers=int(args.workers) ) test_dataset = ModelNet40Cls(num_points = args.num_points, root = args.data_root, transforms=test_transforms, train=False) test_dataloader = DataLoader( test_dataset, batch_size=args.batch_size, shuffle=False, num_workers=int(args.workers) ) model = RSCNN_SSN(num_classes = args.num_classes, input_channels = args.input_channels, relation_prior = args.relation_prior, use_xyz = True) model.cuda() optimizer = optim.Adam( model.parameters(), lr=args.base_lr, weight_decay=args.weight_decay) lr_lbmd = lambda e: max(args.lr_decay**(e // args.decay_step), args.lr_clip / args.base_lr) bnm_lmbd = lambda e: max(args.bn_momentum * args.bn_decay**(e // args.decay_step), args.bnm_clip) lr_scheduler = lr_sched.LambdaLR(optimizer, lr_lbmd) bnm_scheduler = pt_utils.BNMomentumScheduler(model, bnm_lmbd) if args.checkpoint is not '': model.load_state_dict(torch.load(args.checkpoint)) print('Load model successfully: %s' % (args.checkpoint)) criterion = nn.CrossEntropyLoss() num_batch = len(train_dataset)/args.batch_size # training train(train_dataloader, test_dataloader, model, criterion, optimizer, lr_scheduler, bnm_scheduler, args, num_batch)
def main(): args = parser.parse_args() with open(args.config) as f: config = yaml.load(f) print("\n**************************") for k, v in config['common'].items(): setattr(args, k, v) print('\n[%s]:' % (k), v) print("\n**************************\n") try: os.makedirs(args.save_path) except OSError: pass train_dataset = ModelNet40Cls(num_points=args.num_points, root=args.data_root, transforms=None) train_dataloader = DataLoader(train_dataset, batch_size=args.batch_size, shuffle=True, num_workers=int(args.workers), pin_memory=True) test_dataset_z = ModelNet40Cls(num_points=args.num_points, root=args.data_root, transforms=None, train=False) test_dataloader_z = DataLoader(test_dataset_z, batch_size=args.batch_size, shuffle=False, num_workers=int(args.workers), pin_memory=True) test_dataset_so3 = ModelNet40Cls(num_points=args.num_points, root=args.data_root, transforms=None, train=False) test_dataloader_so3 = DataLoader(test_dataset_so3, batch_size=args.batch_size, shuffle=False, num_workers=int(args.workers), pin_memory=True) if args.model == "pointnet2_ssn": model = PointNet2_SSN(num_classes=args.num_classes) model.cuda() elif args.model == "rscnn_ssn": model = RSCNN_SSN(num_classes=args.num_classes) model.cuda() model = torch.nn.DataParallel(model) elif args.model == "rscnn_msn": model = RSCNN_MSN(num_classes=args.num_classes) model.cuda() model = torch.nn.DataParallel(model) else: print("Doesn't support this model") return optimizer = optim.Adam(model.parameters(), lr=args.base_lr, weight_decay=args.weight_decay) lr_lbmd = lambda e: max(args.lr_decay**(e // args.decay_step), args.lr_clip / args.base_lr) bnm_lmbd = lambda e: max( args.bn_momentum * args.bn_decay** (e // args.decay_step), args.bnm_clip) lr_scheduler = lr_sched.LambdaLR(optimizer, lr_lbmd) bnm_scheduler = pt_utils.BNMomentumScheduler(model, bnm_lmbd) if args.checkpoint is not '': model.load_state_dict(torch.load(args.checkpoint)) print('Load model successfully: %s' % args.checkpoint) criterion = nn.CrossEntropyLoss() num_batch = len(train_dataset) / args.batch_size # training train(train_dataloader, test_dataloader_z, test_dataloader_so3, model, criterion, optimizer, lr_scheduler, bnm_scheduler, args, num_batch)
def main(): args = parser.parse_args() with open(args.config) as f: config = yaml.load(f) for k, v in config['common'].items(): setattr(args, k, v) test_transforms = transforms.Compose([d_utils.PointcloudToTensor()]) test_dataset = ModelNet40Cls(num_points=args.num_points, root=args.data_root, transforms=test_transforms, train=False) test_dataloader = DataLoader(test_dataset, batch_size=args.batch_size, shuffle=False, num_workers=int(args.workers), pin_memory=True) model = DensePoint(num_classes=args.num_classes, input_channels=args.input_channels, use_xyz=True) model.cuda() if args.checkpoint is not '': model.load_state_dict(torch.load(args.checkpoint)) print('Load model successfully: %s' % (args.checkpoint)) # evaluate PointcloudScale = d_utils.PointcloudScale() # initialize random scaling model.eval() global_acc = 0 for i in range(NUM_REPEAT): preds = [] labels = [] s = time.time() for j, data in enumerate(test_dataloader, 0): points, target = data points, target = points.cuda(), target.cuda() points, target = Variable(points, volatile=True), Variable(target, volatile=True) # points [batch_size, num_points, dimensions], e.g., [256, 2048, 3] # furthest point sampling # fps_idx = pointnet2_utils.furthest_point_sample(points, 1200) # (B, npoint) # random sampling fps_idx = np.random.randint(0, points.shape[1] - 1, size=[points.shape[0], 1200]) fps_idx = torch.from_numpy(fps_idx).type(torch.IntTensor).cuda() pred = 0 for v in range(NUM_VOTE): new_fps_idx = fps_idx[:, np.random.choice(1200, args. num_points, False)] new_points = pointnet2_utils.gather_operation( points.transpose(1, 2).contiguous(), new_fps_idx).transpose(1, 2).contiguous() if v > 0: new_points.data = PointcloudScale(new_points.data) pred += F.softmax(model(new_points), dim=1) pred /= NUM_VOTE target = target.view(-1) _, pred_choice = torch.max(pred.data, -1) preds.append(pred_choice) labels.append(target.data) e = time.time() preds = torch.cat(preds, 0) labels = torch.cat(labels, 0) acc = (preds == labels).sum() / labels.numel() if acc > global_acc: global_acc = acc print('Repeat %3d \t Acc: %0.6f' % (i + 1, acc)) print('time (secs) for 1 epoch: ', (e - s)) print('\nBest voting acc: %0.6f' % (global_acc))
args = parse_args() BASE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data') transforms = transforms.Compose([ d_utils.PointcloudToTensor(), d_utils.PointcloudScale(), d_utils.PointcloudRotate(), d_utils.PointcloudRotatePerturbation(), d_utils.PointcloudTranslate(), d_utils.PointcloudJitter(), d_utils.PointcloudRandomInputDropout() ]) test_set = ModelNet40Cls(args.num_points, BASE_DIR, transforms=transforms, train=False) test_loader = DataLoader(test_set, batch_size=args.batch_size, shuffle=True, num_workers=2, pin_memory=True) train_set = ModelNet40Cls(args.num_points, BASE_DIR, transforms=transforms) train_loader = DataLoader(train_set, batch_size=args.batch_size, shuffle=True, num_workers=2, pin_memory=True) model = Pointnet(input_channels=0, num_classes=40, use_xyz=True)
def main(): args = parser.parse_args() with open(args.config) as f: config = yaml.load(f) for k, v in config['common'].items(): setattr(args, k, v) test_transforms = transforms.Compose([d_utils.PointcloudToTensor()]) test_dataset = ModelNet40Cls(num_points=args.num_points, root=args.data_root, transforms=test_transforms, train=False) test_dataloader = DataLoader(test_dataset, batch_size=args.batch_size, shuffle=False, num_workers=int(args.workers), pin_memory=False) model = RSCNN_SSN(num_classes=args.num_classes, input_channels=args.input_channels, relation_prior=args.relation_prior, use_xyz=True) # for multi GPU device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") if torch.cuda.is_available() and torch.cuda.device_count() >= 2: model = nn.DataParallel(model, device_ids=[0, 1]) model.to(device) elif torch.cuda.is_available() and torch.cuda.device_count() == 1: model.cuda() if args.checkpoint is not '': model.load_state_dict(torch.load(args.checkpoint)) print('Load model successfully: %s' % (args.checkpoint)) # evaluate PointcloudScale = d_utils.PointcloudScale() # initialize random scaling model.eval() global_acc = 0 for i in range(NUM_REPEAT): preds = [] labels = [] for j, data in enumerate(test_dataloader, 0): points, target = data points, target = points.cuda(), target.cuda() points, target = Variable(points, volatile=True), Variable(target, volatile=True) # fastest point sampling fps_idx = pointnet2_utils.furthest_point_sample( points, 1200) # (B, npoint) pred = 0 for v in range(NUM_VOTE): new_fps_idx = fps_idx[:, np.random.choice(1200, args. num_points, False)] new_points = pointnet2_utils.gather_operation( points.transpose(1, 2).contiguous(), new_fps_idx).transpose(1, 2).contiguous() if v > 0: new_points.data = PointcloudScale(new_points.data) pred += F.softmax(model(new_points), dim=1) pred /= NUM_VOTE target = target.view(-1) _, pred_choice = torch.max(pred.data, -1) preds.append(pred_choice) labels.append(target.data) preds = torch.cat(preds, 0) labels = torch.cat(labels, 0) acc = (preds == labels).sum() / labels.numel() if acc > global_acc: global_acc = acc print('Repeat %3d \t Acc: %0.6f' % (i + 1, acc)) print('\nBest voting acc: %0.6f' % (global_acc))
def main(): global logger args = parser.parse_args() with open(args.config) as f: config = yaml.safe_load(f) for k, v in config['common'].items(): setattr(args, k, v) output_dir = args.save_path if output_dir: import time msg = 'init_train' output_dir = os.path.join( output_dir, "train_{}_{}".format(time.strftime("%m_%d_%H_%M_%S"), msg)) os.makedirs(output_dir) logger = get_logger("RS-CNN", output_dir, prefix="train") logger.info("Running with config:\n{}".format(args)) train_transforms = transforms.Compose([d_utils.PointcloudToTensor()]) test_transforms = transforms.Compose([d_utils.PointcloudToTensor()]) train_dataset = ModelNet40Cls(num_points=args.num_points, root=args.data_root, transforms=train_transforms) train_dataloader = DataLoader(train_dataset, batch_size=args.batch_size, shuffle=True, num_workers=int(args.workers), pin_memory=True) test_dataset = ModelNet40Cls(num_points=args.num_points, root=args.data_root, transforms=test_transforms, train=False) test_dataloader = DataLoader(test_dataset, batch_size=args.batch_size, shuffle=False, num_workers=int(args.workers), pin_memory=True) model = RSCNN_SSN(num_classes=args.num_classes, input_channels=args.input_channels, relation_prior=args.relation_prior, use_xyz=True) model.cuda() optimizer = optim.Adam(model.parameters(), lr=args.base_lr, weight_decay=args.weight_decay) lr_lbmd = lambda e: max(args.lr_decay**(e // args.decay_step), args.lr_clip / args.base_lr) bnm_lmbd = lambda e: max( args.bn_momentum * args.bn_decay** (e // args.decay_step), args.bnm_clip) lr_scheduler = lr_sched.LambdaLR(optimizer, lr_lbmd) bnm_scheduler = pt_utils.BNMomentumScheduler(model, bnm_lmbd) if args.checkpoint is not '': model.load_state_dict(torch.load(args.checkpoint)) logger.info('Load model successfully: %s' % (args.checkpoint)) criterion = nn.CrossEntropyLoss() num_batch = len(train_dataset) / args.batch_size # training train(train_dataloader, test_dataloader, model, criterion, optimizer, lr_scheduler, bnm_scheduler, args, num_batch)