Example #1
0
def inicializar_segsem():

    print("Loading Semantic Segmentation Model:")
    start = time.time()
    global loader
    global device
    global model

    device = torch.device("cuda")

    model_name = "hardnet"
    data_loader = get_loader("ade20k")
    loader = data_loader(root=None,
                         is_transform=True,
                         img_norm=True,
                         test_mode=True)
    n_classes = loader.n_classes

    # Setup Model
    model_dict = {"arch": model_name}
    model = get_model(model_dict, n_classes, version="ade20k")
    state = convert_state_dict(
        torch.load(
            "/home/socialab/FCHarDNet/runs/config./cur/hardnet_ade20k_best_model.pkl",
        )["model_state"])
    model.load_state_dict(state)
    model.eval()
    model.to(device)
    end = time.time()
    print("  (time): " + str(end - start))
def get_dataset_loader():
    args=edict()
    args.dataset_name = 'cityscapes'
    args.config_path = os.path.join('/home/yzbx/git/gnu/pytorch-semseg', 'config.json')
    args.img_rows=224
    args.img_cols=224
    args.img_norm=True
    args.batch_size=2
    
    
    data_loader = get_loader(args.dataset_name)
    data_path = get_data_path(args.dataset_name, args.config_path)
    t_loader = data_loader(data_path, is_transform=True, split='train', img_size=(
        args.img_rows, args.img_cols), augmentations=None, img_norm=args.img_norm)
    v_loader = data_loader(data_path, is_transform=True, split='val', img_size=(
        args.img_rows, args.img_cols), img_norm=args.img_norm)
    
    n_classes = t_loader.n_classes
    print('class number is',n_classes)
    trainloader = data.DataLoader(
        t_loader, batch_size=args.batch_size, num_workers=8, shuffle=True)
    valloader = data.DataLoader(
        v_loader, batch_size=args.batch_size, num_workers=8)
    
    return trainloader,valloader
Example #3
0
def train(args):

    # Setup Dataloader
    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset, config_file=args.config_file)
    loader = data_loader(data_path,
                         is_transform=True,
                         img_size=(args.img_rows, args.img_cols))
    n_classes = loader.n_classes

    # must use 1 worker for AWS sagemaker without ipc="host" or larger shared memory size
    trainloader = data.DataLoader(loader,
                                  batch_size=args.batch_size,
                                  num_workers=1,
                                  shuffle=True)

    # Setup Model
    model = get_model(args.arch, n_classes)

    # Setup log dir / logging
    if not os.path.exists(args.log_dir):
        os.makedirs(args.log_dir)
    configure(args.log_dir)

    model = torch.nn.DataParallel(model,
                                  device_ids=range(torch.cuda.device_count()))
    model.cuda()
    optimizer = torch.optim.SGD(model.parameters(),
                                lr=args.l_rate,
                                momentum=0.9,
                                weight_decay=5e-4)

    step = 0
    for epoch in range(args.n_epoch):
        start_time = time.time()
        for i, (images, labels) in enumerate(trainloader):
            images = Variable(images.cuda())
            labels = Variable(labels.cuda())

            optimizer.zero_grad()
            outputs = model(images)

            loss = cross_entropy2d(outputs, labels)

            loss.backward()
            optimizer.step()

            log_value('Loss', loss.data[0], step)
            step += 1

            if (i + 1) % 20 == 0:
                print("Epoch [%d/%d] Loss: %.4f" %
                      (epoch + 1, args.n_epoch, loss.data[0]),
                      flush=True)

        end_time = time.time()
        print('Epoch run time: %s' % (end_time - start_time))
        torch.save(
            model, args.log_dir + "{}_{}_{}_{}.pt".format(
                args.arch, args.dataset, args.feature_scale, epoch))
Example #4
0
def validate(args):

    # Setup Dataloader
    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset)
    loader = data_loader(data_path, split=args.split, is_transform=True, img_size=(args.img_rows, args.img_cols))
    n_classes = loader.n_classes
    valloader = data.DataLoader(loader, batch_size=args.batch_size, num_workers=4)
    running_metrics = runningScore(n_classes)

    # Setup Model
    model = get_model(args.model_path[:args.model_path.find('_')], n_classes)
    state = convert_state_dict(torch.load(args.model_path)['model_state'])
    model.load_state_dict(state)
    model.eval()

    for i, (images, labels) in tqdm(enumerate(valloader)):
        model.cuda()
        images = Variable(images.cuda(), volatile=True)
        labels = Variable(labels.cuda(), volatile=True)

        outputs = model(images)
        pred = outputs.data.max(1)[1].cpu().numpy()
        gt = labels.data.cpu().numpy()
        
        running_metrics.update(gt, pred)

    score, class_iou = running_metrics.get_scores()

    for k, v in score.items():
        print(k, v)

    for i in range(n_classes):
        print(i, class_iou[i])
