Source code for image_segmentation.class_activation_maps.score
"""
==========================================================
Score for Semantic Segmentation Models to use tf-keras-vis
==========================================================
"""
import tensorflow as tf
from tensorflow.keras.backend import epsilon
[docs]class SegScore:
"""
Score for semantic segmentation models to use tf-keras-vis.
Attributes
----------
target_mask : tf.Tensor
Masks of the interest regions
target_class : int
Label or channel of the interest class.
"""
[docs] def __init__(self, target_mask: tf.Tensor, target_class: int = 0,
logits: bool = False) -> None:
"""
Parameters
----------
target_mask :
Masks of the interest regions
target_class :
Label or channel of the interest class.
logits :
If the values are from logit
"""
self.target_mask = self.__sparse(target_mask)
self.target_class = target_class
self.logits = logits
[docs] def __call__(self, pred: tf.Tensor) -> tf.Tensor:
""" Calculate scores
Parameters
----------
pred :
Predictions (masks) of a tf.keras.Model
Returns
-------
tuple
Score per instances
"""
channels = pred.shape[-1]
class_mask = self.target_mask == self.target_class
class_mask = tf.cast(class_mask,tf.float32)
class_pred = pred
if channels != 1:
class_pred = class_pred[...,self.target_class]
class_pred = class_pred[...,None]
else:
if self.target_class == 0:
if self.logits:
class_pred = -class_pred
elif not self.logits:
class_pred = 1-class_pred
masked_scores = class_mask*class_pred
N = tf.reduce_sum(class_mask,axis=[-1,-2,-3])
sum_scores = tf.reduce_sum(masked_scores, axis=[-1,-2,-3])
mean_scores = sum_scores/(N+epsilon())
return mean_scores
@staticmethod
def __sparse(masks: tf.Tensor) -> tf.Tensor:
""" Ensures target class be sparse
"""
channels = masks.shape[-1]
if channels == 1:
return masks
sparse_mask = tf.argmax(masks,axis=-1)
return sparse_mask[...,None]