예제 #1
0
def test():
    from utils.transforms import RandomSizedCrop, IgnoreLabelClass, ToTensorLabel, NormalizeOwn, ZeroPadding, OneHotEncode, RandomSizedCrop3
    from torchvision.transforms import ToTensor, Compose
    import matplotlib.pyplot as plt

    imgtr = [ToTensor(), NormalizeOwn()]
    # sigmoid
    labtr = [IgnoreLabelClass(), ToTensorLabel(tensor_type=torch.FloatTensor)]
    cotr = [RandomSizedCrop3((512, 512))]

    dataset_dir = '/media/data/seg_dataset'
    trainset = Corrosion(home_dir,
                         dataset_dir,
                         img_transform=Compose(imgtr),
                         label_transform=Compose(labtr),
                         co_transform=Compose(cotr),
                         split=args.split,
                         labeled=True)
    trainloader = DataLoader(trainset_l,
                             batch_size=1,
                             shuffle=True,
                             num_workers=2,
                             drop_last=True)

    for batch_id, (img, mask, _, emask) in enumerate(trainloader):
        img, mask, emask = img.numpy()[0], mask.numpy()[0], emask.numpy()[0]
        fig, (ax1, ax2, ax3) = plt.subplots(1, 3)
        ax1.imshow(img)
        ax2.imshow(mask)
        ax3.imshow(emask)
        plt.show()
예제 #2
0
def main():

    args = parse_args()

    random.seed(0)
    torch.manual_seed(0)
    if not args.nogpu:
        torch.cuda.manual_seed_all(0)

    if args.no_norm:
        imgtr = [ToTensor()]
    else:
        imgtr = [ToTensor(),NormalizeOwn()]

    # softmax
    labtr = [IgnoreLabelClass(),ToTensorLabel()]
    # labtr = [IgnoreLabelClass(),ToTensorLabel(tensor_type=torch.FloatTensor)]
    # cotr = [RandomSizedCrop((320,320))] # (321,321)
    cotr = [RandomSizedCrop3((320,320))]

    print("dataset_dir: ", args.dataset_dir)
    trainset_l = Corrosion(home_dir,args.dataset_dir,img_transform=Compose(imgtr), 
                           label_transform=Compose(labtr),co_transform=Compose(cotr),
                           split=args.split,labeled=True)
    trainloader_l = DataLoader(trainset_l,batch_size=args.batch_size,shuffle=True,
                               num_workers=2,drop_last=True)

    if args.mode == 'semi':
        trainset_u = Corrosion(home_dir,args.dataset_dir,img_transform=Compose(imgtr), 
                               label_transform=Compose(labtr),co_transform=Compose(cotr),
                               split=args.split,labeled=False)
        trainloader_u = DataLoader(trainset_u,batch_size=args.batch_size,shuffle=True,
                                   num_workers=2,drop_last=True)

    #########################
    # Validation Dataloader #
    ########################
    if args.val_orig:
        if args.no_norm:
            imgtr = [ZeroPadding(),ToTensor()]
        else:
            imgtr = [ZeroPadding(),ToTensor(),NormalizeOwn()]
        labtr = [IgnoreLabelClass(),ToTensorLabel()]
        # labtr = [IgnoreLabelClass(),ToTensorLabel(tensor_type=torch.FloatTensor)]
        cotr = []
    else:
        if args.no_norm:
            imgtr = [ToTensor()]
        else:
            imgtr = [ToTensor(),NormalizeOwn()]
        labtr = [IgnoreLabelClass(),ToTensorLabel()]
        # labtr = [IgnoreLabelClass(),ToTensorLabel(tensor_type=torch.FloatTensor)]
        # cotr = [RandomSizedCrop3((320,320))] # (321,321)
        cotr = [RandomSizedCrop3((320,320))]

    valset = Corrosion(home_dir,args.dataset_dir,img_transform=Compose(imgtr), \
        label_transform = Compose(labtr),co_transform=Compose(cotr),train_phase=False)
    valoader = DataLoader(valset,batch_size=1)

    #############
    # GENERATOR #
    #############
    # generator = deeplabv2.ResDeeplab()

    # softmax generator: in_chs=3, out_chs=2
    generator = unet.AttU_Net()
    # model_summary = generator.cuda()

    init_weights(generator,args.init_net)

    if args.init_net != 'unet':
        optimG = optim.SGD(filter(lambda p: p.requires_grad, \
            generator.parameters()),lr=args.g_lr,momentum=0.9,\
            weight_decay=0.0001,nesterov=True)
    else:
        optimG = optim.Adam(filter(lambda p: p.requires_grad, \
            generator.parameters()),args.g_lr, [0.5, 0.999])

    if not args.nogpu:
        generator = nn.DataParallel(generator).cuda()

    #################
    # DISCRIMINATOR #
    ################
    if args.mode != "base":
        # softmax generator
        discriminator = Dis(in_channels=2)
        # model_summary = discriminator.cuda()
        # summary(model_summary, (2, 320, 320))
        if args.d_optim == 'adam':
            optimD = optim.Adam(filter(lambda p: p.requires_grad, \
                discriminator.parameters()),lr = args.d_lr,weight_decay=0.0001)
        else:
            optimD = optim.SGD(filter(lambda p: p.requires_grad, \
                discriminator.parameters()),lr=args.d_lr,weight_decay=0.0001,momentum=0.5,nesterov=True)

        if not args.nogpu:
            discriminator = nn.DataParallel(discriminator).cuda()

    if args.mode == 'base':
        train_base(generator,optimG,trainloader_l,valoader,args)
    elif args.mode == 'adv':
        train_adv(generator,discriminator,optimG,optimD,trainloader_l,valoader,args)
    elif args.mode == 'semi':
        train_semi(generator,discriminator,optimG,optimD,trainloader_l,trainloader_u,valoader,args)
    else:
        # train_semir(generator,discriminator,optimG,optimD,trainloader_l,valoader,args)
        print("training mode incorrect")
예제 #3
0
def validate_sim(net,data_dir,train_s_idx,train_e_idx,val_s_idx,val_e_idx,gpu):
    global GPU
    GPU = gpu
    predictions = None
    gt = None
    val_img_arr = []
    val_cls_arr = []
    train_img_arr = []
    train_cls_arr = []
    for v_idx in np.arange(val_s_idx,val_e_idx+1):
         val_img = Image.open(os.path.join(data_dir,"img",str(v_idx)+'.tif'))
         val_cls = Image.open(os.path.join(data_dir,"cls",str(v_idx)+'.png')).convert('P')
         val_img_arr.append(ToTensorTIF()(val_img))
         val_cls_arr.append(ToTensorLabel()(val_cls))

    for t_idx in np.arange(train_s_idx,train_e_idx+1):
        train_img = Image.open(os.path.join(data_dir,"img",str(t_idx)+'.tif'))
        train_cls = Image.open(os.path.join(data_dir,"cls",str(t_idx)+'.png')).convert('P')
        train_img = ToTensorTIF()(train_img)
        train_cls = ToTensorLabel()(train_cls)

        train_img_arr.append(train_img)
        train_cls_arr.append(train_cls)

    for v_idx in np.arange(val_s_idx,val_e_idx+1):
        v_idx = v_idx - val_s_idx
        val_img = val_img_arr[v_idx]
        val_cls = val_cls_arr[v_idx]

        if val_img.dim() == 2:
            val_img = val_img.unsqueeze(0)
        if val_cls.dim() == 2:
            val_cls = val_cls.unsqueeze(0)

        assert(val_img.dim() == 3)
        assert(val_cls.dim() == 3)
        if gpu:
            val_img = val_img.cuda()
            val_Cls = val_cls.cuda()
        if predictions is None:
            predictions = torch.zeros(((val_e_idx - val_s_idx +1),nclasses,) + val_img[0].size()).byte()
            gt = torch.zeros(((val_e_idx - val_s_idx + 1),) + val_img[0].size()).byte()
        gt[v_idx] = val_cls[0]
        # Select 50 Random Traning examples to propagate the labels from
        train_images = np.random.random_integers(train_s_idx,train_e_idx,50)

        for t_idx in np.arange(train_s_idx,train_e_idx+1):
            t_idx = t_idx - train_s_idx
            train_img = train_img_arr[t_idx]
            train_cls = train_cls_arr[t_idx]

            if train_img.dim() == 2:
                train_img = train_img.unsqueeze(0)
            if train_cls.dim() == 2:
                train_cls = train_cls.unsqueeze(0)
            if gpu:
                train_img = train_img.cuda()
                train_cls = train_cls.cuda()

            assert(train_img.dim() == 3)
            assert(train_cls.dim() == 3)

            out_img,out_cls_oh = transform_vols(train_img,val_img,train_cls,val_cls,net)
            predictions[v_idx] += out_cls_oh

    _,predictions = torch.max(predictions,dim=1)
    score = dice_score(gt.numpy(),predictions.numpy(),nclasses)
    score = np.average(score,axis=0)
    return score