Example #5
0
def test(args):

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    model_file_name = os.path.split(args.model_path)[1]
    model_name = model_file_name[:model_file_name.find("_")]

    # Setup image
    print("Read Input Image from : {}".format(args.img_path))
    img = misc.imread(args.img_path)

    data_loader = get_loader(args.dataset)
    loader = data_loader(root=None,
                         is_transform=True,
                         img_norm=args.img_norm,
                         test_mode=True)
    n_classes = loader.n_classes

    resized_img = misc.imresize(img, (loader.img_size[0], loader.img_size[1]),
                                interp="bicubic")

    orig_size = img.shape[:-1]
    if model_name in ["pspnet", "icnet", "icnetBN"]:
        # uint8 with RGB mode, resize width and height which are odd numbers
        img = misc.imresize(
            img, (orig_size[0] // 2 * 2 + 1, orig_size[1] // 2 * 2 + 1))
    else:
        img = misc.imresize(img, (loader.img_size[0], loader.img_size[1]))

    img = img[:, :, ::-1]
    img = img.astype(np.float64)
    img -= loader.mean
    if args.img_norm:
        img = img.astype(float) / 255.0

    # NHWC -> NCHW
    img = img.transpose(2, 0, 1)
    img = np.expand_dims(img, 0)
    img = torch.from_numpy(img).float()

    # Setup Model
    model_dict = {"arch": model_name}
    model = get_model(model_dict, n_classes, version=args.dataset)
    state = convert_state_dict(torch.load(args.model_path)["model_state"])
    model.load_state_dict(state)
    model.eval()
    model.to(device)

    images = img.to(device)
    outputs = model(images)

    pred = np.squeeze(outputs.data.max(1)[1].cpu().numpy(), axis=0)
    if model_name in ["pspnet", "icnet", "icnetBN"]:
        pred = pred.astype(np.float32)
        # float32 with F mode, resize back to orig_size
        pred = misc.imresize(pred, orig_size, "nearest", mode="F")

    print("Classes found: ", np.unique(pred))
    misc.imsave(args.out_path, pred.astype('uint8'))
    print("Segmentation Mask Saved at: {}".format(args.out_path))
def test(args, cfg):

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    model_file_name = os.path.split(args.model_path)[1]
    model_name = model_file_name[:model_file_name.find("_")]

    IMG_Path = Path(args.img_path)
    IMG_File = natsort.natsorted(list(IMG_Path.glob("*.png")),
                                 alg=natsort.PATH)
    IMG_Str = []
    for i in IMG_File:
        IMG_Str.append(str(i))
    # Setup image
    print("Read Input Image from : {}".format(args.img_path))

    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset, config_file=cfg)
    loader = data_loader(data_path, is_transform=True, img_norm=args.img_norm)
    n_classes = loader.n_classes

    # Setup Model
    model = get_model(cfg['model'], n_classes)
    state = convert_state_dict(torch.load(args.model_path)["model_state"])
    # state=torch.load(args.model_path)["model_state"]
    model.load_state_dict(state)
    model.eval()
    model.to(device)

    for j in tqdm(range(len(IMG_Str))):
        img_path = IMG_Str[j]
        img = misc.imread(img_path)
        # img = img[:, :, ::-1]
        img = img.astype(np.float64)
        # img -= loader.mean
        if args.img_norm:
            img = img.astype(float) / 255.0

        # NHWC -> NCHW
        img = img.transpose(2, 0, 1)
        img = np.expand_dims(img, 0)
        img = torch.from_numpy(img).float()
        images = img.to(device)
        outputs = model(images)
        outputs_probability = F.softmax(outputs)
        data = outputs_probability.data
        data_max = data.max(1)
        prob = data_max[0]
        prob_img_format = np.squeeze(prob.cpu().numpy(), axis=0)
        avg_prob = np.mean(prob_img_format)
        print("Confidence Score for %s: \n%f" % (img_path, avg_prob))
        pred = np.squeeze(outputs.data.max(1)[1].cpu().numpy(), axis=0)

        decoded = loader.decode_segmap(pred)
        out_path = "test_out/test_confidence/out/" + Path(img_path).name
        decoded_bgr = cv.cvtColor(decoded, cv.COLOR_RGB2BGR)
        # misc.imsave(out_path, decoded)
        cv.imwrite(out_path, decoded_bgr)
Example #7
0
def test(args, cfg):

    os.environ["CUDA_VISIBLE_DEVICES"] = "1"

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    model_file_name = os.path.split(args.model_path)[1]
    model_name = model_file_name[:model_file_name.find("_")]

    IMG_Path = Path(args.img_path)
    IMG_File = natsort.natsorted(list(IMG_Path.glob("*.tif")),
                                 alg=natsort.PATH)
    IMG_Str = []
    for i in IMG_File:
        IMG_Str.append(str(i))
    # Setup image
    print("Read Input Image from : {}".format(args.img_path))

    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset, config_file=cfg)
    loader = data_loader(data_path, is_transform=True, img_norm=args.img_norm)
    n_classes = loader.n_classes

    v_loader = data_loader(
        data_path,
        is_transform=True,
        split=cfg['data']['val_split'],
        img_size=(cfg['data']['img_rows'], cfg['data']['img_cols']),
    )

    valloader = data.DataLoader(v_loader,
                                batch_size=cfg['training']['batch_size'],
                                num_workers=cfg['training']['n_workers'])

    # Setup Model
    model = get_model(cfg['model'], n_classes)
    state = convert_state_dict(torch.load(args.model_path)["model_state"])
    # state=torch.load(args.model_path)["model_state"]
    model.load_state_dict(state)
    model.eval()
    model.to(device)

    with torch.no_grad():
        for i_val, (img_path, images_val,
                    labels_val) in tqdm(enumerate(valloader)):
            img_name = img_path[0]
            images_val = images_val.to(device)
            outputs = model(images_val)

            pred = np.squeeze(outputs.data.max(1)[1].cpu().numpy(), axis=0)
            decoded = loader.decode_segmap(pred)
            out_path = "test_out/CAN_res50_4band_data07/" + Path(
                img_name).stem + ".png"
            decoded_bgr = cv.cvtColor(decoded, cv.COLOR_RGB2BGR)
            # misc.imsave(out_path, decoded)
            cv.imwrite(out_path, decoded_bgr)
Example #8
0
def validate(cfg, args):

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    # Setup Dataloader
    data_loader = get_loader(cfg["data"]["dataset"])
    data_path = cfg["data"]["path"]

    loader = data_loader(
        data_path,
        split=cfg["data"]["val_split"],
        is_transform=True,
        img_size=(cfg["data"]["img_rows"], cfg["data"]["img_cols"]),
    )

    n_classes = loader.n_classes

    valloader = data.DataLoader(loader,
                                batch_size=cfg["training"]["batch_size"],
                                num_workers=8)
    running_metrics = runningScore(n_classes)

    # Setup Model

    model = get_model(cfg["model"], n_classes).to(device)
    state = convert_state_dict(torch.load(args.model_path)["model_state"])
    model.load_state_dict(state)
    model.eval()
    model.to(device)

    for i, (images, labels) in enumerate(valloader):

        images = images.to(device)
        gt = labels.numpy()

        outputs = model(images).data.cpu().numpy()

        flipped_images = torch.flip(images, dims=(3, ))
        outputs_flipped = model(flipped_images)
        outputs_flipped = torch.flip(outputs_flipped,
                                     dims=(3, )).data.cpu().numpy()

        outputs = (outputs + outputs_flipped) / 2.0
        pred = np.argmax(outputs, axis=1)

        running_metrics.update(gt, pred)

    score, class_iou = running_metrics.get_scores()

    for k, v in score.items():
        print(k, v)

    for i in range(n_classes):
        print(i, class_iou[i])
