def val(self): self.model.eval() tbar = tqdm(self.valid_queue) with torch.no_grad(): for step, (input, target) in enumerate(tbar): input = input.cuda(self.device) target = target.cuda(self.device) predicts = self.model(input) val_loss = self.criterion( predicts if self.aux else predicts[0], target) self.val_loss_meter.update(val_loss.item()) self.metric_val.update(target, predicts[0]) if step % self.cfg['training']['report_freq'] == 0: pixAcc, mIoU, dice = self.metric_val.get() self.logger.info( 'Val loss: {}, pixAcc: {}, mIoU: {}, dice: {}'.format( self.val_loss_meter.mloss(), pixAcc, mIoU, dice)) tbar.set_description( 'val loss: %.6f, pixAcc: %.3f, mIoU: %.6f, dice: %.6f' % (self.val_loss_meter.mloss(), pixAcc, mIoU, dice)) # save images # cause the predicts is a list [pred, aux_pred(may not)] if len(predicts[0].shape) == 4: # pred = predicts[0] else: pred = predicts grid_image = store_images(input, pred, target) self.writer.add_image('Val', grid_image, self.epoch) # save in tensorboard scalars pixAcc, mIoU, dice = self.metric_val.get() cur_loss = self.val_loss_meter.mloss() self.logger.info( 'Epoch {} Val loss: {}, pixAcc: {}, mIoU: {}, dice: {}'.format( self.epoch, cur_loss, pixAcc, mIoU, dice)) self.writer.add_scalar('Val/Acc', pixAcc, self.epoch) self.writer.add_scalar('Val/mIoU', mIoU, self.epoch) self.writer.add_scalar('Val/dice', dice, self.epoch) self.writer.add_scalar('Val/loss', cur_loss, self.epoch) # for early-stopping if self.best_loss > cur_loss or self.best_mIoU < mIoU: self.patience = 0 else: self.patience += 1 # Store best score self.best_pixAcc = pixAcc if self.best_pixAcc < pixAcc else self.best_pixAcc self.best_loss = cur_loss if self.best_loss > cur_loss else self.best_loss if self.best_mIoU < mIoU: self.best_mIoU = mIoU self.best_dice_coeff = dice self.save_best = True
def test(self): self.model.eval() predict_list = [] tbar = tqdm(self.test_queue) with torch.no_grad(): for step, (input, target) in enumerate(tbar): input = input.cuda(self.device) if not isinstance(target, list) and not isinstance( target, str): target = target.cuda(self.device) elif isinstance(target, str): target = target.split('.')[0] + '_mask.tiff' predicts = self.model(input) # for cityscapes, voc, camvid if not isinstance(target, list): test_loss = self.criterion( predicts if self.aux else predicts[0], target) self.test_loss_meter.update(test_loss.item()) self.metric_test.update(target, predicts[0]) else: # for promise12 N = predicts[0].shape[0] for i in range(N): predict_list += [ torch.argmax(predicts[0], 1).cpu().numpy()[i] ] # cause the predicts is a list [pred, aux_pred(may not)] if len(predicts[0].shape) == 4: # pred = predicts[0] else: pred = predicts # save images if not isinstance(target, list): grid_image = store_images(input, pred, target) self.writer.add_image('Test', grid_image, self.epoch) pixAcc, mIoU, dice = self.metric_test.get() self.logger.info( 'Test/loss: {}, pixAcc: {}, mIoU: {}, dice: {}'.format( self.test_loss_meter.mloss(), pixAcc, mIoU, dice)) else: predict_test(predict_list, target, self.save_path + '/test_rst')
def test(self, img_queue, split='val', desc=''): self.model.eval() predict_list = [] accuracy = 0 tbar = tqdm(img_queue) create_exp_dir(desc, desc='=>Save prediction image on') with torch.no_grad(): for step, (input, target) in enumerate(tbar): input = input.cuda(self.device) if not isinstance(target, list): target = target.cuda(self.device) predicts = self.model(input) # for cityscapes, voc, camvid, test have label if not isinstance(target, list): test_loss = self.criterion(predicts[0], target) self.loss_meter.update(test_loss.item()) self.metric.update(target, predicts[0]) if step % self.cfg['training']['report_freq'] == 0: pixAcc, mIoU = self.metric.get() self.logger.info( '{} loss: {}, pixAcc: {}, mIoU: {}'.format( split, self.loss_meter.mloss, pixAcc, mIoU)) tbar.set_description( 'loss: %.6f, pixAcc: %.3f, mIoU: %.6f' % (self.loss_meter.mloss, pixAcc, mIoU)) accuracy += dice_coefficient(predicts[0].cpu(), target.cpu()) else: N = predicts[0].shape[0] for i in range(N): if self.args.crf: # use crf predict = torch.argmax(predicts[0].cpu(), 1)[i] predict = dense_crf( np.array(input[i].cpu()).astype(np.uint8), predict) > 0.5 img = Image.fromarray( (predict * 255).astype(np.uint8)) file_name = os.path.split(target[i])[1] file_name = file_name.split('.')[0] + '_mask.tif' img.save(os.path.join(desc, file_name)) else: img = Image.fromarray( (torch.argmax(predicts[0].cpu(), 1)[i] * 255).numpy().astype(np.uint8)) file_name = os.path.split(target[i])[1] file_name = file_name.split('.')[0] + '_mask.tif' img.save(os.path.join(desc, file_name)) if desc == 'promise12': # for promise12, test have not label or have label to calc extra metric predict_list += [ torch.argmax(predicts[0], dim=1).cpu().numpy() ] print('==> accuracy: {}'.format(accuracy / len(img_queue))) # cause the predicts is a list [pred, aux_pred(may not)] if len(predicts[0].shape) == 4: # pred = predicts[0] else: pred = predicts # save images if not isinstance(target, list) and not isinstance(target, str): # grid_image = store_images(input, pred, target) pixAcc, mIoU = self.metric.get() self.logger.info('{}/loss: {}, pixAcc: {}, mIoU: {}'.format( split, self.loss_meter.mloss, pixAcc, mIoU)) elif desc == 'promise12': # for promise12, test have not label predict_test(predict_list, target, self.save_path + '/{}_rst'.format(split)) # for promise12 metirc if desc == 'promise12' and split == 'val': val_list = [5, 15, 25, 35, 45] dir = os.path.join(self.trainset.root_dir, self.trainset.base_dir, 'TrainingData') biomedical_image_metric(predict_list, val_list, dir + '/')