예제 #4
0
파일: infer.py 프로젝트: yaokmallorca/ASSS
def main():
    home_dir = os.path.dirname(os.path.realpath(__file__))
    dataset_dir = '/media/data/seg_dataset/corrosion/'
    test_img_list = os

    parser = argparse.ArgumentParser()
    parser.add_argument("dataset_dir",
                        help="A directory containing img (Images) \
                        and cls (GT Segmentation) folder")
    parser.add_argument("snapshot", help="Snapshot with the saved model")
    parser.add_argument("--val_orig",
                        help="Do Inference on original size image.\
                        Otherwise, crop to 321x321 like in training ",
                        action='store_true')
    parser.add_argument("--norm",help="Normalize the test images",\
                        action='store_true')
    args = parser.parse_args()
    # print(args.val_orig, args.norm)
    if args.val_orig:
        img_transform = transforms.Compose([ToTensor()])
        if args.norm:
            img_transform = transforms.Compose(
                [ToTensor(), NormalizeOwn(dataset='corrosion')])
        label_transform = transforms.Compose(
            [IgnoreLabelClass(), ToTensorLabel()])
        co_transform = transforms.Compose([RandomSizedCrop((321, 321))])

        testset = Corrosion(home_dir, args.dataset_dir,img_transform=img_transform, \
            label_transform = label_transform,co_transform=co_transform,train_phase=False)
        testloader = DataLoader(testset, batch_size=1)
    else:
        img_transform = transforms.Compose([ZeroPadding(), ToTensor()])
        if args.norm:
            img_transform = img_transform = transforms.Compose(
                [ZeroPadding(),
                 ToTensor(),
                 NormalizeOwn(dataset='corrosion')])
        label_transform = transforms.Compose(
            [IgnoreLabelClass(), ToTensorLabel()])

        testset = Corrosion(home_dir,args.dataset_dir,img_transform=img_transform, \
            label_transform=label_transform,train_phase=False)
        testloader = DataLoader(testset, batch_size=1)

    generator = deeplabv2.ResDeeplab()
    assert (os.path.isfile(args.snapshot))
    snapshot = torch.load(args.snapshot)

    saved_net = {
        k.partition('module.')[2]: v
        for i, (k, v) in enumerate(snapshot['state_dict'].items())
    }
    print('Snapshot Loaded')
    generator.load_state_dict(saved_net)
    generator.eval()
    generator = nn.DataParallel(generator).cuda()
    print('Generator Loaded')
    n_classes = 2

    gts, preds = [], []

    print('Prediction Goint to Start')

    # TODO: Crop out the padding before prediction
    for img_id, (img, gt_mask, _) in enumerate(testloader):
        print("Generating Predictions for Image {}".format(img_id))
        gt_mask = gt_mask.numpy()[0]
        img = Variable(img.cuda())
        out_pred_map = generator(img)

        # Get hard prediction
        soft_pred = out_pred_map.data.cpu().numpy()[0]
        soft_pred = soft_pred[:, :gt_mask.shape[0], :gt_mask.shape[1]]
        hard_pred = np.argmax(soft_pred, axis=0).astype(np.uint8)

        for gt_, pred_ in zip(gt_mask, hard_pred):
            gts.append(gt_)
            preds.append(pred_)
    score, class_iou = scores(gts, preds, n_class=n_classes)

    print("Mean IoU: {}".format(score))