def test(cfg, args):

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    # Setup Dataloader
    data_loader = get_loader(cfg['data']['dataset'], cfg['task'])
    data_path = cfg['data']['path']

    loader = data_loader(
        data_path,
        split=cfg['data']['test_split'],
        is_transform=True,
        img_size=(cfg['data']['img_rows'],
                  cfg['data']['img_cols']),
        img_norm=cfg['data']['img_norm']
    )

    n_classes = loader.n_classes

    testloader = data.DataLoader(loader,
                                batch_size=cfg['training']['batch_size'],
                                num_workers=0)

    # Setup Model
    model = get_model(cfg['model'], cfg['task'], n_classes=n_classes).to(device)
    weights = torch.load(cfg['testing']['trained_model'], map_location=lambda storage, loc: storage)
    model.load_state_dict(weights["model_state"])

    model.eval()
    model.to(device)

    for i, (images, labels, img_path) in tqdm(enumerate(testloader)):
        images = images.to(device)

        outputs = model(images)
        pred = np.squeeze(outputs.data.max(1)[1].cpu().numpy(), axis=0)

        decoded = loader.decode_segmap_tocolor(pred)   # color segmentation mask
        decoded_labelID = loader.decode_segmap_tolabelId(pred)  # segmentation mask of labelIDs for online test
        print("Classes found: ", np.unique(decoded_labelID))

        # m.imsave("output.png", decoded)

        out_file_name = [img_path[0][39:-16], '*.png']
        out_file_name = ''.join(out_file_name)
        out_path = os.path.join(args.out_path, out_file_name)

        decoded_labelID = m.imresize(decoded_labelID, (1024, 2048), "nearest", mode="F")
        m.toimage(decoded_labelID, high=np.max(decoded_labelID), low=np.min(decoded_labelID)).save(out_path)
        print("Segmentation Mask Saved at: {}".format(out_path))
Example #10
0
def validate(args):

    # Setup Dataloader
    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset)
    loader = data_loader(data_path,
                         split=args.split,
                         is_transform=True,
                         img_size=(args.img_rows, args.img_cols))
    n_classes = loader.n_classes
    valloader = data.DataLoader(loader,
                                batch_size=args.batch_size,
                                num_workers=4)

    # Setup Model
    model = torch.load(args.model_path)
    model.eval()

    if torch.cuda.is_available():
        model.cuda(args.gpu)

    gts, preds = [], []
    for i, (images, labels) in tqdm(enumerate(valloader)):
        if torch.cuda.is_available():
            images = Variable(images.cuda(args.gpu))
            labels = Variable(labels.cuda(args.gpu))
        else:
            images = Variable(images)
            labels = Variable(labels)

        outputs = model(images)
        pred = outputs.data.max(1)[1].cpu().numpy()
        pred = np.squeeze(pred)
        pred = cv2.resize(pred,
                          labels.size()[1:][::-1],
                          interpolation=cv2.INTER_NEAREST)
        pred = np.expand_dims(pred, axis=0)
        gt = labels.data.cpu().numpy()

        for gt_, pred_ in zip(gt, pred):
            gts.append(gt_)
            preds.append(pred_)

    score, class_iou = scores(gts, preds, n_class=n_classes)

    for k, v in score.items():
        print k, v

    for i in range(n_classes):
        print i, class_iou[i]
Example #11
0
def validate():

    # Setup Dataloader
    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset)
    loader = data_loader(data_path, img_size=args.img_size)

    n_classes = loader.n_classes
    n_channels = loader.n_channels

    valloader = data.DataLoader(loader,
                                batch_size=args.batch_size,
                                num_workers=4,
                                shuffle=True)

    # Setup Model
    model = torch.load(args.model_path)
    model.eval()

    if torch.cuda.is_available():
        model.cuda(0)

    gts, preds = [], []
    for i, (images, labels) in tqdm(enumerate(valloader)):
        if i >= args.max_samples:
            break
        if torch.cuda.is_available():
            images = Variable(images.cuda(0))
            labels = Variable(labels.cuda(0))
        else:
            images = Variable(images)
            labels = Variable(labels)

        outputs = model(images)

        pred = np.squeeze((torch.max(outputs.data, 1,
                                     keepdim=True))[1].cpu().numpy())
        gt = np.squeeze(labels.data.cpu().numpy())

        for gt_, pred_ in zip(gt, pred):
            gts.append(gt_)
            preds.append(pred_)

    score, class_iou = scores(gts, preds, n_class=n_classes)

    for k, v in score.items():
        print(k, v)

    for i in range(n_classes):
        print(i, class_iou[i])
Example #12
0
def test(args):
    model_file_name = os.path.split(args.model_path)[1]
    model_name = model_file_name[:model_file_name.find('_')]

    print("Building " + model_name)

    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset)
    loader = data_loader(data_path, phase='test')
    im_paths = loader.im_paths()
    n_classes = loader.n_classes
    testloader = data.DataLoader(loader,
                                 batch_size=1,
                                 num_workers=1,
                                 shuffle=False)

    # Setup Model
    model = get_model(model_name, n_classes)
    state = torch.load(args.model_path)['model_state']

    model.load_state_dict(state)
    model.eval()
    model.cuda()

    # Run test for KITTI Road dataset
    for i, (image, tr_image, lidar, tr_lidar) in enumerate(testloader):
        im_name_splits = im_paths[i].split('/')[-1].split('.')[0].split('_')
        task = im_name_splits[0]

        print('processing %d-th image' % i)
        t0 = time.time()
        orig_h, orig_w = image.shape[1:3]
        with torch.no_grad():
            tr_image = Variable(tr_image.cuda())
            tr_lidar = Variable(tr_lidar.cuda())
            outputs = model([tr_image, tr_lidar])
            outputs = outputs.cpu().numpy().transpose((2, 3, 1, 0)).squeeze()
            outputs = cv2.resize(outputs, (orig_w, orig_h))
            outputs = outputs[:, :, 1]

        print('Time({:d}'.format(i) + ') {0:.3f}'.format(time.time() - t0))
        output_fg = outputs * 255.
        output_fg[output_fg > 255] = 255
        output_fg = output_fg.astype(np.uint8)

        cv2.imwrite(
            './outputs/results/' + im_name_splits[0] + '_road_' +
            im_name_splits[1] + '.png', output_fg)
        print('write to ./outputs/results/' + im_name_splits[0] + '_road_' +
              im_name_splits[1] + '.png')
