| | import cv2 |
| | import os |
| | import numpy as np |
| |
|
| | from collections import OrderedDict |
| | from PIL import Image as PILImage |
| | from utils.transforms import transform_parsing |
| |
|
| | LABELS = ['Background', 'Hat', 'Hair', 'Glove', 'Sunglasses', 'Upper-clothes', 'Dress', 'Coat', \ |
| | 'Socks', 'Pants', 'Jumpsuits', 'Scarf', 'Skirt', 'Face', 'Left-arm', 'Right-arm', 'Left-leg', |
| | 'Right-leg', 'Left-shoe', 'Right-shoe'] |
| |
|
| |
|
| | |
| |
|
| | def get_palette(num_cls): |
| | """ Returns the color map for visualizing the segmentation mask. |
| | Args: |
| | num_cls: Number of classes |
| | Returns: |
| | The color map |
| | """ |
| |
|
| | n = num_cls |
| | palette = [0] * (n * 3) |
| | for j in range(0, n): |
| | lab = j |
| | palette[j * 3 + 0] = 0 |
| | palette[j * 3 + 1] = 0 |
| | palette[j * 3 + 2] = 0 |
| | i = 0 |
| | while lab: |
| | palette[j * 3 + 0] |= (((lab >> 0) & 1) << (7 - i)) |
| | palette[j * 3 + 1] |= (((lab >> 1) & 1) << (7 - i)) |
| | palette[j * 3 + 2] |= (((lab >> 2) & 1) << (7 - i)) |
| | i += 1 |
| | lab >>= 3 |
| | return palette |
| |
|
| |
|
| | def get_confusion_matrix(gt_label, pred_label, num_classes): |
| | """ |
| | Calcute the confusion matrix by given label and pred |
| | :param gt_label: the ground truth label |
| | :param pred_label: the pred label |
| | :param num_classes: the nunber of class |
| | :return: the confusion matrix |
| | """ |
| | index = (gt_label * num_classes + pred_label).astype('int32') |
| | label_count = np.bincount(index) |
| | confusion_matrix = np.zeros((num_classes, num_classes)) |
| |
|
| | for i_label in range(num_classes): |
| | for i_pred_label in range(num_classes): |
| | cur_index = i_label * num_classes + i_pred_label |
| | if cur_index < len(label_count): |
| | confusion_matrix[i_label, i_pred_label] = label_count[cur_index] |
| |
|
| | return confusion_matrix |
| |
|
| |
|
| | def compute_mean_ioU(preds, scales, centers, num_classes, datadir, input_size=[473, 473], dataset='val'): |
| | val_file = os.path.join(datadir, dataset + '_id.txt') |
| | val_id = [i_id.strip() for i_id in open(val_file)] |
| |
|
| | confusion_matrix = np.zeros((num_classes, num_classes)) |
| |
|
| | for i, pred_out in enumerate(preds): |
| | im_name = val_id[i] |
| | gt_path = os.path.join(datadir, dataset + '_segmentations', im_name + '.png') |
| | gt = np.array(PILImage.open(gt_path)) |
| | h, w = gt.shape |
| | s = scales[i] |
| | c = centers[i] |
| | pred = transform_parsing(pred_out, c, s, w, h, input_size) |
| |
|
| | gt = np.asarray(gt, dtype=np.int32) |
| | pred = np.asarray(pred, dtype=np.int32) |
| |
|
| | ignore_index = gt != 255 |
| |
|
| | gt = gt[ignore_index] |
| | pred = pred[ignore_index] |
| |
|
| | confusion_matrix += get_confusion_matrix(gt, pred, num_classes) |
| |
|
| | pos = confusion_matrix.sum(1) |
| | res = confusion_matrix.sum(0) |
| | tp = np.diag(confusion_matrix) |
| |
|
| | pixel_accuracy = (tp.sum() / pos.sum()) * 100 |
| | mean_accuracy = ((tp / np.maximum(1.0, pos)).mean()) * 100 |
| | IoU_array = (tp / np.maximum(1.0, pos + res - tp)) |
| | IoU_array = IoU_array * 100 |
| | mean_IoU = IoU_array.mean() |
| | print('Pixel accuracy: %f \n' % pixel_accuracy) |
| | print('Mean accuracy: %f \n' % mean_accuracy) |
| | print('Mean IU: %f \n' % mean_IoU) |
| | name_value = [] |
| |
|
| | for i, (label, iou) in enumerate(zip(LABELS, IoU_array)): |
| | name_value.append((label, iou)) |
| |
|
| | name_value.append(('Pixel accuracy', pixel_accuracy)) |
| | name_value.append(('Mean accuracy', mean_accuracy)) |
| | name_value.append(('Mean IU', mean_IoU)) |
| | name_value = OrderedDict(name_value) |
| | return name_value |
| |
|
| |
|
| | def compute_mean_ioU_file(preds_dir, num_classes, datadir, dataset='val'): |
| | list_path = os.path.join(datadir, dataset + '_id.txt') |
| | val_id = [i_id.strip() for i_id in open(list_path)] |
| |
|
| | confusion_matrix = np.zeros((num_classes, num_classes)) |
| |
|
| | for i, im_name in enumerate(val_id): |
| | gt_path = os.path.join(datadir, 'segmentations', im_name + '.png') |
| | gt = cv2.imread(gt_path, cv2.IMREAD_GRAYSCALE) |
| |
|
| | pred_path = os.path.join(preds_dir, im_name + '.png') |
| | pred = np.asarray(PILImage.open(pred_path)) |
| |
|
| | gt = np.asarray(gt, dtype=np.int32) |
| | pred = np.asarray(pred, dtype=np.int32) |
| |
|
| | ignore_index = gt != 255 |
| |
|
| | gt = gt[ignore_index] |
| | pred = pred[ignore_index] |
| |
|
| | confusion_matrix += get_confusion_matrix(gt, pred, num_classes) |
| |
|
| | pos = confusion_matrix.sum(1) |
| | res = confusion_matrix.sum(0) |
| | tp = np.diag(confusion_matrix) |
| |
|
| | pixel_accuracy = (tp.sum() / pos.sum()) * 100 |
| | mean_accuracy = ((tp / np.maximum(1.0, pos)).mean()) * 100 |
| | IoU_array = (tp / np.maximum(1.0, pos + res - tp)) |
| | IoU_array = IoU_array * 100 |
| | mean_IoU = IoU_array.mean() |
| | print('Pixel accuracy: %f \n' % pixel_accuracy) |
| | print('Mean accuracy: %f \n' % mean_accuracy) |
| | print('Mean IU: %f \n' % mean_IoU) |
| | name_value = [] |
| |
|
| | for i, (label, iou) in enumerate(zip(LABELS, IoU_array)): |
| | name_value.append((label, iou)) |
| |
|
| | name_value.append(('Pixel accuracy', pixel_accuracy)) |
| | name_value.append(('Mean accuracy', mean_accuracy)) |
| | name_value.append(('Mean IU', mean_IoU)) |
| | name_value = OrderedDict(name_value) |
| | return name_value |
| |
|