123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- """
- This code is refer from:
- https://github.com/whai362/PSENet/blob/python3/models/loss/iou.py
- """
- import paddle
- EPS = 1e-6
- def iou_single(a, b, mask, n_class):
- valid = mask == 1
- a = a.masked_select(valid)
- b = b.masked_select(valid)
- miou = []
- for i in range(n_class):
- if a.shape == [0] and a.shape == b.shape:
- inter = paddle.to_tensor(0.0)
- union = paddle.to_tensor(0.0)
- else:
- inter = ((a == i).logical_and(b == i)).astype('float32')
- union = ((a == i).logical_or(b == i)).astype('float32')
- miou.append(paddle.sum(inter) / (paddle.sum(union) + EPS))
- miou = sum(miou) / len(miou)
- return miou
- def iou(a, b, mask, n_class=2, reduce=True):
- batch_size = a.shape[0]
- a = a.reshape([batch_size, -1])
- b = b.reshape([batch_size, -1])
- mask = mask.reshape([batch_size, -1])
- iou = paddle.zeros((batch_size, ), dtype='float32')
- for i in range(batch_size):
- iou[i] = iou_single(a[i], b[i], mask[i], n_class)
- if reduce:
- iou = paddle.mean(iou)
- return iou
|