Example #13
0
def test(cfg, args):
    # Setup device
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    # Setup Dataloader
    data_loader = get_loader(cfg['data']['dataset'], cfg['task'])
    data_path = cfg['data']['path']

    loader = data_loader(data_path,
                         split=cfg['data']['test_split'],
                         is_transform=True,
                         img_size=(cfg['data']['img_rows'],
                                   cfg['data']['img_cols']),
                         img_norm=cfg['data']['img_norm'])

    n_classes = 0
    running_metrics_val = runningScoreDepth(cfg['data']['dataset'])

    testloader = data.DataLoader(loader,
                                 batch_size=cfg['training']['batch_size'],
                                 num_workers=0)

    # Load Model
    model = get_model(cfg['model'], cfg['task'],
                      n_classes=n_classes).to(device)
    #weights = torch.load(cfg['testing']['trained_model'])
    weights = torch.load(cfg['testing']['trained_model'],
                         map_location=lambda storage, loc: storage)
    model.load_state_dict(weights["model_state"])
    model.eval()
    model.to(device)

    with torch.no_grad():
        for i, (images, labels, img_path) in tqdm(enumerate(testloader)):
            images = images.to(device)
            labels = labels.to(device)

            outputs = model(images)  # [batch_size, n_classes, height, width]
            if cfg['model']['arch'] == "dispnet" and cfg['task'] == "depth":
                outputs = 1 / outputs

            pred = outputs.squeeze(1).data.cpu().numpy()
            gt = labels.data.squeeze(1).cpu().numpy()

            running_metrics_val.update(gt=gt, pred=pred)

    val_result = running_metrics_val.get_scores()
    for k, v in val_result.items():
        print(k, v)
Example #14
0
 def __init__(self,
              indices,
              n_init=100,
              output_dir=None,
              train=True,
              queries_name='queries.txt'):
     self.data_path = os.path.join(DATA_ROOT, f'VOCdevkit/VOC2012')
     self.sbd_path = os.path.join(DATA_ROOT, f'benchmark_RELEASE')
     self.data_aug = get_composed_augmentations(None)
     self.data_loader = get_loader('pascal')
     self.init_dataset = self._get_initial_dataset(train)
     super().__init__(self.get_dataset(indices),
                      n_init=n_init,
                      output_dir=output_dir,
                      queries_name=queries_name)
Example #15
0
def test(args):

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    model_file_name = os.path.split(args.model_path)[1]
    model_name = model_file_name[:model_file_name.find("_")]

    # Setup image
    print("Read Input Image from : {}".format(args.img_path))
    img = misc.imread(args.img_path)

    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset)
    loader = data_loader(data_path, is_transform=True, img_norm=args.img_norm)
    n_classes = loader.n_classes

    img = img[:, :, ::-1]
    img = img.astype(np.float64)
    img -= loader.mean
    if args.img_norm:
        img = img.astype(float) / 255.0

    # NHWC -> NCHW
    img = img.transpose(2, 0, 1)
    img = np.expand_dims(img, 0)
    img = torch.from_numpy(img).float()

    # Setup Model
    model_dict = {"arch": model_name}
    model = get_model(model_dict, n_classes, version=args.dataset)
    state = convert_state_dict(torch.load(args.model_path)["model_state"])
    model.load_state_dict(state)
    model.eval()
    model.to(device)

    images = img.to(device)
    outputs = model(images)
    if args.mask_path:
        print("Read Image Mask from : {}".format(args.mask_path))
        mask = torch.load(args.mask_path)
        mask = mask.to(device)
        outputs = to_super_to_pixels(outputs, mask)
    pred = np.squeeze(outputs.data.max(1)[1].cpu().numpy(), axis=0)

    decoded = loader.decode_segmap(pred)
    print("Classes found: ", np.unique(pred))
    misc.imsave(args.out_path, decoded)
    print("Segmentation Mask Saved at: {}".format(args.out_path))
 def _load_model(self, cfg):
     self.device = torch.device(cfg['device'])
     data_loader = get_loader('vistas')
     self.loader = data_loader(root=cfg['testing']['config_path'],
                               is_transform=True,
                               test_mode=True)
     n_classes = self.loader.n_classes
     # Setup Model
     model_dict = {"arch": 'icnetBN'}
     model = get_model(model_dict, n_classes)
     state = convert_state_dict(
         torch.load(cfg['testing']['model_path'])["model_state"])
     model.load_state_dict(state)
     model.eval()
     model.to(self.device)
     return model
Example #17
0
def test(args):

    # Setup image
    print("Read Input Image from : {}".format(args.img_path))
    orig_img = misc.imread(args.img_path)

    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset)
    loader = data_loader(data_path, is_transform=True)
    n_classes = loader.n_classes

    img = orig_img[:, :, ::-1]
    img = img.astype(np.float64)
    img -= loader.mean
    img = misc.imresize(img, (loader.img_size[0], loader.img_size[1]))
    img = img.astype(float) / 255.0
    # NHWC -> NCWH
    img = img.transpose(2, 0, 1)
    img = np.expand_dims(img, 0)
    img = torch.from_numpy(img).float()

    # Setup Model
    model = get_model(args.arch, n_classes)
    model.load_state_dict(torch.load(args.model_path)['state_dict'])
    model = torch.nn.DataParallel(model,
                                  device_ids=range(
                                      torch.cuda.device_count())).cuda()
    model.eval()

    if torch.cuda.is_available():
        model.cuda(0)
        images = Variable(img.cuda(0))
    else:
        images = Variable(img)

    outputs = model(images)
    pred = np.squeeze(outputs.data.max(1)[1].cpu().numpy(), axis=0)
    decoded = loader.decode_segmap(pred)
    if args.alpha_blend:
        orig_img = misc.imresize(orig_img,
                                 (loader.img_size[0], loader.img_size[1]))
        out_img = ALPHA * orig_img + (1 - ALPHA) * decoded
    else:
        out_img = decoded
    print(np.unique(pred))
    misc.imsave(args.out_path, out_img)
    print("Segmentation Mask Saved at: {}".format(args.out_path))
