Skip to content

Instantly share code, notes, and snippets.

@Z-Zheng
Created September 3, 2019 09:35
Show Gist options
  • Save Z-Zheng/2dc93fee7633ef74e72e612be4f544ed to your computer and use it in GitHub Desktop.
Save Z-Zheng/2dc93fee7633ef74e72e612be4f544ed to your computer and use it in GitHub Desktop.
todo
class mIoU(Node):
def __init__(self, num_classes, log_file=None):
self.num_classes = num_classes
self.log_file = None
self._total = sparse.coo_matrix((num_classes, num_classes), dtype=np.float32)
@staticmethod
def compute_iou_per_class(confusion_matrix):
"""
Args:
confusion_matrix: numpy array [num_classes, num_classes] row - gt, col - pred
Returns:
iou_per_class: float32 [num_classes, ]
"""
sum_over_row = np.sum(confusion_matrix, axis=0)
sum_over_col = np.sum(confusion_matrix, axis=1)
diag = np.diag(confusion_matrix)
denominator = sum_over_row + sum_over_col - diag
iou_per_class = diag / denominator
return iou_per_class
def forward(self, y_pred, y_true):
if isinstance(y_pred, torch.Tensor):
y_pred = y_pred.cpu().numpy()
if isinstance(y_true, torch.Tensor):
y_true = y_true.cpu().numpy()
y_pred = y_pred.reshape((-1,))
y_true = y_true.reshape((-1,))
v = np.ones_like(y_pred)
cm = sparse.coo_matrix((v, (y_true, y_pred)), shape=(self.num_classes, self.num_classes), dtype=np.float32)
self._total += cm
def after_callback(self):
# todo: (wjj) print miou into log file
pass
@Junjue-Wang
Copy link

from simplecv.util.logger import get_console_file_logger
import logging

class mIoU(Node):
def init(self, num_classes, log_dir=None):
self.num_classes = num_classes
self.log_file = None
self._total = sparse.coo_matrix((num_classes, num_classes), dtype=np.float32)
self.logger = get_console_file_logger(self.class.name, logging.INFO, log_dir)
@staticmethod
def compute_iou_per_class(confusion_matrix):
"""
Args:
confusion_matrix: numpy array [num_classes, num_classes] row - gt, col - pred
Returns:
iou_per_class: float32 [num_classes, ]
"""
sum_over_row = np.sum(confusion_matrix, axis=0)
sum_over_col = np.sum(confusion_matrix, axis=1)
diag = np.diag(confusion_matrix)
denominator = sum_over_row + sum_over_col - diag

    iou_per_class = diag / denominator

    return iou_per_class

def forward(self, y_pred, y_true):
    if isinstance(y_pred, torch.Tensor):
        y_pred = y_pred.cpu().numpy()
    if isinstance(y_true, torch.Tensor):
        y_true = y_true.cpu().numpy()

    y_pred = y_pred.reshape((-1,))
    y_true = y_true.reshape((-1,))

    v = np.ones_like(y_pred)
    cm = sparse.coo_matrix((v, (y_true, y_pred)), shape=(self.num_classes, self.num_classes), dtype=np.float32)
    self._total += cm

def after_callback(self):
    dense_cm = self._total.toarray()
    iou_per_class = compute_iou_per_class(dense_cm)
    miou = iou_per_class.mean()

    for i in range(len(iou_per_class)):
        self.logger.info('[Eval] iou_{} = {value}'.format(i, value=np.round(iou_per_class[i], 6)))
    self.logger.info('[Eval] miou = {value}'.format(float(miou)))

def compute_iou_per_class(confusion_matrix):
"""
Args:
confusion_matrix: numpy array [num_classes, num_classes] row - gt, col - pred
Returns:
iou_per_class: float32 [num_classes, ]
"""
sum_over_row = np.sum(confusion_matrix, axis=0)
sum_over_col = np.sum(confusion_matrix, axis=1)
diag = np.diag(confusion_matrix)
denominator = sum_over_row + sum_over_col - diag

iou_per_class = diag / denominator

return iou_per_class

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment