|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""Tests for loss_builder.py.""" |
|
|
|
import numpy as np |
|
import tensorflow as tf |
|
|
|
from deeplab2 import common |
|
from deeplab2 import trainer_pb2 |
|
from deeplab2.model.loss import loss_builder as loss |
|
|
|
|
|
class LossTest(tf.test.TestCase): |
|
|
|
def test_panoptic_deeplab_loss(self): |
|
ignore_label = 255 |
|
num_classes = 19 |
|
semantic_loss_options = trainer_pb2.LossOptions.SingleLossOptions( |
|
name='softmax_cross_entropy') |
|
center_loss_options = trainer_pb2.LossOptions.SingleLossOptions(name='mse') |
|
regression_loss_options = trainer_pb2.LossOptions.SingleLossOptions( |
|
name='l1') |
|
motion_loss_options = trainer_pb2.LossOptions.SingleLossOptions( |
|
name='l1') |
|
loss_options = trainer_pb2.LossOptions( |
|
semantic_loss=semantic_loss_options, |
|
center_loss=center_loss_options, |
|
regression_loss=regression_loss_options, |
|
motion_loss=motion_loss_options) |
|
|
|
loss_layer = loss.DeepLabFamilyLoss( |
|
loss_options, |
|
num_classes=num_classes, |
|
ignore_label=ignore_label, |
|
thing_class_ids=tuple(range(11, 19))) |
|
|
|
pred_dict = { |
|
common.PRED_SEMANTIC_LOGITS_KEY: |
|
tf.random.uniform(shape=[2, 33, 33, num_classes]), |
|
common.PRED_CENTER_HEATMAP_KEY: |
|
tf.zeros(shape=[2, 33, 33]), |
|
common.PRED_OFFSET_MAP_KEY: |
|
tf.zeros(shape=[2, 33, 33, 2]), |
|
common.PRED_FRAME_OFFSET_MAP_KEY: |
|
tf.zeros(shape=[2, 33, 33, 2]), |
|
} |
|
|
|
with self.subTest('Test center loss.'): |
|
gt_dict = { |
|
common.GT_SEMANTIC_KEY: |
|
tf.ones(shape=[2, 33, 33]) * ignore_label, |
|
common.GT_INSTANCE_CENTER_KEY: |
|
tf.ones(shape=[2, 33, 33]) * 2, |
|
common.GT_INSTANCE_REGRESSION_KEY: |
|
tf.zeros(shape=[2, 33, 33, 2]), |
|
common.GT_FRAME_OFFSET_KEY: |
|
tf.zeros(shape=[2, 33, 33, 2]), |
|
common.SEMANTIC_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
common.CENTER_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
common.REGRESSION_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
common.FRAME_REGRESSION_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
} |
|
|
|
expected_result = tf.ones(shape=[2]) * 4 |
|
loss_result = loss_layer(gt_dict, pred_dict)[common.TOTAL_LOSS] |
|
|
|
np.testing.assert_equal(loss_result.numpy(), expected_result.numpy()) |
|
|
|
with self.subTest('Test regression loss.'): |
|
gt_dict = { |
|
common.GT_SEMANTIC_KEY: |
|
tf.ones(shape=[2, 33, 33]) * ignore_label, |
|
common.GT_INSTANCE_CENTER_KEY: |
|
tf.zeros(shape=[2, 33, 33]), |
|
common.GT_INSTANCE_REGRESSION_KEY: |
|
tf.ones(shape=[2, 33, 33, 2]) * 2, |
|
common.GT_FRAME_OFFSET_KEY: |
|
tf.ones(shape=[2, 33, 33, 2]) * 2, |
|
common.SEMANTIC_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
common.CENTER_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
common.REGRESSION_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
common.FRAME_REGRESSION_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
} |
|
expected_result = tf.ones(shape=[2]) * 4 |
|
loss_result = loss_layer(gt_dict, pred_dict)[common.TOTAL_LOSS] |
|
|
|
np.testing.assert_equal(loss_result.numpy(), expected_result.numpy()) |
|
|
|
with self.subTest('Test instances losses.'): |
|
gt_dict = { |
|
common.GT_SEMANTIC_KEY: |
|
tf.ones(shape=[2, 33, 33]) * ignore_label, |
|
common.GT_INSTANCE_CENTER_KEY: |
|
tf.ones(shape=[2, 33, 33]) * 2, |
|
common.GT_INSTANCE_REGRESSION_KEY: |
|
tf.ones(shape=[2, 33, 33, 2]) * 2, |
|
common.GT_FRAME_OFFSET_KEY: |
|
tf.ones(shape=[2, 33, 33, 2]) * 2, |
|
common.SEMANTIC_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
common.CENTER_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
common.REGRESSION_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
common.FRAME_REGRESSION_LOSS_WEIGHT_KEY: |
|
tf.zeros(shape=[2, 33, 33]), |
|
} |
|
expected_result = tf.ones(shape=[2]) * 6 |
|
loss_result = loss_layer(gt_dict, pred_dict)[common.TOTAL_LOSS] |
|
|
|
np.testing.assert_equal(loss_result.numpy(), expected_result.numpy()) |
|
|
|
with self.subTest('Test all losses.'): |
|
gt_dict = { |
|
common.GT_SEMANTIC_KEY: |
|
tf.ones(shape=[2, 33, 33], dtype=tf.int32), |
|
common.GT_INSTANCE_CENTER_KEY: |
|
tf.ones(shape=[2, 33, 33]) * 2, |
|
common.GT_INSTANCE_REGRESSION_KEY: |
|
tf.ones(shape=[2, 33, 33, 2]) * 2, |
|
common.GT_FRAME_OFFSET_KEY: |
|
tf.ones(shape=[2, 33, 33, 2]) * 2, |
|
common.SEMANTIC_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
common.CENTER_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
common.REGRESSION_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
common.FRAME_REGRESSION_LOSS_WEIGHT_KEY: |
|
tf.ones(shape=[2, 33, 33]), |
|
} |
|
expected_result = tf.nn.softmax_cross_entropy_with_logits( |
|
tf.one_hot(gt_dict[common.GT_SEMANTIC_KEY], num_classes), |
|
pred_dict[common.PRED_SEMANTIC_LOGITS_KEY]) |
|
expected_result = tf.reduce_mean(expected_result, axis=[1, 2]) |
|
|
|
expected_result += tf.ones(shape=[2]) * 8 |
|
|
|
loss_result = loss_layer(gt_dict, pred_dict)[common.TOTAL_LOSS] |
|
|
|
np.testing.assert_equal(loss_result.numpy(), expected_result.numpy()) |
|
|
|
def test_panoptic_deeplab_semantic_loss_only(self): |
|
ignore_label = 255 |
|
num_classes = 19 |
|
semantic_loss_options = trainer_pb2.LossOptions.SingleLossOptions( |
|
name='softmax_cross_entropy') |
|
loss_options = trainer_pb2.LossOptions( |
|
semantic_loss=semantic_loss_options) |
|
|
|
loss_layer = loss.DeepLabFamilyLoss( |
|
loss_options, |
|
num_classes=num_classes, |
|
ignore_label=ignore_label, |
|
thing_class_ids=tuple(range(11, 19))) |
|
|
|
pred_dict = { |
|
common.PRED_SEMANTIC_LOGITS_KEY: |
|
tf.random.uniform(shape=[2, 33, 33, num_classes]), |
|
} |
|
gt_dict = { |
|
common.GT_SEMANTIC_KEY: tf.ones(shape=[2, 33, 33], dtype=tf.int32), |
|
common.SEMANTIC_LOSS_WEIGHT_KEY: tf.ones(shape=[2, 33, 33]), |
|
} |
|
|
|
expected_result = tf.nn.softmax_cross_entropy_with_logits( |
|
tf.one_hot(gt_dict[common.GT_SEMANTIC_KEY], num_classes), |
|
pred_dict[common.PRED_SEMANTIC_LOGITS_KEY]) |
|
expected_result = tf.reduce_mean(expected_result, axis=[1, 2]) |
|
|
|
loss_dict = loss_layer(gt_dict, pred_dict) |
|
self.assertIn(common.SEMANTIC_LOSS, loss_dict) |
|
self.assertNotIn(common.CENTER_LOSS, loss_dict) |
|
self.assertNotIn(common.REGRESSION_LOSS, loss_dict) |
|
self.assertNotIn(common.MOTION_LOSS, loss_dict) |
|
loss_result = loss_dict[common.SEMANTIC_LOSS] |
|
|
|
np.testing.assert_equal(loss_result.numpy(), expected_result.numpy()) |
|
|
|
def test_panoptic_deeplab_loss_error(self): |
|
semantic_loss_options = trainer_pb2.LossOptions.SingleLossOptions( |
|
name='softmax_cross_entropy') |
|
center_loss_options = trainer_pb2.LossOptions.SingleLossOptions( |
|
name='not_a_loss', weight=1.0) |
|
regression_loss_options = trainer_pb2.LossOptions.SingleLossOptions( |
|
name='l1', weight=1.0) |
|
motion_loss_options = trainer_pb2.LossOptions.SingleLossOptions( |
|
name='l1', weight=1.0) |
|
loss_options = trainer_pb2.LossOptions( |
|
semantic_loss=semantic_loss_options, |
|
center_loss=center_loss_options, |
|
regression_loss=regression_loss_options, |
|
motion_loss=motion_loss_options) |
|
|
|
with self.assertRaises(ValueError): |
|
_ = loss.DeepLabFamilyLoss(loss_options, |
|
num_classes=19, |
|
ignore_label=255, |
|
thing_class_ids=tuple(range(11, 19))) |
|
|
|
|
|
if __name__ == '__main__': |
|
tf.test.main() |
|
|