Example #18
0
def validate(args):
    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset)
    loader = data_loader(data_path,
                         split=args.split,
                         is_transform=True,
                         img_size=None,
                         img_norm=args.img_norm)
    n_classes = loader.n_classes
    valloader = data.DataLoader(loader,
                                batch_size=args.batch_size,
                                num_workers=4)
    running_metrics = runningScore(n_classes)

    # Setup Model
    from pytorchgo.model.deeplab_resnet import Res_Deeplab
    model = Res_Deeplab(NoLabels=n_classes, pretrained=False)
    state = torch.load("/home/hutao/MS_DeepLab_resnet_trained_VOC.pth")
    model.load_state_dict(state)
    model.eval()
    model.cuda()
    print "pra"

    for i, (images, labels) in tqdm(enumerate(valloader), desc="validation"):
        start_time = timeit.default_timer()
        img_large = torch.Tensor(np.zeros((1, 3, 513, 513)))
        img_large[:, :, :images.shape[2], :images.shape[3]] = images

        output = model(Variable(img_large, volatile=True).cuda())
        output = output.data.max(1)[1].cpu().numpy()
        pred = output[:, :images.shape[2], :images.shape[3]]

        gt = labels.numpy()

        if args.measure_time:
            elapsed_time = timeit.default_timer() - start_time
            print('Inference time (iter {0:5d}): {1:3.5f} fps'.format(
                i + 1, pred.shape[0] / elapsed_time))
        running_metrics.update(gt, pred)

    score, class_iou = running_metrics.get_scores()

    for k, v in score.items():
        print(k, v)

    for i in range(n_classes):
        print(i, class_iou[i])
Example #19
0
def test(args):
	# Setup image
	print("Read Input Image from : ", args.img_path)

	data_loader = get_loader(args.dataset)
	data_path = get_data_path(args.dataset)
	loader = data_loader(data_path, is_transform=True)
	n_classes = loader.n_classes

	img = img[:, :, ::-1]
	img = img.astype(np.float64)
	img -= loader.mean
	# print(loader.img_size[0], loader.img_size[1])
	# img = misc.imresize(img, (loader.img_size[0], loader.img_size[1]))
	img = img.astype(float) / 255.0
	# NHWC -> NCWH
	img = img.transpose(2, 0, 1)
	img = np.expand_dims(img, 0)
	img = torch.from_numpy(img).float()

	# Setup Model
	model = torch.load(args.model_path)
	model.eval()

	if torch.cuda.is_available():
		model.cuda(0)
		images = Variable(img.cuda(0))
	else:
		images = Variable(img)

	outputs = model(images)
	log('the size of outputs is '.format(outputs.size()))
	log('the size of outputs is ', outputs.data.max(1)[1].size())
	pred = np.squeeze(outputs.data.cpu().numpy(), axis=0)
	pred = pred[0, :, :] > pred[1, :, :]
	pred = pred * 255
	pred = outputs.data.cpu().numpy()
	log('The prediction shape is {}'.format(pred.shape))
	# print('the size of pred is ', pred.shape())
	# fig = plt.figure()
	# plt.imshow(pred[1,:,:])
	# plt.title('testing result')
	# plt.show()
	pred = pred * 255

	misc.imsave(args.out_path, pred[0, :, :])
	print("Segmentation Mask Saved at: ", args.out_path)
def validate(cfg, args):

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    # Setup Dataloader
    data_loader = get_loader(cfg['data']['dataset'], cfg['task'])
    data_path = cfg['data']['path']

    loader = data_loader(
        data_path,
        split=cfg['data']['val_split'],
        is_transform=True,
        img_norm=cfg['data']['img_norm'],
        img_size=(cfg['data']['img_rows'], cfg['data']['img_cols']),
    )

    n_classes = loader.n_classes
    valloader = data.DataLoader(loader,
                                batch_size=cfg['training']['batch_size'],
                                num_workers=0)
    running_metrics = runningScoreSeg(n_classes)

    # Setup Model

    model = get_model(cfg['model'], cfg['task'], n_classes).to(device)
    state = torch.load(args.model_path)["model_state"]
    #state = torch.load(args.model_path, map_location=lambda storage, loc: storage)["model_state"]
    model.load_state_dict(state)
    model.to(device)
    model.eval()

    with torch.no_grad():
        for i, (images, labels, images_path) in enumerate(valloader):
            images = images.to(device)
            outputs = model(images)
            pred = outputs.data.max(1)[1].cpu().numpy()
            gt = labels.numpy()
            running_metrics.update(gt, pred)

    score, class_iou = running_metrics.get_scores()

    for k, v in score.items():
        print(k, v)

    for i in range(n_classes):
        print(i, class_iou[i])
Example #21
0
def validate(args):

    # Setup Dataloader
    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset)
    loader = data_loader(data_path,
                         split=args.split,
                         is_transform=True,
                         img_size=(args.img_rows, args.img_cols))
    n_classes = loader.n_classes
    valloader = data.DataLoader(loader,
                                batch_size=args.batch_size,
                                num_workers=4)

    # Setup Model
    model = torch.load(args.model_path)
    model.eval()

    gts, preds = [], []
    for i, (images, labels) in tqdm(enumerate(valloader)):
        if torch.cuda.is_available():
            model = torch.nn.DataParallel(model,
                                          device_ids=range(
                                              torch.cuda.device_count()))
            images = Variable(images.cuda(0))
            labels = Variable(labels.cuda(0))
        else:
            images = Variable(images)
            labels = Variable(labels)

        outputs = model(images)
        pred = np.squeeze(outputs.data.max(1)[1].cpu().numpy(), axis=1)
        gt = labels.data.cpu().numpy()

        for gt_, pred_ in zip(gt, pred):
            gts.append(gt_)
            preds.append(pred_)

    score, class_iou = scores(gts, preds, n_class=n_classes)

    for k, v in score.items():
        print(k, v)

    for i in range(n_classes):
        print(i, class_iou[i])
