def add_label_loss( model: tf.keras.Model, grid_fixed: tf.Tensor, fixed_label: (tf.Tensor, None), pred_fixed_label: (tf.Tensor, None), loss_config: dict, ) -> tf.keras.Model: """ Add label dissimilarity loss of ddf into model. :param model: tf.keras.Model :param grid_fixed: tensor of shape (f_dim1, f_dim2, f_dim3, 3) :param fixed_label: tensor of shape (batch, f_dim1, f_dim2, f_dim3) :param pred_fixed_label: tensor of shape (batch, f_dim1, f_dim2, f_dim3) :param loss_config: config for loss """ if fixed_label is not None: loss_label = tf.reduce_mean( label_loss.get_dissimilarity_fn( config=loss_config["dissimilarity"]["label"])( y_true=fixed_label, y_pred=pred_fixed_label)) weighted_loss_label = (loss_label * loss_config["dissimilarity"]["label"]["weight"]) model.add_loss(weighted_loss_label) model.add_metric(loss_label, name="loss/label_dissimilarity", aggregation="mean") model.add_metric( weighted_loss_label, name="loss/weighted_label_dissimilarity", aggregation="mean", ) # metrics dice_binary = label_loss.dice_score(y_true=fixed_label, y_pred=pred_fixed_label, binary=True) dice_float = label_loss.dice_score(y_true=fixed_label, y_pred=pred_fixed_label, binary=False) tre = label_loss.compute_centroid_distance(y_true=fixed_label, y_pred=pred_fixed_label, grid=grid_fixed) foreground_label = label_loss.foreground_proportion(y=fixed_label) foreground_pred = label_loss.foreground_proportion(y=pred_fixed_label) model.add_metric(dice_binary, name="metric/dice_binary", aggregation="mean") model.add_metric(dice_float, name="metric/dice_float", aggregation="mean") model.add_metric(tre, name="metric/tre", aggregation="mean") model.add_metric(foreground_label, name="metric/foreground_label", aggregation="mean") model.add_metric(foreground_pred, name="metric/foreground_pred", aggregation="mean") return model
def test_foreground_prop_binary(): """ Test foreground function with a tensor of zeros with some ones, asserting equal to known precomputed tensor. Testing with binary case. """ array_eye = np.identity((3)) tensor_eye = np.zeros((3, 3, 3, 3)) tensor_eye[:, :, 0:3, 0:3] = array_eye expect = [1.0 / 3, 1.0 / 3, 1.0 / 3] get = label.foreground_proportion(tensor_eye) assert assertTensorsEqual(get, expect)
def test_foreground_prop_binary(): """ Test foreground function with a tensor of zeros with some ones, asserting equal to known precomputed tensor. Testing with binary case. """ array_eye = np.identity(3, dtype=np.float32) tensor_eye = np.zeros((3, 3, 3, 3), dtype=np.float32) tensor_eye[:, :, 0:3, 0:3] = array_eye expect = tf.convert_to_tensor([1.0 / 3, 1.0 / 3, 1.0 / 3], dtype=tf.float32) get = label.foreground_proportion(tensor_eye) assert is_equal_tf(get, expect)
def test_foreground_prop_simple(): """ Test foreground functions with a tensor of zeros with some ones and some values below one to assert the thresholding works. """ array_eye = np.identity((3)) tensor_eye = np.zeros((3, 3, 3, 3)) tensor_eye[:, 0, :, :] = 0.4 * array_eye # 0 tensor_eye[:, 1, :, :] = array_eye tensor_eye[:, 2, :, :] = array_eye expect = [54 / (27 * 9), 54 / (27 * 9), 54 / (27 * 9)] get = label.foreground_proportion(tensor_eye) assert assertTensorsEqual(get, expect)
def test_foreground_prop_simple(): """ Test foreground functions with a tensor of zeros with some ones and some values below one to assert the thresholding works. """ array_eye = np.identity(3, dtype=np.float32) tensor_eye = np.zeros((3, 3, 3, 3), dtype=np.float32) tensor_eye[:, 0, :, :] = 0.4 * array_eye # 0 tensor_eye[:, 1, :, :] = array_eye tensor_eye[:, 2, :, :] = array_eye tensor_eye = tf.convert_to_tensor(tensor_eye, dtype=tf.float32) expect = [54 / (27 * 9), 54 / (27 * 9), 54 / (27 * 9)] get = label.foreground_proportion(tensor_eye) assert is_equal_tf(get, expect)