예제 #5
0
파일: train.py 프로젝트: mohit-sh/mri-seg
def main():
    args = parse_arguments()
    args_str = str(vars(args))
    global w_init
    w_init = args.weight_init

    # Setup tensorboardX logger
    # logger = tbx.SummaryWriter(log_dir = args.log_dir,comment=args.exp_name)
    # logger.add_text('training details',args_str,0)

    # Setup Visdom Logger
    vis = visdom.Visdom(server=args.visdom_server,
                        port=int(args.visdom_port),
                        env=args.exp_name)
    vis.close(
        win=None)  # Close all existing windows from the current environment

    vis.text(args_str)
    ##############################################
    # Visdom Windows for Transformation Heatmaps #
    ##############################################

    #############################################
    # TRAINING DATASET: GENERIC TRANSFORMATION ##
    #############################################
    img_transform = [ToTensorTIF()]
    label_transform = [ToTensorLabel()]
    if args.dataset == "sim":
        trainset = Sim(args.data_dir_2d,
                       args.train_s_idx,
                       args.train_e_idx,
                       co_transform=Compose([]),
                       img_transform=Compose(img_transform),
                       label_transform=Compose(label_transform))
    if args.dataset == "ibsr":
        trainset = IBSRv1(homedir,
                          args.data_dir_2d,
                          co_transform=Compose([]),
                          img_transform=Compose(img_transform),
                          label_transform=Compose(label_transform))
    if args.dataset == "mrbrains":
        trainset = MRBrainS(homedir,
                            args.data_dir_2d,
                            co_transform=Compose([]),
                            img_transform=Compose(img_transform),
                            label_transform=Compose(label_transform))
    trainloader = DataLoader(trainset,
                             batch_size=args.batch_size,
                             shuffle=True,
                             drop_last=True)
    print("Dataset Loaded")

    #####################
    # PARAMETER NETWORK #
    ####################

    # net = UNetV1(args.nker)
    net = UNetSmall(args.nker)
    if torch.cuda.is_available():
        net = nn.DataParallel(net).cuda()
    print("Network Loaded")
    net.apply(weight_init)

    #############
    # OPTIMIZER #
    #############
    opt = optim.Adam(filter(lambda p: p.requires_grad, \
                net.parameters()),lr = args.lr,weight_decay=args.l2_weight)

    ##################################################################
    ### GENERATE A BASE GRID USING IDENTITY AFFINE TRANSFORMATION ####
    ##################################################################
    theta = torch.FloatTensor([1, 0, 0, 0, 1, 0])
    theta = theta.view(2, 3)
    theta = theta.expand(args.batch_size, 2, 3)
    if torch.cuda.is_available():
        theta = theta.cuda()

    theta = Variable(theta)
    basegrid_img = F.affine_grid(theta, torch.Size((args.batch_size, 1, H, W)))
    basegrid_label = F.affine_grid(
        theta, torch.Size((args.batch_size, nclasses, H, W)))

    best_score = [0, 0, 0, 0]

    ##############################################
    # Resume training is args.resume is not None #
    ##############################################
    scheduler = StepLR(opt,
                       step_size=args.step_lr_step_size,
                       gamma=args.step_lr_gamma)
    if args.resume is not None:
        print("Resuming Training from {}".format(args.resume))
        snapshot = torch.load(args.resume)
        args.start_epoch = snapshot['epoch']
        best_score = snapshot['best_score']
        net.load_state_dict(snapshot['net'])
        opt.load_state_dict(snapshot['optimizer'])

    else:
        print("No Checkpoint Found")

    #####################
    # VISDOM LOSS SETUP #
    #####################
    win_loss_total = vis.line(Y=np.empty(1), opts=dict(title='loss_total'))
    win_loss_sim = vis.line(Y=np.empty(1), opts=dict(title='loss_sim'))
    win_loss_reg = vis.line(Y=np.empty(1), opts=dict(title='loss_reg'))
    win_loss_seg = vis.line(Y=np.empty(1), opts=dict(title='loss seg'))

    #####################
    # VISDOM DICE SETUP #
    #####################
    dice_opts_t1 = dict(
        title='dice_t1',
        legend=['0', '1', '2', '3'],
    )
    dice_opts_t1_ir = dict(
        title='dice_t1_ir',
        legend=['0', '1', '2', '3'],
    )
    dice_opts_t2 = dict(
        title='dice_t2',
        legend=['0', '1', '2', '3'],
    )
    # empty_data = np.empty((1,nclasses))
    # empty_data[...] = np.nan
    # win_dice_t1 = vis.line(Y=empty_data,opts=dice_opts_t1)
    # win_dice_t1_ir = vis.line(Y=empty_data,opts=dice_opts_t1_ir)
    # win_dice_t2 = vis.line(Y=empty_data,opts=dice_opts_t2)
    win_dice_t1 = None
    win_dice_t1_ir = None
    win_dice_t2 = None

    #############
    ## TRAINING #
    #############

    ##########
    # DEBUG  #
    #########
    #val_results = validate_mrbrains(net,args.data_dir_3d,[1,2,3],[4])
    ####################################

    for epoch in np.arange(args.start_epoch, args.max_epoch):
        scheduler.step()

        loss_total = []
        loss_sim = []
        loss_reg = []
        loss_seg = []
        steps = []

        for batch_id, ((img1, label1, ohlabel1, fname1),
                       (img2, label2, ohlabel2,
                        fname2)) in enumerate(trainloader):
            if img1 is None or label1 is None or img2 is None or label2 is None or ohlabel1 is None:
                continue
            net.train()
            itr = len(trainloader) * (epoch) + batch_id
            steps.append(itr)
            ####################
            # Debug Snapshot code
            #################
            if torch.cuda.is_available():
                img1, label1, img2, label2,combimg,ohlabel1 = Variable(img1.cuda()),\
                        Variable(label1.cuda()), Variable(img2.cuda()), Variable(label2.cuda()),\
                        Variable(torch.cat((img1,img2),1).cuda()), Variable(ohlabel1.cuda())
            else:
                img1, label1, img2, label2,combimg, ohlabel1 = Variable(img1), Variable(label1),\
                        Variable(img2), Variable(label2), Variable(torch.cat((img1,img2),1)), Variable(ohlabel1)
            # (disp0,disp1,disp2) = net(combimg)
            # disp0 = reshape_transform(disp0)
            # disp1 = reshape_transform(disp1)
            # disp2 = reshape_transform(disp2)
            disp = net(combimg)
            disp = process_disp(disp)

            ##########################
            ## IMAGE TRANSFORMATION ##
            ##########################
            # grid_img0 = basegrid_img + disp0
            # grid_img1 = basegrid_img + disp1 + disp0
            # grid_img2 = basegrid_img + disp2 + disp1 + disp0
            grid_img = basegrid_img + disp

            # img1t0 = F.grid_sample(img1,grid_img0)
            # img1t1 = F.grid_sample(img1,grid_img1)
            # img1t2 = F.grid_sample(img1,grid_img2)
            img1t = F.grid_sample(img1, grid_img)

            if args.similarity == 'cc':
                # Lsim0 = cc(img1t0.data,img2.data)
                # Lsim1 = cc(img1t1.data,img2.data)
                # Lsim2 = cc(img1t2.data,img2.data)
                # Lsim = Lsim0 + Lsim1 + Lsim2
                Lsim = cc(img1t, img2)
            elif args.similarity == 'l2':
                Lsim = nn.MSELoss()(img1t, img2)

            ###########################
            ### LABEL TRANSFORMATION ##
            ###########################
            Lseg = Variable(torch.Tensor([0]), requires_grad=True)
            if torch.cuda.is_available():
                Lseg = Variable(torch.Tensor([0]).cuda(), requires_grad=True)
            if args.lambdaseg != 0:
                grid_label = basegrid_label + disp
                cprob2 = F.grid_sample(ohlabel1.float(), grid_label)
                logcprob2 = nn.LogSoftmax()(cprob2)
                Lseg = nn.NLLLoss()(logcprob2, label2)

            ###################
            ## REGULARIZATON ##
            ###################
            Lreg = Variable(torch.Tensor([0]), requires_grad=True)
            target = torch.zeros(1)
            if torch.cuda.is_available():
                Lreg = Variable(torch.Tensor([0]).cuda(), requires_grad=True)
            if args.lambdareg != 0:
                # disp = disp.view(-1,2,h,w)
                dx = disp[:, 1:, :, :] - disp[:, :-1, :, :]
                dy = disp[:, :, 1:, :] - disp[:, :, :-1, :]
                # Implement L1 penalty for now
                # Try to constrain the second derivative
                d2dx2 = torch.abs(dx[:, 1:, :, :] - dx[:, :-1, :, :])
                d2dy2 = torch.abs(dy[:, :, 1:, :] - dy[:, :, :-1, :])
                d2dxdy = torch.abs(dx[:, :, 1:, :] - dx[:, :, :-1, :])
                d2dydx = torch.abs(dy[:, 1:, :, :] - dy[:, :-1, :, :])

                d2_mean = (torch.mean(d2dx2) + torch.mean(d2dy2) +
                           torch.mean(d2dxdy) + torch.mean(d2dydx)) / 4

                # dx_mean = torch.mean(dx)
                # dy_mean = torch.mean(dy)
                # target = torch.zeros(1)
                # if args.gpu:
                #     target = target.cuda()
                # Lreg = nn.L1Loss()((dx_mean+dy_mean)/2,Variable(target))
                Lreg = d2_mean
            ######################
            ## PARAMETER UPDATE ##
            ######################
            Ltotal = Lsim + args.lambdareg * Lreg + args.lambdaseg * Lseg
            opt.zero_grad()
            # opt,lr=poly_lr_scheduler(opt, args.lr, itr,max_iter=len(trainloader)*args.max_epoch)
            Ltotal.backward()
            opt.step()

            free_vars(img1, img2, label1, label2, combimg, ohlabel1, ohlabel2,
                      target)

            loss_total.append(Ltotal.data[0])
            loss_reg.append(Lreg.data[0])
            loss_sim.append(Lsim.data[0])
            loss_seg.append(Lseg.data[0])

            if itr % args.error_iter == 0:
                print("[{}][{}] Ltotal: {:.6} Lsim: {:.6f} Lseg: {:.6f} Lreg: {:.6f} ".\
                    format(epoch,itr,Ltotal.data[0],Lsim.data[0],args.lambdaseg*(Lseg.data[0]),Lreg.data[0]))

        ############
        # VALIDATE #
        ############
        if args.dataset == "sim":
            score = validate_sim(net, args.data_dir_2d, args.train_s_idx,
                                 args.train_e_idx, args.val_s_idx,
                                 args.val_e_idx, args.gpu)
        if args.dataset == "ibsr":
            score = validate_ibsr(net, args.data_dir_3d, args.train_vols,
                                  args.val_vols, args.img_suffix,
                                  args.cls_suffix, perm, args.gpu)
        if args.dataset == "mrbrains":
            val_results = validate_mrbrains(
                net, args.data_dir_3d, [1, 2, 3],
                [4])  # Makeshift changes! Be very careful
            dice_t1 = val_results['scores']['t1']
            dice_t1_ir = val_results['scores']['t1_ir']
            dice_t2 = val_results['scores']['t2']
            if torch.cuda.is_available():
                dice_t1 = dice_t1.cpu().numpy()
                dice_t1_ir = dice_t1_ir.cpu().numpy()
                dice_t2 = dice_t2.cpu().numpy()
            else:
                dice_t1 = dice_t1.numpy()
                dice_t1_ir = dice_t1_ir.numpy()
                dice_t2 = dice_t2.numpy()
            print("dice_t1: {}".format(dice_t1))
            print("dice_t1_ir: {}".format(dice_t1_ir))
            print("dice_t2: {}".format(dice_t2))
            score = (dice_t1 + dice_t1_ir + dice_t2) / 3
        # ############
        # # SNAPSHOT #
        # ############
        best_score = take_snapshot(
            best_score, score, opt, net, epoch,
            snapshot_path(args.snapshot_dir, args.exp_name))

        ########################
        ########################
        ## VISUALIZATION CODE ##
        ########################
        ########################

        # ##################
        # # VISUALIZE LOSS #
        # ##################
        vis.line(Y=np.array(loss_total),
                 X=np.array(steps),
                 win=win_loss_total,
                 update='append')
        vis.line(Y=np.array(loss_sim),
                 X=np.array(steps),
                 win=win_loss_sim,
                 update='append')
        vis.line(Y=np.array(loss_reg),
                 X=np.array(steps),
                 win=win_loss_reg,
                 update='append')
        vis.line(Y=np.array(loss_seg),
                 X=np.array(steps),
                 win=win_loss_seg,
                 update='append')

        ########################
        # VISUALIZE THE SCORES #
        ########################
        if win_dice_t1 is None:
            win_dice_t1 = vis.line(Y=dice_t1.reshape(1, nclasses),
                                   X=np.array([epoch]),
                                   opts=dict(title='dice_t1'))
        else:
            vis.line(Y=dice_t1.reshape(1, nclasses),
                     X=np.array([epoch]),
                     win=win_dice_t1,
                     update='append')
        if win_dice_t1_ir is None:
            win_dice_t1_ir = vis.line(Y=dice_t1_ir.reshape(1, nclasses),
                                      X=np.array([epoch]),
                                      opts=dict(title='dice_t1_ir'))
        else:
            vis.line(Y=dice_t1_ir.reshape(1, nclasses),
                     X=np.array([epoch]),
                     win=win_dice_t1_ir,
                     update='append')
        if win_dice_t2 is None:
            win_dice_t2 = vis.line(Y=dice_t2.reshape(1, nclasses),
                                   X=np.array([epoch]),
                                   opts=dict(title='dice_t2'))
        else:
            vis.line(Y=dice_t2.reshape(1, nclasses),
                     X=np.array([epoch]),
                     win=win_dice_t2,
                     update='append')

        # #####################################################################################
        # # VISUALIZE THE TRANFORMATION PARAMETER OF CENTRAL SLICE AS HEATMAP FOR TRAIN VOL 0 #
        # #####################################################################################
        field_t1 = val_results['fields']['t1']
        field_t1_ir = val_results['fields']['t1_ir']
        field_t2 = val_results['fields']['t2']
        if torch.cuda.is_available():
            field_t1 = field_t1.cpu()
            field_t1_ir = field_t1_ir.cpu()
            field_t2 = field_t2.cpu()

        transform_x_t1 = field_t1[0, 0, 100, :, :, 0]
        transform_y_t1 = field_t1[0, 0, 100, :, :, 1]
        transform_x_t1_ir = field_t1_ir[0, 0, 100, :, :, 0]
        transform_y_t1_ir = field_t1_ir[0, 0, 100, :, :, 1]
        transform_x_t2 = field_t2[0, 0, 100, :, :, 0]
        transform_y_t2 = field_t2[0, 0, 100, :, :, 1]

        vis.heatmap(X=transform_x_t1,
                    opts=dict(title="t1_0_x_{}".format(epoch)))
        vis.heatmap(X=transform_y_t1,
                    opts=dict(title="t1_0_y_{}".format(epoch)))
        vis.heatmap(X=transform_x_t1_ir,
                    opts=dict(title="t1_ir_0_x_{}".format(epoch)))
        vis.heatmap(X=transform_y_t1_ir,
                    opts=dict(title="t1_ir_0_y_{}".format(epoch)))
        vis.heatmap(X=transform_x_t2,
                    opts=dict(title="t2_0_x_{}".format(epoch)))
        vis.heatmap(X=transform_y_t2,
                    opts=dict(title="t2_0_y_{}".format(epoch)))

        vis.save([args.exp_name])
