예제 #1
0
    def validation(self):
        tbar = tqdm(self.valloader)
        self.model.eval()
        metric = IOUandSek(num_classes=len(ChangeDetection.CLASSES))
        if self.args.save_mask:
            cmap = color_map()

        with torch.no_grad():
            for img1, img2, mask1, mask2, id in tbar:
                img1, img2 = img1.cuda(), img2.cuda()

                out1, out2, out_bin = self.model(img1, img2, self.args.tta)
                out1 = torch.argmax(out1, dim=1).cpu().numpy() + 1
                out2 = torch.argmax(out2, dim=1).cpu().numpy() + 1
                out_bin = (out_bin > 0.5).cpu().numpy().astype(np.uint8)
                out1[out_bin == 1] = 0
                out2[out_bin == 1] = 0

                if self.args.save_mask:
                    for i in range(out1.shape[0]):
                        mask = Image.fromarray(out1[i].astype(np.uint8),
                                               mode="P")
                        mask.putpalette(cmap)
                        mask.save("outdir/masks/val/im1/" + id[i])

                        mask = Image.fromarray(out2[i].astype(np.uint8),
                                               mode="P")
                        mask.putpalette(cmap)
                        mask.save("outdir/masks/val/im2/" + id[i])

                metric.add_batch(out1, mask1.numpy())
                metric.add_batch(out2, mask2.numpy())

                score, miou, sek = metric.evaluate()

                tbar.set_description(
                    "Score: %.2f, IOU: %.2f, SeK: %.2f" %
                    (score * 100.0, miou * 100.0, sek * 100.0))

        if self.args.load_from:
            exit(0)

        score *= 100.0
        if score >= self.previous_best:
            if self.previous_best != 0:
                model_path = "outdir/models/%s_%s_%.2f.pth" % \
                             (self.args.model, self.args.backbone, self.previous_best)
                if os.path.exists(model_path):
                    os.remove(model_path)

            torch.save(
                self.model.module.state_dict(),
                "outdir/models/%s_%s_%.2f.pth" %
                (self.args.model, self.args.backbone, score))
            self.previous_best = score
예제 #2
0
                       len(dataset.CLASSES) - 1, True)
    model4.load_state_dict(
        torch.load('outdir/models/pspnet_hrnet_w48_37.63.pth'), strict=True)

    model5 = get_model('pspnet', 'hrnet_w64', False,
                       len(dataset.CLASSES) - 1, True)
    model5.load_state_dict(
        torch.load('outdir/models/pspnet_hrnet_w64_37.89.pth'), strict=True)

    models = [model1, model2, model3, model4, model5]
    for i in range(len(models)):
        models[i] = DataParallel(models[i]).cuda()
        models[i].eval()

    tbar = tqdm(dataloader)
    cmap = color_map()
    for img1, img2, mask1, mask2, id in tbar:
        img1, img2 = img1.cuda(), img2.cuda()

        pseudo_mask1_list, pseudo_mask2_list = [], []
        mask1 = mask1.numpy()
        mask2 = mask2.numpy()
        for model in models:
            with torch.no_grad():
                out1, out2, out_bin = model(img1, img2, True)

            out1 = torch.argmax(out1, dim=1).cpu().numpy() + 1
            out2 = torch.argmax(out2, dim=1).cpu().numpy() + 1

            pseudo_mask1 = np.zeros_like(out1)
            pseudo_mask2 = np.zeros_like(out2)