Example #22
0
def get_sem_mask(model_file_name):

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    #img_path = input('Image path: ')
    img_path = 'results/munich_000009_000019_leftImg8bit.png'

    if len(img_path):
        if img_path[-3:] == 'png' or img_path[-3:] == 'jpg':
            print("Read Input Image from : %s" % (img_path))
        else:
            raise Exception('Non PNG or JPG image!')

    else:
        img_path = 'results/munich_000009_000019_leftImg8bit.png'

    img = cv2.imread(img_path)

    img_orig = img

    model_name = model_file_name[:model_file_name.find("_")]

    data_loader = get_loader('cityscapes')
    loader = data_loader(root=None, is_transform=True, test_mode=True)
    n_classes = loader.n_classes

    img = image_preproc(img, loader.img_size)

    model_dict = {"arch": model_name}
    model = get_model(model_dict, n_classes, version='cityscapes')

    try:
        state = convert_state_dict(torch.load(model_file_name)["model_state"])
    except:
        state = convert_state_dict(
            torch.load(model_file_name, map_location='cpu')["model_state"])

    model.load_state_dict(state)
    model.eval()
    model.to(device)

    images = img.to(device)
    outputs = model(images)
    pred = np.squeeze(outputs.data.max(1)[1].cpu().numpy(), axis=0)

    return pred, img_orig
Example #23
0
def init_model(args):
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    data_loader = get_loader("icboard")
    loader = data_loader(root=None,
                         is_transform=True,
                         img_size=eval(args.size),
                         test_mode=True)
    n_classes = loader.n_classes

    # Setup Model
    model = get_model({"arch": "hardnet"}, n_classes)
    state = convert_state_dict(
        torch.load(args.model_path, map_location=device)["model_state"])
    model.load_state_dict(state)
    model.eval()
    model.to(device)

    return device, model, loader
Example #24
0
def validate(args):
    os.environ['CUDA_VISIBLE_DEVICES'] = args.gpus

    # Setup Dataloader
    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset)
    loader = data_loader(data_path,
                         split=args.split,
                         is_transform=True,
                         img_size=(args.img_rows, args.img_cols))
    n_classes = loader.n_classes
    valloader = data.DataLoader(loader,
                                batch_size=args.batch_size,
                                num_workers=4)
    running_metrics = runningScore(n_classes)

    # Setup Model
    model = get_model(args.arch, n_classes)
    checkpoint = torch.load(args.model_path)
    state = convert_state_dict(checkpoint['model_state'])
    model.load_state_dict(state)
    print("Loaded checkpoint '{}' (epoch {})".format(args.model_path,
                                                     checkpoint['epoch']))
    model.eval()

    for i, (images, labels) in tqdm(enumerate(valloader)):
        model.cuda()
        images = Variable(images.cuda(), volatile=True)
        labels = Variable(labels.cuda(), volatile=True)

        outputs = model(images)
        pred = outputs.data.max(1)[1].cpu().numpy()
        gt = labels.data.cpu().numpy()

        running_metrics.update(gt, pred)

    score, class_iou = running_metrics.get_scores()

    for k, v in score.items():
        print(k, v)

    for i in range(n_classes):
        print(i, classes[i], class_iou[i])
    print('\t'.join([str(class_iou[i]) for i in range(n_classes)]))
def test(cfg):
    device = torch.device(cfg['device'])
    data_loader = get_loader('vistas')
    loader = data_loader(root=cfg['testing']['config_path'],
                         is_transform=True,
                         test_mode=True)
    n_classes = loader.n_classes
    # Setup Model
    model_dict = {"arch": 'icnetBN'}
    model = get_model(model_dict, n_classes)
    state = convert_state_dict(
        torch.load(cfg['testing']['model_path'])["model_state"])
    model.load_state_dict(state)
    model.eval()
    model.to(device)

    for img_name in os.listdir(cfg['testing']['img_fold']):
        img_path = os.path.join(cfg['testing']['img_fold'], img_name)
        img = misc.imread(img_path)
        orig_size = img.shape[:-1]

        # uint8 with RGB mode, resize width and height which are odd numbers
        # img = misc.imresize(img, (orig_size[0] // 2 * 2 + 1, orig_size[1] // 2 * 2 + 1))
        img = misc.imresize(
            img, (cfg['testing']['img_rows'], cfg['testing']['img_cols']))
        img = img.astype(np.float64)
        img = img.astype(float) / 255.0
        # NHWC -> NCHW
        img = img.transpose(2, 0, 1)
        img = np.expand_dims(img, 0)
        img = torch.from_numpy(img).float()

        img = img.to(device)
        outputs = model(img)

        outputs = np.squeeze(outputs.data.max(1)[1].cpu().numpy(), axis=0)
        outputs = outputs.astype(np.float32)
        # float32 with F mode, resize back to orig_size
        outputs = misc.imresize(outputs, orig_size, "nearest", mode="F")

        decoded = loader.decode_segmap(outputs)
        output_path = os.path.join(cfg['testing']['output_fold'],
                                   'mask_%s.png' % img_name.split('.')[0])
        misc.imsave(output_path, decoded)
Example #26
0
def test(args, cfg):

    os.environ["CUDA_VISIBLE_DEVICES"] = "0"
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    data_loader = get_loader(cfg['data']['dataset'])
    data_path = get_data_path(cfg['data']['dataset'], config_file=cfg)
    loader = data_loader(data_path, is_transform=True, img_norm=args.img_norm)
    n_classes = loader.n_classes

    t_loader = data_loader(
        data_path,
        is_transform=True,
        split='test',
        img_size=(cfg['data']['img_rows'], cfg['data']['img_cols']),
    )

    testloader = data.DataLoader(t_loader,
                                 batch_size=1,
                                 num_workers=cfg['training']['n_workers'])

    # Setup Model
    model = get_model(cfg['model'], n_classes)
    state = convert_state_dict(torch.load(args.model_path)["model_state"])
    # state=torch.load(args.model_path)["model_state"]
    model.load_state_dict(state)
    model.eval()
    model.to(device)

    with torch.no_grad():
        for i_val, (img_path, image_src,
                    image_dst) in tqdm(enumerate(testloader)):
            img_name = img_path[0]
            image_src = image_src.to(device)
            image_dst = image_dst.to(device)
            outputs = model(image_src, image_dst)

            pred = np.squeeze(outputs.data.max(1)[1].cpu().numpy(), axis=0)
            decoded = loader.decode_segmap(pred)
            out_path = "test_out/changenet_change_det/" + Path(
                img_name).stem + ".png"
            decoded_bgr = cv.cvtColor(decoded, cv.COLOR_RGB2BGR)
            # misc.imsave(out_path, decoded)
            cv.imwrite(out_path, decoded_bgr)