예제 #6
0
def evaluate_discriminator():
    home_dir = os.path.dirname(os.path.realpath(__file__))

    parser = argparse.ArgumentParser()
    parser.add_argument("dataset_dir",
                        help="A directory containing img (Images) \
                        and cls (GT Segmentation) folder")
    parser.add_argument("snapshot_g",
                        help="Snapshot with the saved generator model")
    parser.add_argument("snapshot_d",
                        help="Snapshot with the saved discriminator model")
    parser.add_argument("--val_orig",
                        help="Do Inference on original size image.\
                        Otherwise, crop to 320x320 like in training ",
                        action='store_true')
    parser.add_argument("--norm",help="Normalize the test images",\
                        action='store_true')
    args = parser.parse_args()
    # print(args.val_orig, args.norm)
    if args.val_orig:
        img_transform = transforms.Compose([ToTensor()])
        if args.norm:
            img_transform = transforms.Compose(
                [ToTensor(), NormalizeOwn(dataset='corrosion')])
        label_transform = transforms.Compose(
            [IgnoreLabelClass(), ToTensorLabel()])
        # co_transform = transforms.Compose([RandomSizedCrop((320,320))])
        co_transform = transforms.Compose([ResizedImage3((320, 320))])

        testset = Corrosion(home_dir, args.dataset_dir,img_transform=img_transform, \
            label_transform = label_transform,co_transform=co_transform,train_phase=False)
        testloader = DataLoader(testset, batch_size=1)
    else:
        img_transform = transforms.Compose([ZeroPadding(), ToTensor()])
        if args.norm:
            img_transform = img_transform = transforms.Compose(
                [ZeroPadding(),
                 ToTensor(),
                 NormalizeOwn(dataset='corrosion')])
        label_transform = transforms.Compose(
            [IgnoreLabelClass(), ToTensorLabel()])

        testset = Corrosion(home_dir,args.dataset_dir,img_transform=img_transform, \
            label_transform=label_transform,train_phase=False)
        testloader = DataLoader(testset, batch_size=1)

    # generator = deeplabv2.ResDeeplab()
    # generatro = fcn.FCN8s_soft()
    generator = unet.AttU_Net()
    print(args.snapshot_g)
    assert (os.path.isfile(args.snapshot_g))
    snapshot_g = torch.load(args.snapshot_g)

    discriminator = Dis(in_channels=2)
    print(args.snapshot_d)
    assert (os.path.isfile(args.snapshot_d))
    snapshot_d = torch.load(args.snapshot_d)

    saved_net = {
        k.partition('module.')[2]: v
        for i, (k, v) in enumerate(snapshot_g['state_dict'].items())
    }
    print('Generator Snapshot Loaded')
    generator.load_state_dict(saved_net)
    generator.eval()
    generator = nn.DataParallel(generator).cuda()
    print('Generator Loaded')

    saved_net_d = {
        k.partition('module.')[2]: v
        for i, (k, v) in enumerate(snapshot_d['state_dict'].items())
    }
    print('Discriminator Snapshot Loaded')
    discriminator.load_state_dict(saved_net_d)
    discriminator.eval()
    discriminator = nn.DataParallel(discriminator).cuda()
    print('discriminator Loaded')
    n_classes = 2

    gts, preds = [], []
    print('Prediction Goint to Start')
    colorize = VOCColorize()
    palette = make_palette(2)
    # print(palette)
    IMG_DIR = osp.join(args.dataset_dir, 'corrosion/JPEGImages')
    # TODO: Crop out the padding before prediction
    for img_id, (img, gt_mask, _, gte_mask, name) in enumerate(testloader):
        print("Generating Predictions for Image {}".format(img_id))
        gt_mask = gt_mask.numpy()[0]
        img = Variable(img.cuda())
        # img.cpu().numpy()[0]
        img_path = osp.join(IMG_DIR, name[0] + '.jpg')
        print(img_path)
        img_array = cv2.imread(img_path)
        img_array = cv2.resize(img_array, (320, 320),
                               interpolation=cv2.INTER_AREA)
        img_array = cv2.cvtColor(img_array, cv2.COLOR_RGB2BGR)
        out_pred_map = generator(img)
        # print(out_pred_map.size())

        # Get hard prediction
        soft_pred = out_pred_map.data.cpu().numpy()[0]
        # print("gen: ", soft_pred.shape)
        # print(soft_pred.shape)
        soft_pred = soft_pred[:, :gt_mask.shape[0], :gt_mask.shape[1]]
        # print("gen: ", soft_pred.shape)
        # print(soft_pred.shape)
        hard_pred = np.argmax(soft_pred, axis=0).astype(np.uint8)
        # print("gen: ", hard_pred.shape)

        # Get discriminator prediction
        dis_conf = discriminator(out_pred_map)
        dis_confsmax = nn.Softmax2d()(dis_conf)
        # print(dis_conf.size())
        dis_soft_pred = dis_confsmax.data.cpu().numpy()[0]
        # dis_soft_pred[dis_soft_pred<=0.2] = 0
        # dis_soft_pred[dis_soft_pred>0.2] = 1
        # print("dis: ", dis_soft_pred.shape)
        dis_hard_pred = np.argmax(dis_soft_pred, axis=0).astype(np.uint8)
        # print("dis: ", dis_hard_pred.shape)
        # dis_pred = dis_pred[:,:gt_mask.shape[0],:gt_mask.shape[1]]
        # print(soft_pred.shape)
        # dis_hard_pred = np.argmax(dis_pred,axis=0).astype(np.uint8)

        # print(hard_pred.shape, name)
        output = np.asarray(hard_pred, dtype=np.int)
        # print("gen: ", output.shape)
        filename = os.path.join('results', '{}.png'.format(name[0]))
        color_file = Image.fromarray(
            colorize(output).transpose(1, 2, 0), 'RGB')
        color_file.save(filename)

        masked_im = Image.fromarray(vis_seg(img_array, output, palette))
        masked_im.save(filename[0:-4] + '_vis.png')

        # discriminator output
        dis_output = np.asarray(dis_hard_pred, dtype=np.int)
        # print("dis: ", dis_output.shape)
        dis_filename = os.path.join('results',
                                    '{}_dis.png'.format(name[0][0:-4]))
        dis_color_file = Image.fromarray(
            colorize(dis_output).transpose(1, 2, 0), 'RGB')
        dis_color_file.save(dis_filename)

        for gt_, pred_ in zip(gt_mask, hard_pred):
            gts.append(gt_)
            preds.append(pred_)
        # input('s')
    score, class_iou = scores(gts, preds, n_class=n_classes)
    print("Mean IoU: {}".format(score))
