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
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)