Example #27
0
def test(args):

    args.img_path = '/home/shehabk/dataSets/CKPLUS/unet_256/A/test/S077_007_00000029.png'
    args.dataset = 'ckplus'
    args.out_path = '/home/shehabk/Desktop/' + os.path.basename(args.img_path)

    # args.arch = 'segnet'
    args.model_path = 'unet2_ckplus_1_99.pkl'
    # Setup image
    print("Read Input Image from : {}".format(args.img_path))
    img = misc.imread(args.img_path,mode = 'RGB')


    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset)
    loader = data_loader(data_path, is_transform=True)
    n_classes = loader.n_classes

    img = img[:, :, ::-1]
    img = img.astype(np.float64)
    img -= loader.mean
    img = misc.imresize(img, (loader.img_size[0], loader.img_size[1]))
    img = img.astype(float) / 255.0
    # NHWC -> NCWH
    img = img.transpose(2, 0, 1) 
    img = np.expand_dims(img, 0)
    img = torch.from_numpy(img).float()

    # Setup Model
    model = torch.load(args.model_path)
    model.eval()

    if torch.cuda.is_available():
        model.cuda(0)
        images = Variable(img.cuda(0))
    else:
        images = Variable(img)

    outputs = model(images)
    pred = np.squeeze(outputs.data.max(1 , keepdim=True )[1].cpu().numpy(), axis=1)
    decoded = loader.decode_segmap(pred[0])
    print(np.unique(pred))
    misc.imsave(args.out_path, decoded)
    print("Segmentation Mask Saved at: {}".format(args.out_path))
Example #28
0
def test(args):

    # Setup image
    print("Read Input Image from : {}".format(args.img_path))
    img = misc.imread(args.img_path)

    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset, config_file=args.config_file)
    loader = data_loader(data_path, is_transform=True)
    n_classes = loader.n_classes

    img = img[:, :, ::-1]
    img = img.astype(np.float64)
    img -= loader.mean
    img = misc.imresize(img, (loader.img_size[0], loader.img_size[1]))
    img = img.astype(float) / 255.0
    # NHWC -> NCWH
    img = img.transpose(2, 0, 1)
    img = np.expand_dims(img, 0)
    img = torch.from_numpy(img).float()

    # Setup Model
    model = torch.load(args.model_path)
    model.eval()

    #if torch.cuda.is_available():
    #    model.cuda(0)
    #    images = Variable(img.cuda(0))
    #else:
    images = Variable(img)

    import time
    start_time = time.clock()
    outputs = model(images)
    print('Time: {time}'.format(time=(time.clock() - start_time)))

    pred = outputs[0].cpu().data.numpy()
    if args.label:
        pred = pred[args.label]
    else:
        pred = pred.argmax(0)
    misc.imsave(args.out_path, pred)
    print("Segmentation Mask Saved at: {}".format(args.out_path))
Example #29
0
def test():

    # Setup Dataloader
    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset)
    loader = data_loader(data_path, img_size=args.img_size)

    n_classes = loader.n_classes
    n_channels = loader.n_channels

    valloader = data.DataLoader(loader,
                                batch_size=args.batch_size,
                                num_workers=4,
                                shuffle=True)

    # Setup Model
    model = torch.load(args.model_path)
    model.eval()

    if torch.cuda.is_available():
        model.cuda(0)

    for i, (images, labels) in enumerate(tqdm(valloader)):
        if torch.cuda.is_available():
            images = Variable(images.cuda(0))
            labels = Variable(labels.cuda(0))
        else:
            images = Variable(images)
            labels = Variable(labels)

        outputs = model(images)
        pred = np.squeeze(outputs.data.max(1)[1].cpu().numpy(), axis=1)
        gt = labels.data.cpu().numpy()

        for gt_, pred_ in zip(gt, pred):
            gt_path = args.out_dir + "gt{}.png".format(i)
            pred_path = args.out_dir + "pred{}.png".format(i)
            decoded_gt = loader.decode_segmap(gt_)
            decoded_pred = loader.decode_segmap(pred_)
            misc.imsave(gt_path, decoded_gt)
            misc.imsave(pred_path, decoded_pred)
Example #30
0
def test(args):

    # Setup image
    print("Read Input Image from : {}".format(args.img_path))
    img = misc.imread(args.img_path)

    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset)
    loader = data_loader(data_path, is_transform=True)
    n_classes = loader.n_classes

    img = img[:, :, ::-1]
    img = img.astype(np.float64)
    img -= loader.mean
    img = misc.imresize(img, (loader.img_size[0], loader.img_size[1]))
    img = img.astype(float) / 255.0
    # NHWC -> NCWH
    img = img.transpose(2, 0, 1)
    img = np.expand_dims(img, 0)
    img = torch.from_numpy(img).float()

    # Setup Model
    model = torch.load(args.model_path)
    model.eval()

    if torch.cuda.is_available():
        model.cuda(0)
        images = Variable(img.cuda(0))
    else:
        images = Variable(img)

    outputs = model(images)
    pred = np.squeeze(outputs.data.max(1)[1].cpu().numpy(), axis=1)
    decoded = loader.decode_segmap(pred[0])
    print(np.unique(pred))
    misc.imsave(args.out_path, decoded)
    print("Segmentation Mask Saved at: {}".format(args.out_path))
