text: # Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  #    http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  
  import os
  import os.path as osp
  
  import numpy as np
  from PIL import Image
  import time
  import paddle
  import paddle.nn.functional as F
  
  from paddleseg.utils import metrics, TimeAverager, calculate_eta, logger, progbar, get_image_list
  from paddleseg.core.infer import reverse_transform
  
  
  def evaluate(
          img_dir,
          gt_dir,
          num_classes,
          ignore_index=255,
          print_detail=True,
  ):
      """
      Launch evalution.
  
      Args:
          eval_dataset (paddle.io.Dataset): Used to read and process validation datasets.
          aug_eval (bool, optional): Whether to use mulit-scales and flip augment for evaluation. Default: False.
          scales (list|float, optional): Scales for augment. It is valid when `aug_eval` is True. Default: 1.0.
          flip_horizontal (bool, optional): Whether to use flip horizontally augment. It is valid when `aug_eval` is True. Default: True.
          flip_vertical (bool, optional): Whether to use flip vertically augment. It is valid when `aug_eval` is True. Default: False.
          is_slide (bool, optional): Whether to evaluate by sliding window. Default: False.
          stride (tuple|list, optional): The stride of sliding window, the first is width and the second is height.
              It should be provided when `is_slide` is True.
          crop_size (tuple|list, optional):  The crop size of sliding window, the first is width and the second is height.
              It should be provided when `is_slide` is True.
          num_workers (int, optional): Num workers for data loader. Default: 0.
          print_detail (bool, optional): Whether to print detailed information about the evaluation process. Default: True.
  
      Returns:
          float: The mIoU of validation datasets.
          float: The accuracy of validation datasets.
      """
      intersect_area_all = 0
      pred_area_all = 0
      label_area_all = 0
  
      image_list, _ = get_image_list(img_dir)
      for im_path in image_list:
          im_name = osp.basename(im_path)
          gt_path = osp.join(gt_dir, im_name)
          img = paddle.to_tensor(np.asarray(Image.open(im_path)), dtype='int32')
          gt = paddle.to_tensor(np.asarray(Image.open(gt_path)), dtype='int32')
          img = paddle.unsqueeze(img, axis=[0, 1])
          gt = paddle.unsqueeze(gt, axis=[0, 1])
  
          ori_shape = gt.shape[-2:]
          pred = F.interpolate(img, ori_shape, mode='nearest')
  
          intersect_area, pred_area, label_area = metrics.calculate_area(
              pred, gt, num_classes, ignore_index=ignore_index)
  
          intersect_area_all = intersect_area_all + intersect_area
          pred_area_all = pred_area_all + pred_area
          label_area_all = label_area_all + label_area
  
      class_iou, miou = metrics.mean_iou(intersect_area_all, pred_area_all,
                                         label_area_all)
      class_acc, acc = metrics.accuracy(intersect_area_all, pred_area_all)
      kappa = metrics.kappa(intersect_area_all, pred_area_all, label_area_all)
  
      if print_detail:
          print("#Images: {} \nmIoU: {} \nAcc: {} \nKappa: {} ".format(
              len(image_list), miou, acc, kappa))
          print("Class IoU: " + str(class_iou))
          print("Class Acc: " + str(class_acc))
      metrics_dict = {}
      metrics_dict['#Images'] = len(image_list)
      metrics_dict['mIoU'] = miou
      metrics_dict['Acc'] = acc
      metrics_dict['Kappa'] = kappa
      metrics_dict['Class IoU'] = class_iou
      metrics_dict['Class Acc'] = class_acc
      return metrics_dict
  