def main(): net = PSPNet(num_classes=voc.num_classes).cuda() print('load model ' + args['snapshot']) net.load_state_dict(torch.load(os.path.join(ckpt_path, args['exp_name'], args['snapshot']))) net.eval() mean_std = ([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) val_input_transform = standard_transforms.Compose([ standard_transforms.ToTensor(), standard_transforms.Normalize(*mean_std) ]) test_set = voc.VOC('test', transform=val_input_transform) test_loader = DataLoader(test_set, batch_size=1, num_workers=8, shuffle=False) check_mkdir(os.path.join(ckpt_path, args['exp_name'], 'test')) for vi, data in enumerate(test_loader): img_name, img = data img_name = img_name[0] img = Variable(img, volatile=True).cuda() output = net(img) prediction = output.data.max(1)[1].squeeze_(1).squeeze_(0).cpu().numpy() prediction = voc.colorize_mask(prediction) prediction.save(os.path.join(ckpt_path, args['exp_name'], 'test', img_name + '.png')) print('%d / %d' % (vi + 1, len(test_loader)))
def main(): net = fcn8s.FCN8s(num_classes=voc.num_classes,pretrained=False).cuda() #net = deeplab_resnet.Res_Deeplab().cuda() #net = dl.Res_Deeplab().cuda() #net.load_state_dict(torch.load(os.path.join(ckpt_path, args['exp_name'], args['snapshot']))) net.load_state_dict(torch.load(os.path.join(root,model,pth))) net.eval() mean_std = ([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) val_input_transform = standard_transforms.Compose([ standard_transforms.ToTensor(), standard_transforms.Normalize(*mean_std) ]) target_transform = extended_transforms.MaskToTensor() test_set = voc.VOC('eval', transform=val_input_transform,target_transform=target_transform) test_loader = DataLoader(test_set, batch_size=1, num_workers=8, shuffle=False) #check_mkdir(os.path.join(ckpt_path, args['exp_name'], 'test')) predictions = [] masks = [] ious =np.array([]) for vi, data in enumerate(test_loader): img_name, img, msk = data img_name = img_name[0] H,W = img.size()[2:] L = min(H,W) interp_before = nn.UpsamplingBilinear2d(size=(L,L)) interp_after = nn.UpsamplingBilinear2d(size=(H,W)) img = Variable(img, volatile=True).cuda() msk = Variable(msk, volatile=True).cuda() masks.append(msk.data.squeeze_(0).cpu().numpy()) #img = interp_before(img) output = net(img) #output = interp_after(output[3]) prediction = output.data.max(1)[1].squeeze_(1).squeeze_(0).cpu().numpy() #prediction = output.data.max(1)[1].squeeze().cpu().numpy() ious = np.append(ious,get_iou(prediction,masks[-1])) predictions.append(prediction) ## prediction.save(os.path.join(ckpt_path, args['exp_name], 'test', img_name + '.png')) prediction = voc.colorize_mask(prediction) prediction.save(os.path.join(root,'segmented-images',model+'-'+img_name+'.png')) #if vi == 10: # break print('%d / %d' % (vi + 1, len(test_loader))) results = evaluate(predictions,masks,voc.num_classes) print('mean iou = {}'.format(results[2])) print(ious.mean())
def main(): net = PSPNet(num_classes=voc.num_classes).cuda() if len(args['snapshot']) == 0: # net.load_state_dict(torch.load(os.path.join(ckpt_path, 'cityscapes (coarse)-psp_net', 'xx.pth'))) curr_epoch = 1 args['best_record'] = { 'epoch': 0, 'val_loss': 1e10, 'acc': 0, 'acc_cls': 0, 'mean_iu': 0, 'fwavacc': 0 } else: print('training resumes from ' + args['snapshot']) net.load_state_dict( torch.load(os.path.join(ckpt_path, exp_name, args['snapshot']))) split_snapshot = args['snapshot'].split('_') curr_epoch = int(split_snapshot[1]) + 1 args['best_record'] = { 'epoch': int(split_snapshot[1]), 'val_loss': float(split_snapshot[3]), 'acc': float(split_snapshot[5]), 'acc_cls': float(split_snapshot[7]), 'mean_iu': float(split_snapshot[9]), 'fwavacc': float(split_snapshot[11]) } net.train() mean_std = ([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) train_joint_transform = joint_transforms.Compose([ joint_transforms.Scale(args['longer_size']), joint_transforms.RandomRotate(10), joint_transforms.RandomHorizontallyFlip() ]) sliding_crop = joint_transforms.SlidingCrop(args['crop_size'], args['stride_rate'], voc.ignore_label) train_input_transform = standard_transforms.Compose([ standard_transforms.ToTensor(), standard_transforms.Normalize(*mean_std) ]) val_input_transform = standard_transforms.Compose([ standard_transforms.ToTensor(), standard_transforms.Normalize(*mean_std) ]) target_transform = extended_transforms.MaskToTensor() visualize = standard_transforms.Compose([ standard_transforms.Resize(args['val_img_display_size']), standard_transforms.ToTensor() ]) train_set = voc.VOC('train', joint_transform=train_joint_transform, sliding_crop=sliding_crop, transform=train_input_transform, target_transform=target_transform) train_loader = DataLoader(train_set, batch_size=args['train_batch_size'], num_workers=1, shuffle=True, drop_last=True) val_set = voc.VOC('val', transform=val_input_transform, sliding_crop=sliding_crop, target_transform=target_transform) val_loader = DataLoader(val_set, batch_size=1, num_workers=1, shuffle=False, drop_last=True) criterion = CrossEntropyLoss2d(size_average=True, ignore_index=voc.ignore_label).cuda() optimizer = optim.SGD([{ 'params': [ param for name, param in net.named_parameters() if name[-4:] == 'bias' ], 'lr': 2 * args['lr'] }, { 'params': [ param for name, param in net.named_parameters() if name[-4:] != 'bias' ], 'lr': args['lr'], 'weight_decay': args['weight_decay'] }], momentum=args['momentum'], nesterov=True) if len(args['snapshot']) > 0: optimizer.load_state_dict( torch.load( os.path.join(ckpt_path, exp_name, 'opt_' + args['snapshot']))) optimizer.param_groups[0]['lr'] = 2 * args['lr'] optimizer.param_groups[1]['lr'] = args['lr'] check_mkdir(ckpt_path) check_mkdir(os.path.join(ckpt_path, exp_name)) open( os.path.join(ckpt_path, exp_name, str(datetime.datetime.now()) + '.txt'), 'w').write(str(args) + '\n\n') train(train_loader, net, criterion, optimizer, curr_epoch, args, val_loader, visualize)
def main(train_args): net = FCN8s_lightnn(num_classes=voc.num_classes, caffe=True).cuda() if len(train_args['snapshot']) == 0: curr_epoch = 1 train_args['best_record'] = { 'epoch': 0, 'val_loss': 1e10, 'acc': 0, 'acc_cls': 0, 'mean_iu': 0, 'fwavacc': 0 } else: print('training resumes from ' + train_args['snapshot']) net.load_state_dict( torch.load( os.path.join(ckpt_path, exp_name, train_args['snapshot']))) split_snapshot = train_args['snapshot'].split('_') curr_epoch = int(split_snapshot[1]) + 1 train_args['best_record'] = { 'epoch': int(split_snapshot[1]), 'val_loss': float(split_snapshot[3]), 'acc': float(split_snapshot[5]), 'acc_cls': float(split_snapshot[7]), 'mean_iu': float(split_snapshot[9]), 'fwavacc': float(split_snapshot[11]) } net.train() mean_std = ([103.939, 116.779, 123.68], [1.0, 1.0, 1.0]) input_transform = standard_transforms.Compose([ extended_transforms.FlipChannels(), standard_transforms.ToTensor(), standard_transforms.Lambda(lambda x: x.mul_(255)), standard_transforms.Normalize(*mean_std) ]) target_transform = extended_transforms.MaskToTensor() restore_transform = standard_transforms.Compose([ extended_transforms.DeNormalize(*mean_std), standard_transforms.Lambda(lambda x: x.div_(255)), standard_transforms.ToPILImage(), extended_transforms.FlipChannels() ]) visualize = standard_transforms.Compose([ standard_transforms.Scale(400), standard_transforms.CenterCrop(400), standard_transforms.ToTensor() ]) train_set = voc.VOC('train', transform=input_transform, target_transform=target_transform) train_loader = DataLoader(train_set, batch_size=1, num_workers=4, shuffle=True) val_set = voc.VOC('val', transform=input_transform, target_transform=target_transform) val_loader = DataLoader(val_set, batch_size=1, num_workers=4, shuffle=False) criterion = CrossEntropyLoss2d(size_average=False, ignore_index=voc.ignore_label).cuda() optimizer = optim.SGD([{ 'params': [ param for name, param in net.named_parameters() if name[-4:] == 'bias' ], 'lr': 2 * train_args['lr'] }, { 'params': [ param for name, param in net.named_parameters() if name[-4:] != 'bias' ], 'lr': train_args['lr'], 'weight_decay': train_args['weight_decay'] }], momentum=train_args['momentum']) if len(train_args['snapshot']) > 0: optimizer.load_state_dict( torch.load( os.path.join(ckpt_path, exp_name, 'opt_' + train_args['snapshot']))) optimizer.param_groups[0]['lr'] = 2 * train_args['lr'] optimizer.param_groups[1]['lr'] = train_args['lr'] check_mkdir(ckpt_path) check_mkdir(os.path.join(ckpt_path, exp_name)) open( os.path.join(ckpt_path, exp_name, str(datetime.datetime.now()) + '.txt'), 'w').write(str(train_args) + '\n\n') scheduler = ReduceLROnPlateau(optimizer, 'min', patience=train_args['lr_patience'], min_lr=1e-10, verbose=True) for epoch in range(curr_epoch, train_args['epoch_num'] + 1): train(train_loader, net, criterion, optimizer, epoch, train_args) val_loss = validate(val_loader, net, criterion, optimizer, epoch, train_args, restore_transform, visualize) scheduler.step(val_loss)
def main(train_args): if cuda.is_available(): net = fcn8s.FCN8s(num_classes=voc.num_classes, pretrained=False).cuda() #net = MBO.MBO().cuda() #net = deeplab_resnet.Res_Deeplab().cuda() else: print('cuda is not available') net = fcn8s.FCN8s(num_classes=voc.num_classes, pretrained=True) net.train() mean_std = ([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) input_transform = standard_transforms.Compose([ standard_transforms.ToTensor(), standard_transforms.Normalize(*mean_std) ]) target_transform = extended_transforms.MaskToTensor() restore_transform = standard_transforms.Compose([ extended_transforms.DeNormalize(*mean_std), standard_transforms.ToPILImage(), ]) visualize = standard_transforms.Compose([ standard_transforms.Scale(400), standard_transforms.CenterCrop(400), standard_transforms.ToTensor() ]) train_set = voc.VOC('train', set='benchmark', transform=input_transform, target_transform=target_transform) train_loader = DataLoader(train_set, batch_size=bsz, num_workers=8, shuffle=True) val_set = voc.VOC('val', set='voc', transform=input_transform, target_transform=target_transform) val_loader = DataLoader(val_set, batch_size=1, num_workers=4, shuffle=False) criterion = CrossEntropyLoss2d(size_average=False, ignore_index=voc.ignore_label).cuda() optimizer = optim.Adam([{ 'params': [ param for name, param in net.named_parameters() if name[-4:] == 'bias' ], 'lr': train_args['lr'] }, { 'params': [ param for name, param in net.named_parameters() if name[-4:] != 'bias' ], 'lr': train_args['lr'] }], betas=(train_args['momentum'], 0.999)) scheduler = ReduceLROnPlateau(optimizer, 'min', patience=2, min_lr=1e-10, verbose=True) lr0 = 1e-7 max_epoch = 50 max_iter = max_epoch * len(train_loader) #optimizer = optim.SGD(net.parameters(),lr = lr0, momentum = 0.9, weight_decay = 0.0005) scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=2, gamma=0.5) log_dir = os.path.join(root, 'logs', 'voc-fcn') time = datetime.datetime.now().strftime('%d-%m-%H-%M') train_file = 'train_log' + time + '.txt' val_file = 'val_log' + time + '.txt' #os.makedirs(log_dir,exist_ok=True) training_log = open(os.path.join(log_dir, train_file), 'w') val_log = open(os.path.join(log_dir, val_file), 'w') curr_epoch = 1 for epoch in range(curr_epoch, train_args['epoch_num'] + 1): train(train_loader, net, criterion, optimizer, epoch, train_args, training_log, max_iter, lr0) val_loss = validate(val_loader, net, criterion, optimizer, epoch, train_args, restore_transform, visualize, val_log) scheduler.step(val_loss) lr_tmp = 0.0 k = 0 for param_group in optimizer.param_groups: lr_tmp += param_group['lr'] k += 1 val_log.write('learning rate = {}'.format(str(lr_tmp / k)) + '\n')
def main(train_args): net = PSPNet(num_classes=voc.num_classes).cuda() if len(train_args['snapshot']) == 0: curr_epoch = 1 train_args['best_record'] = {'epoch': 0, 'val_loss': 1e10, 'acc': 0, 'acc_cls': 0, 'mean_iu': 0, 'fwavacc': 0} else: print ('training resumes from ' + train_args['snapshot']) net.load_state_dict(torch.load(os.path.join(ckpt_path, exp_name, train_args['snapshot']))) split_snapshot = train_args['snapshot'].split('_') curr_epoch = int(split_snapshot[1]) + 1 train_args['best_record'] = {'epoch': int(split_snapshot[1]), 'val_loss': float(split_snapshot[3]), 'acc': float(split_snapshot[5]), 'acc_cls': float(split_snapshot[7]), 'mean_iu': float(split_snapshot[9]), 'fwavacc': float(split_snapshot[11])} net.train() mean_std = ([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) train_simul_transform = simul_transforms.Compose([ simul_transforms.RandomSized(train_args['input_size']), simul_transforms.RandomRotate(10), simul_transforms.RandomHorizontallyFlip() ]) val_simul_transform = simul_transforms.Scale(train_args['input_size']) train_input_transform = standard_transforms.Compose([ extended_transforms.RandomGaussianBlur(), standard_transforms.ToTensor(), standard_transforms.Normalize(*mean_std) ]) val_input_transform = standard_transforms.Compose([ standard_transforms.ToTensor(), standard_transforms.Normalize(*mean_std) ]) target_transform = extended_transforms.MaskToTensor() restore_transform = standard_transforms.Compose([ extended_transforms.DeNormalize(*mean_std), standard_transforms.ToPILImage(), ]) visualize = standard_transforms.Compose([ standard_transforms.Scale(400), standard_transforms.CenterCrop(400), standard_transforms.ToTensor() ]) train_set = voc.VOC('train', joint_transform=train_simul_transform, transform=train_input_transform, target_transform=target_transform) train_loader = DataLoader(train_set, batch_size=train_args['train_batch_size'], num_workers=8, shuffle=True) val_set = voc.VOC('val', joint_transform=val_simul_transform, transform=val_input_transform, target_transform=target_transform) val_loader = DataLoader(val_set, batch_size=1, num_workers=8, shuffle=False) criterion = CrossEntropyLoss2d(size_average=True, ignore_index=voc.ignore_label).cuda() optimizer = optim.SGD([ {'params': [param for name, param in net.named_parameters() if name[-4:] == 'bias'], 'lr': 2 * train_args['lr']}, {'params': [param for name, param in net.named_parameters() if name[-4:] != 'bias'], 'lr': train_args['lr'], 'weight_decay': train_args['weight_decay']} ], momentum=train_args['momentum']) if len(train_args['snapshot']) > 0: optimizer.load_state_dict(torch.load(os.path.join(ckpt_path, exp_name, 'opt_' + train_args['snapshot']))) optimizer.param_groups[0]['lr'] = 2 * train_args['lr'] optimizer.param_groups[1]['lr'] = train_args['lr'] check_mkdir(ckpt_path) check_mkdir(os.path.join(ckpt_path, exp_name)) open(os.path.join(ckpt_path, exp_name, str(datetime.datetime.now()) + '.txt'), 'w').write(str(train_args) + '\n\n') train(train_loader, net, criterion, optimizer, curr_epoch, train_args, val_loader, restore_transform, visualize)
def main(train_args): net = PSPNet(num_classes=voc.num_classes).cuda() if len(train_args['snapshot']) == 0: curr_epoch = 1 train_args['best_record'] = { 'epoch': 0, 'val_loss': 1e10, 'acc': 0, 'acc_cls': 0, 'mean_iu': 0, 'fwavacc': 0 } else: print('training resumes from ' + train_args['snapshot']) net.load_state_dict( torch.load( os.path.join(ckpt_path, exp_name, train_args['snapshot']))) split_snapshot = train_args['snapshot'].split('_') curr_epoch = int(split_snapshot[1]) + 1 train_args['best_record'] = { 'epoch': int(split_snapshot[1]), 'val_loss': float(split_snapshot[3]), 'acc': float(split_snapshot[5]), 'acc_cls': float(split_snapshot[7]), 'mean_iu': float(split_snapshot[9]), 'fwavacc': float(split_snapshot[11]) } mean_std = ([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) input_transform = standard_transforms.Compose([ ToTensor(), Normalize([.485, .456, .406], [.229, .224, .225]), ]) joint_transform = joint_transforms.Compose([ joint_transforms.CenterCrop(224), # joint_transforms.Scale(2), joint_transforms.RandomHorizontallyFlip(), ]) target_transform = standard_transforms.Compose([ extended_transforms.MaskToTensor(), ]) restore_transform = standard_transforms.Compose([ extended_transforms.DeNormalize(*mean_std), standard_transforms.ToPILImage(), ]) visualize = standard_transforms.Compose([ standard_transforms.Scale(400), standard_transforms.CenterCrop(400), standard_transforms.ToTensor() ]) val_input_transform = standard_transforms.Compose([ CenterCrop(224), ToTensor(), Normalize([.485, .456, .406], [.229, .224, .225]), ]) val_target_transform = standard_transforms.Compose([ CenterCrop(224), extended_transforms.MaskToTensor(), ]) train_set = voc.VOC('train', transform=input_transform, target_transform=target_transform, joint_transform=joint_transform) train_loader = DataLoader(train_set, batch_size=4, num_workers=4, shuffle=True) val_set = voc.VOC('val', transform=val_input_transform, target_transform=val_target_transform) val_loader = DataLoader(val_set, batch_size=4, num_workers=4, shuffle=False) # criterion = CrossEntropyLoss2d(size_average=True, ignore_index=voc.ignore_label).cuda() criterion = torch.nn.CrossEntropyLoss(ignore_index=voc.ignore_label).cuda() optimizer = optim.SGD(net.parameters(), lr=train_args['lr'], momentum=train_args['momentum'], weight_decay=train_args['weight_decay']) check_mkdir(ckpt_path) check_mkdir(os.path.join(ckpt_path, exp_name)) # open(os.path.join(ckpt_path, exp_name, 'loss_001_aux_SGD_momentum_95_random_lr_001.txt'), 'w').write(str(train_args) + '\n\n') for epoch in range(curr_epoch, train_args['epoch_num'] + 1): # adjust_learning_rate(optimizer,epoch,net,train_args) train(train_loader, net, criterion, optimizer, epoch, train_args) validate(val_loader, net, criterion, optimizer, epoch, train_args, restore_transform, visualize) adjust_learning_rate(optimizer, epoch, net, train_args)