Example #31
0
def test(args):

    # Setup image
    print("Read Input Image from : {}".format(args.img_path))
    img = misc.imread(args.img_path)
    
    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset)
    loader = data_loader(data_path, is_transform=True)
    n_classes = loader.n_classes
    
    resized_img = misc.imresize(img, (loader.img_size[0], loader.img_size[1]), interp='bicubic')

    img = img[:, :, ::-1]
    img = img.astype(np.float64)
    img -= loader.mean
    img = misc.imresize(img, (loader.img_size[0], loader.img_size[1]))
    img = img.astype(float) / 255.0
    # NHWC -> NCWH
    img = img.transpose(2, 0, 1) 
    img = np.expand_dims(img, 0)
    img = torch.from_numpy(img).float()

    # Setup Model
    model = get_model(args.model_path[:args.model_path.find('_')], n_classes)
    state = convert_state_dict(torch.load(args.model_path)['model_state'])
    model.load_state_dict(state)
    model.eval()
    
    model.cuda(0)
    images = Variable(img.cuda(0), volatile=True)

    outputs = F.softmax(model(images), dim=1)
    
    if args.dcrf == "True":
        unary = outputs.data.cpu().numpy()
        unary = np.squeeze(unary, 0)
        unary = -np.log(unary)
        unary = unary.transpose(2, 1, 0)
        w, h, c = unary.shape
        unary = unary.transpose(2, 0, 1).reshape(loader.n_classes, -1)
        unary = np.ascontiguousarray(unary)
       
        resized_img = np.ascontiguousarray(resized_img)

        d = dcrf.DenseCRF2D(w, h, loader.n_classes)
        d.setUnaryEnergy(unary)
        d.addPairwiseBilateral(sxy=5, srgb=3, rgbim=resized_img, compat=1)

        q = d.inference(50)
        mask = np.argmax(q, axis=0).reshape(w, h).transpose(1, 0)
        decoded_crf = loader.decode_segmap(np.array(mask, dtype=np.uint8))
        dcrf_path = args.out_path[:-4] + '_drf.png'
        misc.imsave(dcrf_path, decoded_crf)
        print("Dense CRF Processed Mask Saved at: {}".format(dcrf_path))

    if torch.cuda.is_available():
        model.cuda(0)
        images = Variable(img.cuda(0), volatile=True)
    else:
        images = Variable(img, volatile=True)

    pred = np.squeeze(outputs.data.max(1)[1].cpu().numpy(), axis=0)
    decoded = loader.decode_segmap(pred)
    print('Classes found: ', np.unique(pred))
    misc.imsave(args.out_path, decoded)
    print("Segmentation Mask Saved at: {}".format(args.out_path))
Example #32
0
def train(args):

    # Setup Augmentations
    data_aug= Compose([RandomRotate(10),                                        
                       RandomHorizontallyFlip()])

    # Setup Dataloader
    data_loader = get_loader(args.dataset)
    data_path = get_data_path(args.dataset)
    t_loader = data_loader(data_path, is_transform=True, img_size=(args.img_rows, args.img_cols), augmentations=data_aug)
    v_loader = data_loader(data_path, is_transform=True, split='val', img_size=(args.img_rows, args.img_cols))

    n_classes = t_loader.n_classes
    trainloader = data.DataLoader(t_loader, batch_size=args.batch_size, num_workers=8, shuffle=True)
    valloader = data.DataLoader(v_loader, batch_size=args.batch_size, num_workers=8)

    # Setup Metrics
    running_metrics = runningScore(n_classes)
        
    # Setup visdom for visualization
    if args.visdom:
        vis = visdom.Visdom()

        loss_window = vis.line(X=torch.zeros((1,)).cpu(),
                           Y=torch.zeros((1)).cpu(),
                           opts=dict(xlabel='minibatches',
                                     ylabel='Loss',
                                     title='Training Loss',
                                     legend=['Loss']))

    # Setup Model
    model = get_model(args.arch, n_classes)
    
    model = torch.nn.DataParallel(model, device_ids=range(torch.cuda.device_count()))
    model.cuda()
    
    # Check if model has custom optimizer / loss
    if hasattr(model.module, 'optimizer'):
        optimizer = model.module.optimizer
    else:
        optimizer = torch.optim.SGD(model.parameters(), lr=args.l_rate, momentum=0.99, weight_decay=5e-4)

    if hasattr(model.module, 'loss'):
        print('Using custom loss')
        loss_fn = model.module.loss
    else:
        loss_fn = cross_entropy2d

    if args.resume is not None:                                         
        if os.path.isfile(args.resume):
            print("Loading model and optimizer from checkpoint '{}'".format(args.resume))
            checkpoint = torch.load(args.resume)
            model.load_state_dict(checkpoint['model_state'])
            optimizer.load_state_dict(checkpoint['optimizer_state'])
            print("Loaded checkpoint '{}' (epoch {})"                    
                  .format(args.resume, checkpoint['epoch']))
        else:
            print("No checkpoint found at '{}'".format(args.resume)) 

    best_iou = -100.0 
    for epoch in range(args.n_epoch):
        model.train()
        for i, (images, labels) in enumerate(trainloader):
            images = Variable(images.cuda())
            labels = Variable(labels.cuda())

            optimizer.zero_grad()
            outputs = model(images)

            loss = loss_fn(input=outputs, target=labels)

            loss.backward()
            optimizer.step()

            if args.visdom:
                vis.line(
                    X=torch.ones((1, 1)).cpu() * i,
                    Y=torch.Tensor([loss.data[0]]).unsqueeze(0).cpu(),
                    win=loss_window,
                    update='append')

            if (i+1) % 20 == 0:
                print("Epoch [%d/%d] Loss: %.4f" % (epoch+1, args.n_epoch, loss.data[0]))

        model.eval()
        for i_val, (images_val, labels_val) in tqdm(enumerate(valloader)):
            images_val = Variable(images_val.cuda(), volatile=True)
            labels_val = Variable(labels_val.cuda(), volatile=True)

            outputs = model(images_val)
            pred = outputs.data.max(1)[1].cpu().numpy()
            gt = labels_val.data.cpu().numpy()
            running_metrics.update(gt, pred)

        score, class_iou = running_metrics.get_scores()
        for k, v in score.items():
            print(k, v)
        running_metrics.reset()

        if score['Mean IoU : \t'] >= best_iou:
            best_iou = score['Mean IoU : \t']
            state = {'epoch': epoch+1,
                     'model_state': model.state_dict(),
                     'optimizer_state' : optimizer.state_dict(),}
            torch.save(state, "{}_{}_best_model.pkl".format(args.arch, args.dataset))