def main():

    args = parse_args()

    random.seed(0)
    torch.manual_seed(0)
    if not args.nogpu:
        torch.cuda.manual_seed_all(0)

    if args.no_norm:
        imgtr = [ToTensor()]
    else:
        imgtr = [ToTensor(),NormalizeOwn()]

    labtr = [IgnoreLabelClass(),ToTensorLabel()]
    cotr = [RandomSizedCrop((321,321))]

    trainset_l = PascalVOC(home_dir,args.dataset_dir,img_transform=Compose(imgtr), label_transform=Compose(labtr),co_transform=Compose(cotr),split=args.split,labeled=True)
    trainset_u = PascalVOC(home_dir,args.dataset_dir,img_transform=Compose(imgtr), label_transform=Compose(labtr),co_transform=Compose(cotr),split=args.split,labeled=False)

    trainloader_l = DataLoader(trainset_l,batch_size=args.batch_size,shuffle=True,num_workers=2,drop_last=True)
    trainloader_u = DataLoader(trainset_u,batch_size=args.batch_size,shuffle=True,num_workers=2,drop_last=True)


    #########################
    # Validation Dataloader #
    ########################
    if args.val_orig:
        if args.no_norm:
            imgtr = [ZeroPadding(),ToTensor()]
        else:
            imgtr = [ZeroPadding(),ToTensor(),NormalizeOwn()]
        labtr = [IgnoreLabelClass(),ToTensorLabel()]
        cotr = []
    else:
        if args.no_norm:
            imgtr = [ToTensor()]
        else:
            imgtr = [ToTensor(),NormalizeOwn()]
        labtr = [IgnoreLabelClass(),ToTensorLabel()]
        cotr = [RandomSizedCrop((321,321))]

    valset = PascalVOC(home_dir,args.dataset_dir,img_transform=Compose(imgtr), \
        label_transform = Compose(labtr),co_transform=Compose(cotr),train_phase=False)
    valoader = DataLoader(valset,batch_size=1)

    #############
    # GENERATOR #
    #############
    generator = deeplabv2.ResDeeplab()
    init_weights(generator,args.init_net)

    optimG = optim.SGD(filter(lambda p: p.requires_grad, \
        generator.parameters()),lr=args.g_lr,momentum=0.9,\
        weight_decay=0.0001,nesterov=True)

    if not args.nogpu:
        generator = nn.DataParallel(generator).cuda()

    #################
    # DISCRIMINATOR #
    ################
    if args.mode != "base":
        discriminator = Dis(in_channels=21)
        if args.d_optim == 'adam':
            optimD = optim.Adam(filter(lambda p: p.requires_grad, \
                discriminator.parameters()),lr = args.d_lr,weight_decay=0.0001)
        else:
            optimD = optim.SGD(filter(lambda p: p.requires_grad, \
                discriminator.parameters()),lr=args.d_lr,weight_decay=0.0001,momentum=0.5,nesterov=True)

        if not args.nogpu:
            discriminator = nn.DataParallel(discriminator).cuda()

    if args.mode == 'base':
        train_base(generator,optimG,trainloader_l,valoader,args)
    elif args.mode == 'adv':
        train_adv(generator,discriminator,optimG,optimD,trainloader_l,valoader,args)
    else:
        print("Semi-Supervised training")
        train_semi(generator,discriminator,optimG,optimD,trainloader_l,trainloader_u,valoader,args)
def main():
    # args = parse_args()
    random.seed(0)
    torch.manual_seed(0)

    dict = {
        'home_dir': home_dir,
        'pretrain': str(pretrain),
        'use_cuda': use_cuda,
        'mode': mode,
        'g_lr': g_lr,
        'd_lr': d_lr,
        'lam_semi': lam_semi,
        'lam_adv': lam_adv,
        't_semi': t_semi,
        'batch_size': batch_size,
        'wait_semi': wait_semi,
        'd_optim': d_optim,
        'snapshot_dir': snapshot_dir,
        'd_label_smooth': d_label_smooth,
        'val_orig': val_orig,
        'start_epoch': start_epoch,
        'max_epoch': max_epoch
    }

    json_str = json.dumps(dict, indent=4)
    with open(f_path, 'a') as f:
        f.write(json_str)
        f.write('\n')

    # normalize = Normalize(mean=[0.459], std=[0.250])##PVP
    normalize = Normalize(mean=[0.414], std=[0.227])  ##AP
    if use_cuda:
        torch.cuda.manual_seed_all(0)

    crop_size = 112
    imgtr = [
        CenterCrop((crop_size, crop_size)),
        Resize((112, 112)),
        ToTensor(), normalize
    ]
    labtr = [
        CenterCrop((crop_size, crop_size)),
        Resize((112, 112)),
        ToTensorLabel()
    ]

    cotr = []
    trainset_l = Promise_data(home_dir,
                              img_transform=Compose(imgtr),
                              label_transform=Compose(labtr),
                              co_transform=Compose(cotr),
                              labelled=True,
                              valid=False)
    trainloader_l = DataLoader(trainset_l,
                               batch_size=batch_size,
                               shuffle=True,
                               num_workers=0)

    #########################
    # Validation Dataloader #
    ########################
    if val_orig:  ##使用原图
        if no_norm:
            imgtr = [
                CenterCrop((crop_size, crop_size)),
                Resize((112, 112)),
                ToTensor(), normalize
            ]
        else:
            imgtr = [
                CenterCrop((crop_size, crop_size)),
                Resize((112, 112)),
                ToTensor(),
                NormalizeOwn()
            ]
        labtr = [
            CenterCrop((crop_size, crop_size)),
            Resize((112, 112)),
            ToTensorLabel()
        ]
        cotr = []
    else:
        if no_norm:
            imgtr = [
                CenterCrop((crop_size, crop_size)),
                Resize((112, 112)),
                ToTensor(), normalize
            ]
        else:
            imgtr = [
                CenterCrop((crop_size, crop_size)),
                Resize((112, 112)),
                ToTensor(),
                NormalizeOwn()
            ]
        labtr = [
            CenterCrop((crop_size, crop_size)),
            Resize((112, 112)),
            ToTensorLabel()
        ]
        # cotr = [RandomSizedCrop((112, 112))]
        cotr = []

    # valset = PascalVOC(home_dir,args.dataset_dir,img_transform=Compose(imgtr), \
    #     label_transform = Compose(labtr),co_transform=Compose(cotr),train_phase=False)

    valset = Promise_data(home_dir,
                          img_transform=Compose(imgtr),
                          label_transform=Compose(labtr),
                          co_transform=Compose(cotr),
                          labelled=True,
                          valid=True)
    valoader = DataLoader(valset, batch_size=1)

    #############
    # GENERATOR #
    #############
    generator = ResUNet(in_ch=1, out_ch=2, base_ch=64)
    # if pretrain:
    #     pretrained_weight_path = '/data/lc/PROMISE12/model_save/semi_15.pth.tar'
    #     pretrained_dict = torch.load(pretrained_weight_path)
    #     generator.load_state_dict(pretrained_dict['state_dict'])
    #     if len(pretrained_dict) != 0:
    #         print('加载成功')

    # optimG = optim.SGD(filter(lambda p: p.requires_grad, generator.parameters()),lr=g_lr,momentum=0.9,\
    #     weight_decay=0.0001,nesterov=True)
    optimG = optim.Adam(filter(lambda p: p.requires_grad,
                               generator.parameters()),
                        lr=g_lr,
                        weight_decay=0.0001)
    if use_cuda:
        generator = generator.cuda()

    if mode == 'base':
        train_base(generator, optimG, trainloader_l, valoader, f_path)
