def _train_epoch(self, epoch):

        # lr update
        if self.lr_scheduler is not None:
            self.lr_scheduler.step(epoch)
            for param_group in self.optimizer.param_groups:
                self.current_lr = param_group['lr']

        batch_time = AverageMeter()
        data_time = AverageMeter()
        ave_total_loss = AverageMeter()
        ave_acc = AverageMeter()
        ave_iou = AverageMeter()

        # set model mode
        self.model.train()
        tic = time.time()

        for steps, (data, target) in enumerate(self.train_data_loader,
                                               start=1):

            data = data.to(self.device, non_blocking=True)
            target = target.to(self.device, non_blocking=True)
            # 加载数据所用的时间
            data_time.update(time.time() - tic)

            # forward calculate
            logits = self.model(data)
            loss = self.loss(logits, target)
            acc = Accuracy(logits, target)
            miou = MIoU(logits, target, self.config.nb_classes)

            # compute gradient and do SGD step
            self.optimizer.zero_grad()
            loss.backward()
            self.optimizer.step()

            # update average metrics
            batch_time.update(time.time() - tic)
            ave_total_loss.update(loss.data.item())
            ave_acc.update(acc.item())
            ave_iou.update(miou.item())

            # display on the screen per display_steps
            if steps % self.dis_period == 0:
                print(
                    'Epoch: [{}][{}/{}],\n'
                    'Learning_Rate: {:.6f},\n'
                    'Time: {:.4f},       Data:     {:.4f},\n'
                    'MIoU: {:6.4f},      Accuracy: {:6.4f},      Loss: {:.6f}'.
                    format(epoch, steps, len(self.train_data_loader),
                           self.current_lr, batch_time.average(),
                           data_time.average(), ave_iou.average(),
                           ave_acc.average(), ave_total_loss.average()))
            tic = time.time()
        #  train log and return
        self.history['train']['epoch'].append(epoch)
        self.history['train']['loss'].append(ave_total_loss.average())
        self.history['train']['acc'].append(ave_acc.average())
        self.history['train']['miou'].append(ave_iou.average())
        return {
            'epoch': epoch,
            'loss': ave_total_loss.average(),
            'acc': ave_acc.average(),
            'miou': ave_iou.average(),
        }
    def _eval_epoch(self, epoch):

        batch_time = AverageMeter()
        data_time = AverageMeter()
        ave_total_loss = AverageMeter()
        ave_acc = AverageMeter()
        ave_iou = AverageMeter()

        # set model mode
        self.model.eval()

        with torch.no_grad():
            tic = time.time()
            for steps, (data, target) in enumerate(self.valid_data_loder,
                                                   start=1):

                # processing no blocking
                # non_blocking tries to convert asynchronously with respect to the host if possible
                # converting CPU tensor with pinned memory to CUDA tensor
                # overlap transfer if pinned memory
                data = data.to(self.device, non_blocking=True)
                target = target.to(self.device, non_blocking=True)
                data_time.update(time.time() - tic)

                logits = self.model(data)
                loss = self.loss(logits, target)
                # calculate metrics
                acc = Accuracy(logits, target)
                miou = MIoU(logits, target, self.config.nb_classes)
                #print("===========acc, miou==========", acc, miou)

                # update ave metrics
                batch_time.update(time.time() - tic)

                ave_total_loss.update(loss.data.item())
                ave_acc.update(acc.item())
                ave_iou.update(miou.item())
                tic = time.time()
            # display validation at the end
            print('Epoch {} validation done !'.format(epoch))
            print('Time: {:.4f},       Data:     {:.4f},\n'
                  'MIoU: {:6.4f},      Accuracy: {:6.4f},      Loss: {:.6f}'.
                  format(batch_time.average(), data_time.average(),
                         ave_iou.average(), ave_acc.average(),
                         ave_total_loss.average()))

        self.history['valid']['epoch'].append(epoch)
        self.history['valid']['loss'].append(ave_total_loss.average())
        self.history['valid']['acc'].append(ave_acc.average())
        self.history['valid']['miou'].append(ave_iou.average())
        #  validation log and return
        return {
            'epoch': epoch,
            'val_Loss': ave_total_loss.average(),
            'val_Accuracy': ave_acc.average(),
            'val_MIoU': ave_iou.average(),
        }
Beispiel #3
0
    def eval_and_predict(self):

        self._resume_ckpt()

        self.model.eval()

        #predictions = []
        #filenames = []
        predict_time = AverageMeter()
        batch_time = AverageMeter()
        data_time = AverageMeter()
        ave_total_loss = AverageMeter()
        ave_acc = AverageMeter()
        ave_iou = AverageMeter()

        with torch.no_grad():
            tic = time.time()
            for steps, (data, target, filename) in enumerate(self.test_data_loader,start=1):

                # data
                data = data.to(self.device, non_blocking=True)
                target = target.to(self.device, non_blocking=True)
                data_time.update(time.time()-tic)

                # output, loss, and metrics
                pre_tic = time.time()
                logits = self.model(data)
                self._save_pred(logits, filename)
                predict_time.update(time.time()-pre_tic)

                loss = self.loss(logits, target)
                acc = Accuracy(logits, target)
                miou = MIoU(logits, target, self.config.nb_classes)

                # update ave loss and metrics
                batch_time.update(time.time()-tic)
                tic = time.time()

                ave_total_loss.update(loss.data.item())
                ave_acc.update(acc)
                ave_iou.update(miou)

            # display evaluation result at the end
            print('Evaluation phase !\n'
                  'Time: {:.2f},  Data: {:.2f},\n'
                  'MIoU: {:6.4f}, Accuracy: {:6.4f}, Loss: {:.6f}'
                  .format(batch_time.average(), data_time.average(),
                          ave_iou.average(), ave_acc.average(), ave_total_loss.average()))
            #print('Saving Predict Map ... ...')
            #self._save_pred(predictions, filenames)
            print('Prediction Phase !\n'
                  'Total Time cost: {}s\n'
                  'Average Time cost per batch: {}s!'
                  .format(predict_time._get_sum(), predict_time.average()))


        self.history['eval']['loss'].append(ave_total_loss.average())
        self.history['eval']['acc'].append(ave_acc.average())
        self.history['eval']['miou'].append(ave_iou.average())
        self.history['eval']['time'].append(predict_time.average())

        #TODO
        print("     + Saved history of evaluation phase !")
        hist_path = os.path.join(self.test_log_path, "history1.txt")
        with open(hist_path, 'w') as f:
            f.write(str(self.history))