Example #1
0
    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
Example #2
0
    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')
Example #3
0
    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 + '/')