예제 #9
0
def main():
    args = parse_args()

    CUR_DIR = os.getcwd()
    with open(osp.join(CUR_DIR, "utils/config_crf.yaml")) as f:
        CRF_CONFIG = Dict(yaml.safe_load(f))

    random.seed(0)
    torch.manual_seed(0)
    if not args.nogpu:
        torch.cuda.manual_seed_all(0)

    if args.no_norm:
        imgtr = [ToTensor()]
    else:
        imgtr = [ToTensor(),NormalizeOwn()]

    # softmax
    labtr = [IgnoreLabelClass(),ToTensorLabel()]
    # labtr = [IgnoreLabelClass(),ToTensorLabel(tensor_type=torch.FloatTensor)]
    # cotr = [RandomSizedCrop((320,320))] # (321,321)
    cotr = [RandomSizedCrop3((320,320))]

    print("dataset_dir: ", args.dataset_dir)
    if args.mode == 'semi':
        split_ratio = 0.8
    else:
        split_ratio = 1.0
    trainset_l = Corrosion(home_dir,args.dataset_dir,img_transform=Compose(imgtr), 
                           label_transform=Compose(labtr),co_transform=Compose(cotr),
                           split=split_ratio,labeled=True)
    trainloader_l = DataLoader(trainset_l,batch_size=args.batch_size,shuffle=True,
                               num_workers=2,drop_last=True)

    if args.mode == 'semi':
        trainset_u = Corrosion(home_dir,args.dataset_dir,img_transform=Compose(imgtr), 
                               label_transform=Compose(labtr),co_transform=Compose(cotr),
                               split=split_ratio,labeled=False)
        trainloader_u = DataLoader(trainset_u,batch_size=args.batch_size,shuffle=True,
                                   num_workers=2,drop_last=True)

    postprocessor = DenseCRF(
        iter_max=CRF_CONFIG.CRF.ITER_MAX,
        pos_xy_std=CRF_CONFIG.CRF.POS_XY_STD,
        pos_w=CRF_CONFIG.CRF.POS_W,
        bi_xy_std=CRF_CONFIG.CRF.BI_XY_STD,
        bi_rgb_std=CRF_CONFIG.CRF.BI_RGB_STD,
        bi_w=CRF_CONFIG.CRF.BI_W,
    )

    #########################
    # Validation Dataloader #
    ########################
    if args.val_orig:
        if args.no_norm:
            imgtr = [ZeroPadding(),ToTensor()]
        else:
            imgtr = [ZeroPadding(),ToTensor(),NormalizeOwn()]
        labtr = [IgnoreLabelClass(),ToTensorLabel()]
        # labtr = [IgnoreLabelClass(),ToTensorLabel(tensor_type=torch.FloatTensor)]
        cotr = []
    else:
        if args.no_norm:
            imgtr = [ToTensor()]
        else:
            imgtr = [ToTensor(),NormalizeOwn()]
        labtr = [IgnoreLabelClass(),ToTensorLabel()]
        # labtr = [IgnoreLabelClass(),ToTensorLabel(tensor_type=torch.FloatTensor)]
        # cotr = [RandomSizedCrop3((320,320))] # (321,321)
        cotr = [RandomSizedCrop3((320,320))]

    valset = Corrosion(home_dir,args.dataset_dir,img_transform=Compose(imgtr), \
        label_transform = Compose(labtr),co_transform=Compose(cotr),train_phase=False)
    valoader = DataLoader(valset,batch_size=1)

    #############
    # GENERATOR #
    #############
    # generator = deeplabv2.ResDeeplab()

    # softmax generator: in_chs=3, out_chs=2
    generator = unet.AttU_Net()
    # model_summary = generator.cuda()

    init_weights(generator,args.init_net)

    if args.init_net != 'unet':
        optimG = optim.SGD(filter(lambda p: p.requires_grad, \
            generator.parameters()),lr=args.g_lr,momentum=0.9,\
            weight_decay=0.0001,nesterov=True)
    else:
        optimG = optim.Adam(filter(lambda p: p.requires_grad, \
            generator.parameters()),args.g_lr, [0.9, 0.999])

    if not args.nogpu:
        generator = nn.DataParallel(generator).cuda()

    #################
    # DISCRIMINATOR #
    ################
    if args.mode != "base":
        # softmax generator
        discriminator = DisSigmoid(in_channels=2)
        init_weights(generator,args.init_net)
        # model_summary = discriminator.cuda()
        # summary(model_summary, (2, 320, 320))
        if args.d_optim == 'adam':
            optimD = optim.Adam(filter(lambda p: p.requires_grad, \
                discriminator.parameters()),args.d_lr,[0.9,0.999])
                # discriminator.parameters()),[0.9,0.999],lr = args.d_lr,weight_decay=0.0001)
        else:
            optimD = optim.SGD(filter(lambda p: p.requires_grad, \
                discriminator.parameters()),lr=args.d_lr,weight_decay=0.0001,momentum=0.9,nesterov=True)

        if not args.nogpu:
            discriminator = nn.DataParallel(discriminator).cuda()

    if args.mode == 'base':
        train_base(generator,optimG,trainloader_l,valoader,args)
    elif args.mode == 'adv':
        train_adv(generator,discriminator,optimG,optimD,trainloader_l,valoader,postprocessor,args)
    elif args.mode == 'semi':
        train_semi(generator,discriminator,optimG,optimD,trainloader_l,trainloader_u,valoader,args)
    else:
        # train_semir(generator,discriminator,optimG,optimD,trainloader_l,valoader,args)
        print("training mode incorrect")
예제 #10
0
def main():

    args = parse_args()

    random.seed(0)
    torch.manual_seed(0)
    if not args.nogpu:
        torch.cuda.manual_seed_all(0)

    if args.no_norm:
        imgtr = [ToTensor()]
    else:
        imgtr = [ToTensor(), NormalizeOwn()]

    if len(args.lr_step) != 0:
        steps = list(map(lambda x: int(x), args.lr_step.split(',')))

    # softmax
    labtr = [IgnoreLabelClass(), ToTensorLabel()]
    cotr = [RandomSizedCrop4((512, 512))]

    print("dataset_dir: ", args.dataset_dir)

    trainset_l = BoxSet(home_dir,
                        args.dataset_dir,
                        img_transform=Compose(imgtr),
                        label_transform=Compose(labtr),
                        co_transform=Compose(cotr),
                        split=args.split,
                        labeled=True,
                        label_correction=True)
    trainloader_l = DataLoader(trainset_l,
                               batch_size=args.batch_size,
                               shuffle=True,
                               num_workers=2,
                               drop_last=True)
    if args.split != 1:
        trainset_u = BoxSet(home_dir,
                            args.dataset_dir,
                            img_transform=Compose(imgtr),
                            label_transform=Compose(labtr),
                            co_transform=Compose(cotr),
                            split=args.split,
                            labeled=False,
                            label_correction=True)
        trainloader_u = DataLoader(trainset_l,
                                   batch_size=args.batch_size,
                                   shuffle=True,
                                   num_workers=2,
                                   drop_last=True)

    #########################
    # Validation Dataloader #
    ########################
    if args.val_orig:
        if args.no_norm:
            imgtr = [ZeroPadding(), ToTensor()]
        else:
            imgtr = [ZeroPadding(), ToTensor(), NormalizeOwn()]
        # softmax
        labtr = [IgnoreLabelClass(), ToTensorLabel()]
        cotr = []
    else:
        if args.no_norm:
            imgtr = [ToTensor()]
        else:
            imgtr = [ToTensor(), NormalizeOwn()]
        # softmax
        labtr = [IgnoreLabelClass(), ToTensorLabel()]
        cotr = [ResizedImage4((512, 512))]

    valset = BoxSet(home_dir,args.dataset_dir,img_transform=Compose(imgtr), \
        label_transform = Compose(labtr),co_transform=Compose(cotr),train_phase=False)
    valoader = DataLoader(valset, batch_size=1)

    #############
    # GENERATOR #
    #############
    generator = unet.AttU_Net(output_ch=7, Centroids=False)

    if osp.isfile(args.snapshot):
        print("load checkpoint => ", args.snapshot)
        checkpoint = torch.load(args.snapshot)
        generator_dict = generator.state_dict()
        saved_net = {
            k.partition('module.')[2]: v
            for i, (k, v) in enumerate(checkpoint['state_dict'].items())
            if k.partition('module.')[2] in generator_dict
        }
        generator_dict.update(saved_net)
        generator.load_state_dict(saved_net)
    else:
        init_weights(generator, args.init_net)

    if args.init_net != 'unet':
        optimG = optim.Adam(filter(lambda p: p.requires_grad, \
            generator.parameters()),args.g_lr, [0.5, 0.999])
    else:

        optimG = optim.Adam(filter(lambda p: p.requires_grad, \
            generator.parameters()),args.g_lr, [0.5, 0.999])
        """
        optimG = optim.SGD(filter(lambda p: p.requires_grad, \
            generator.parameters()),lr=args.g_lr,momentum=0.9,\
            weight_decay=0.0001,nesterov=True)
        """
    if not args.nogpu:
        generator = nn.DataParallel(generator).cuda()

    if args.mode == 'base':
        train_base(generator, optimG, trainloader_l, valoader, args)
    elif args.mode == 'label_correction':
        train_box_cluster(generator, steps, optimG, trainloader_l, valoader,
                          args)
    else:
        print("training mode incorrect")
def train_semi(args):
    # TODO: Make it more generic to include for other splits
    args.batch_size = args.batch_size * 2

    if args.no_norm:
        imgtr = [ToTensor()]
    else:
        imgtr = [ToTensor(), NormalizeOwn()]

    labtr = [IgnoreLabelClass(), ToTensorLabel()]
    cotr = [RandomSizedCrop((321, 321))]

    trainset = PascalVOC(home_dir,args.dataset_dir,img_transform=Compose(imgtr), label_transform=Compose(labtr), \
        co_transform=Compose(cotr))
    trainloader = DataLoader(trainset,
                             batch_size=args.batch_size,
                             shuffle=True,
                             num_workers=2,
                             drop_last=True)

    #########################
    # Validation Dataloader #
    ########################
    if args.val_orig:
        if args.no_norm:
            imgtr = [ZeroPadding(), ToTensor()]
        else:
            imgtr = [ZeroPadding(), ToTensor(), NormalizeOwn()]
        labtr = [IgnoreLabelClass(), ToTensorLabel()]
        cotr = []
    else:
        if args.no_norm:
            imgtr = [ToTensor()]
        else:
            imgtr = [ToTensor(), NormalizeOwn()]
        labtr = [IgnoreLabelClass(), ToTensorLabel()]
        cotr = [RandomSizedCrop((321, 321))]

    valset = PascalVOC(home_dir,args.dataset_dir,img_transform=Compose(imgtr), \
        label_transform = Compose(labtr),co_transform=Compose(cotr),train_phase=False)
    valoader = DataLoader(valset, batch_size=1)
    #############
    # GENERATOR #
    #############
    generator = deeplabv2.ResDeeplab()
    optimG = optim.SGD(filter(lambda p: p.requires_grad, \
        generator.parameters()),lr=args.g_lr,momentum=0.9,\
        weight_decay=0.0001,nesterov=True)

    if not args.nogpu:
        generator = nn.DataParallel(generator).cuda()

    #################
    # DISCRIMINATOR #
    ################
    discriminator = Dis(in_channels=21)
    if args.d_optim == 'adam':
        optimD = optim.Adam(filter(lambda p: p.requires_grad, \
            discriminator.parameters()),lr = args.d_lr)
    else:
        optimD = optim.SGD(filter(lambda p: p.requires_grad, \
            discriminator.parameters()),lr=args.d_lr,weight_decay=0.0001,momentum=0.5,nesterov=True)

    if not args.nogpu:
        discriminator = nn.DataParallel(discriminator).cuda()

    ############
    # TRAINING #
    ############
    best_miou = -1
    for epoch in range(args.start_epoch, args.max_epoch + 1):
        generator.train()
        for batch_id, (img, mask, ohmask) in enumerate(trainloader):
            if args.nogpu:
                img, mask, ohmask = Variable(img), Variable(mask), Variable(
                    ohmask)
            else:
                img, mask, ohmask = Variable(img.cuda()), Variable(
                    mask.cuda()), Variable(ohmask.cuda())
            itr = len(trainloader) * (epoch - 1) + batch_id
            ## TODO: Extend random interleaving for split of any size
            mid = args.batch_size // 2
            img1, mask1, ohmask1 = img[0:mid, ...], mask[0:mid,
                                                         ...], ohmask[0:mid,
                                                                      ...]
            img2, mask2, ohmask2 = img[mid:, ...], mask[mid:,
                                                        ...], ohmask[mid:, ...]

            # Random Interleaving
            if random.random() < 0.5:
                imgl, maskl, ohmaskl = img1, mask1, ohmask1
                imgu, masku, ohmasku = img2, mask2, ohmask2
            else:
                imgu, masku, ohmasku = img1, mask1, ohmask1
                imgl, maskl, ohmaskl = img2, mask2, ohmask2

            ################################################
            #  Labelled data for Discriminator Training #
            ################################################
            cpmap = generator(Variable(imgl.data, volatile=True))
            cpmap = nn.Softmax2d()(cpmap)

            N = cpmap.size()[0]
            H = cpmap.size()[2]
            W = cpmap.size()[3]

            # Generate the Real and Fake Labels
            targetf = Variable(torch.zeros((N, H, W)).long())
            targetr = Variable(torch.ones((N, H, W)).long())
            if not args.nogpu:
                targetf = targetf.cuda()
                targetr = targetr.cuda()

            # Train on Real
            confr = nn.LogSoftmax()(discriminator(ohmaskl.float()))
            optimD.zero_grad()
            if args.d_label_smooth != 0:
                LDr = (1 - args.d_label_smooth) * nn.NLLLoss2d()(confr,
                                                                 targetr)
                LDr += args.d_label_smooth * nn.NLLLoss2d()(confr, targetf)
            else:
                LDr = nn.NLLLoss2d()(confr, targetr)
            LDr.backward()

            # Train on Fake
            conff = nn.LogSoftmax()(discriminator(Variable(cpmap.data)))
            LDf = nn.NLLLoss2d()(conff, targetf)
            LDf.backward()

            poly_lr_scheduler(optimD, args.d_lr, itr)
            optimD.step()

            ###########################################
            #  labelled data Generator Training       #
            ###########################################
            optimG.zero_grad()

            cpmap = generator(imgl)
            cpmapsmax = nn.Softmax2d()(cpmap)
            cpmaplsmax = nn.LogSoftmax()(cpmap)

            conff = nn.LogSoftmax()(discriminator(cpmapsmax))

            LGce = nn.NLLLoss2d()(cpmaplsmax, maskl)
            LGadv = nn.NLLLoss2d()(conff, targetr)

            LGadv_d = LGadv.data[0]
            LGce_d = LGce.data[0]

            LGadv = args.lam_adv * LGadv

            (LGce + LGadv).backward()
            #####################################
            # Use unlabelled data to get L_semi #
            #####################################
            LGsemi_d = 0
            if epoch > args.wait_semi:

                cpmap = generator(imgu)
                softpred = nn.Softmax2d()(cpmap)
                hardpred = torch.max(softpred, 1)[1].squeeze(1)
                conf = nn.Softmax2d()(discriminator(
                    Variable(softpred.data, volatile=True)))

                idx = np.zeros(cpmap.data.cpu().numpy().shape, dtype=np.uint8)
                idx = idx.transpose(0, 2, 3, 1)

                confnp = cpmap[:, 1, ...].data.cpu().numpy()
                hardprednp = hardpred.data.cpu().numpy()
                idx[confnp > args.t_semi] = np.identity(
                    21, dtype=idx.dtype)[hardprednp[confnp > args.t_semi]]

                if np.count_nonzero(idx) != 0:
                    cpmaplsmax = nn.LogSoftmax()(cpmap)
                    idx = Variable(torch.from_numpy(idx).byte().cuda())
                    LGsemi_arr = cpmaplsmax.masked_select(idx)
                    LGsemi = -1 * LGsemi_arr.mean()
                    LGsemi_d = LGsemi.data[0]
                    LGsemi = args.lam_semi * LGsemi
                    LGsemi.backward()
                else:
                    LGsemi_d = 0
                LGseg_d = LGce_d + LGadv_d + LGsemi_d

                del idx
                del conf
                del confnp
                del hardpred
                del softpred
                del hardprednp
                del cpmap
            LGseg_d = LGce_d + LGadv_d + LGsemi_d
            poly_lr_scheduler(optimG, args.g_lr, itr)
            optimG.step()

            # Manually free memory! Later, really understand how computation graphs free variables

            print("[{}][{}] LD: {:.4f} LD_fake: {:.4f} LD_real: {:.4f} LG: {:.4f} LG_ce: {:.4f} LG_adv: {:.4f} LG_semi: {:.4f}"\
                    .format(epoch,itr,(LDr + LDf).data[0],LDr.data[0],LDf.data[0],LGseg_d,LGce_d,LGadv_d,LGsemi_d))

        snapshot(generator, valoader, epoch, best_miou, args.snapshot_dir,
                 args.prefix)
def train_adv(args):
    if args.no_norm:
        imgtr = [ToTensor()]
    else:
        imgtr = [ToTensor(), NormalizeOwn()]

    labtr = [IgnoreLabelClass(), ToTensorLabel()]
    cotr = [RandomSizedCrop((321, 321))]

    trainset = PascalVOC(home_dir,args.dataset_dir,img_transform=Compose(imgtr), label_transform=Compose(labtr), \
        co_transform=Compose(cotr))
    trainloader = DataLoader(trainset,
                             batch_size=args.batch_size,
                             shuffle=True,
                             num_workers=2,
                             drop_last=True)

    #########################
    # Validation Dataloader #
    ########################
    if args.val_orig:
        if args.no_norm:
            imgtr = [ZeroPadding(), ToTensor()]
        else:
            imgtr = [ZeroPadding(), ToTensor(), NormalizeOwn()]
        labtr = [IgnoreLabelClass(), ToTensorLabel()]
        cotr = []
    else:
        if args.no_norm:
            imgtr = [ToTensor()]
        else:
            imgtr = [ToTensor(), NormalizeOwn()]
        labtr = [IgnoreLabelClass(), ToTensorLabel()]
        cotr = [RandomSizedCrop((321, 321))]

    valset = PascalVOC(home_dir,args.dataset_dir,img_transform=Compose(imgtr), \
        label_transform = Compose(labtr),co_transform=Compose(cotr),train_phase=False)
    valoader = DataLoader(valset, batch_size=1)

    #############
    # GENERATOR #
    #############
    generator = deeplabv2.ResDeeplab()
    optimG = optim.SGD(filter(lambda p: p.requires_grad, \
        generator.parameters()),lr=args.g_lr,momentum=0.9,\
        weight_decay=0.0001,nesterov=True)

    if not args.nogpu:
        generator = nn.DataParallel(generator).cuda()

    #################
    # DISCRIMINATOR #
    ################
    discriminator = Dis(in_channels=21)
    if args.d_optim == 'adam':
        optimD = optim.Adam(filter(lambda p: p.requires_grad, \
            discriminator.parameters()),lr = args.d_lr)
    else:
        optimD = optim.SGD(filter(lambda p: p.requires_grad, \
            discriminator.parameters()),lr=args.d_lr,weight_decay=0.0001,momentum=0.5,nesterov=True)

    if not args.nogpu:
        discriminator = nn.DataParallel(discriminator).cuda()

    #############
    # TRAINING  #
    #############
    best_miou = -1
    for epoch in range(args.start_epoch, args.max_epoch + 1):
        generator.train()
        for batch_id, (img, mask, ohmask) in enumerate(trainloader):
            if args.nogpu:
                img, mask, ohmask = Variable(img), Variable(mask), Variable(
                    ohmask)
            else:
                img, mask, ohmask = Variable(img.cuda()), Variable(
                    mask.cuda()), Variable(ohmask.cuda())
            itr = len(trainloader) * (epoch - 1) + batch_id
            cpmap = generator(Variable(img.data, volatile=True))
            cpmap = nn.Softmax2d()(cpmap)

            N = cpmap.size()[0]
            H = cpmap.size()[2]
            W = cpmap.size()[3]

            # Generate the Real and Fake Labels
            targetf = Variable(torch.zeros((N, H, W)).long(),
                               requires_grad=False)
            targetr = Variable(torch.ones((N, H, W)).long(),
                               requires_grad=False)
            if not args.nogpu:
                targetf = targetf.cuda()
                targetr = targetr.cuda()

            ##########################
            # DISCRIMINATOR TRAINING #
            ##########################
            optimD.zero_grad()

            # Train on Real
            confr = nn.LogSoftmax()(discriminator(ohmask.float()))
            if args.d_label_smooth != 0:
                LDr = (1 - args.d_label_smooth) * nn.NLLLoss2d()(confr,
                                                                 targetr)
                LDr += args.d_label_smooth * nn.NLLLoss2d()(confr, targetf)
            else:
                LDr = nn.NLLLoss2d()(confr, targetr)
            LDr.backward()

            # Train on Fake
            conff = nn.LogSoftmax()(discriminator(Variable(cpmap.data)))
            LDf = nn.NLLLoss2d()(conff, targetf)
            LDf.backward()

            poly_lr_scheduler(optimD, args.d_lr, itr)
            optimD.step()

            ######################
            # GENERATOR TRAINING #
            #####################
            optimG.zero_grad()

            cmap = generator(img)
            cpmapsmax = nn.Softmax2d()(cmap)
            cpmaplsmax = nn.LogSoftmax()(cmap)
            conff = nn.LogSoftmax()(discriminator(cpmapsmax))

            LGce = nn.NLLLoss2d()(cpmaplsmax, mask)
            LGadv = nn.NLLLoss2d()(conff, targetr)
            LGseg = LGce + args.lam_adv * LGadv

            LGseg.backward()
            poly_lr_scheduler(optimG, args.g_lr, itr)
            optimG.step()

            print("[{}][{}] LD: {:.4f} LDfake: {:.4f} LD_real: {:.4f} LG: {:.4f} LG_ce: {:.4f} LG_adv: {:.4f}"  \
                    .format(epoch,itr,(LDr + LDf).data[0],LDr.data[0],LDf.data[0],LGseg.data[0],LGce.data[0],LGadv.data[0]))
        snapshot(generator, valoader, epoch, best_miou, args.snapshot_dir,
                 args.prefix)
def train_base(args):

    #######################
    # Training Dataloader #
    #######################

    if args.no_norm:
        imgtr = [ToTensor()]
    else:
        imgtr = [ToTensor(), NormalizeOwn()]

    labtr = [IgnoreLabelClass(), ToTensorLabel()]
    cotr = [RandomSizedCrop((321, 321))]

    trainset = PascalVOC(home_dir,args.dataset_dir,img_transform=Compose(imgtr), label_transform=Compose(labtr), \
        co_transform=Compose(cotr))
    trainloader = DataLoader(trainset,
                             batch_size=args.batch_size,
                             shuffle=True,
                             num_workers=2,
                             drop_last=True)

    #########################
    # Validation Dataloader #
    ########################
    if args.val_orig:
        if args.no_norm:
            imgtr = [ZeroPadding(), ToTensor()]
        else:
            imgtr = [ZeroPadding(), ToTensor(), NormalizeOwn()]
        labtr = [IgnoreLabelClass(), ToTensorLabel()]
        cotr = []
    else:
        if args.no_norm:
            imgtr = [ToTensor()]
        else:
            imgtr = [ToTensor(), NormalizeOwn()]
        labtr = [IgnoreLabelClass(), ToTensorLabel()]
        cotr = [RandomSizedCrop((321, 321))]

    valset = PascalVOC(home_dir,args.dataset_dir,img_transform=Compose(imgtr), \
        label_transform = Compose(labtr),co_transform=Compose(cotr),train_phase=False)
    valoader = DataLoader(valset, batch_size=1)

    model = deeplabv2.ResDeeplab()
    init_weights(model, args.init_net)

    optimG = optim.SGD(filter(lambda p: p.requires_grad, \
        model.parameters()),lr=args.g_lr,momentum=0.9,\
        weight_decay=0.0001,nesterov=True)

    if not args.nogpu:
        model = nn.DataParallel(model).cuda()

    best_miou = -1
    for epoch in range(args.start_epoch, args.max_epoch + 1):
        model.train()
        for batch_id, (img, mask, _) in enumerate(trainloader):

            if args.nogpu:
                img, mask = Variable(img), Variable(mask)
            else:
                img, mask = Variable(img.cuda()), Variable(mask.cuda())

            itr = len(trainloader) * (epoch - 1) + batch_id
            cprob = model(img)
            cprob = nn.LogSoftmax()(cprob)

            Lseg = nn.NLLLoss2d()(cprob, mask)

            poly_lr_scheduler(optimG, args.g_lr, itr)
            optimG.zero_grad()

            Lseg.backward()
            optimG.step()

            print("[{}][{}]Loss: {:0.4f}".format(epoch, itr, Lseg.data[0]))

        snapshot(model, valoader, epoch, best_miou, args.snapshot_dir,
                 args.prefix)