# Copyright 2023 The TensorFlow Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for maskrcnn_losses.""" from absl.testing import parameterized import tensorflow as tf, tf_keras from official.vision.losses import maskrcnn_losses class MaskrcnnLossesTest(parameterized.TestCase, tf.test.TestCase): def testRpnScoreLoss(self): batch_size = 2 height = 32 width = 32 num_anchors = 10 score_outputs = { '1': tf.random.uniform([batch_size, height, width, num_anchors]) } score_targets = { '1': tf.random.uniform([batch_size, height, width, num_anchors], minval=-1, maxval=2, dtype=tf.int32) } loss_fn = maskrcnn_losses.RpnScoreLoss(rpn_batch_size_per_im=8) self.assertEqual(tf.rank(loss_fn(score_outputs, score_targets)), 0) def testRpnBoxLoss(self): batch_size = 2 height = 32 width = 32 num_anchors = 10 box_outputs = { '1': tf.random.uniform([batch_size, height, width, num_anchors * 4]) } box_targets = { '1': tf.random.uniform([batch_size, height, width, num_anchors * 4]) } loss_fn = maskrcnn_losses.RpnBoxLoss(huber_loss_delta=1. / 9.) self.assertEqual(tf.rank(loss_fn(box_outputs, box_targets)), 0) def testRpnBoxLossValidBox(self): box_outputs = {'1': tf.constant([[[[0.2, 0.2, 1.4, 1.4]]]])} box_targets = {'1': tf.constant([[[[0., 0., 1., 1.]]]])} loss_fn = maskrcnn_losses.RpnBoxLoss(huber_loss_delta=1. / 9.) self.assertAllClose(loss_fn(box_outputs, box_targets), 0.027093, atol=1e-4) def testRpnBoxLossInvalidBox(self): box_outputs = {'1': tf.constant([[[[0.2, 0.2, 1.4, 1.4]]]])} box_targets = {'1': tf.constant([[[[0., 0., 0., 0.]]]])} loss_fn = maskrcnn_losses.RpnBoxLoss(huber_loss_delta=1. / 9.) self.assertAllClose(loss_fn(box_outputs, box_targets), 0., atol=1e-4) @parameterized.parameters(True, False) def testFastrcnnClassLoss(self, use_binary_cross_entropy): batch_size = 2 num_boxes = 10 num_classes = 5 class_outputs = tf.random.uniform([batch_size, num_boxes, num_classes]) class_targets = tf.random.uniform([batch_size, num_boxes], minval=0, maxval=num_classes + 1, dtype=tf.int32) loss_fn = maskrcnn_losses.FastrcnnClassLoss(use_binary_cross_entropy) class_weights = [1.0] * num_classes self.assertEqual( tf.rank(loss_fn(class_outputs, class_targets, class_weights)), 0 ) def testFastrcnnClassLossTopK(self): class_targets = tf.constant([[0, 0, 0, 2]]) class_outputs = tf.constant([[ [100.0, 0.0, 0.0], [100.0, 0.0, 0.0], [100.0, 0.0, 0.0], [0.0, 1.0, 0.0], ]]) class_weights = [1.0, 1.0, 1.0] self.assertAllClose( maskrcnn_losses.FastrcnnClassLoss(top_k_percent=0.5)( class_outputs, class_targets, class_weights ), 0.775718, atol=1e-4, ) self.assertAllClose( maskrcnn_losses.FastrcnnClassLoss(top_k_percent=1.0)( class_outputs, class_targets, class_weights ), 0.387861, atol=1e-4, ) def testFastrcnnBoxLoss(self): batch_size = 2 num_boxes = 10 num_classes = 5 box_outputs = tf.random.uniform([batch_size, num_boxes, num_classes * 4]) box_targets = tf.random.uniform([batch_size, num_boxes, 4]) class_targets = tf.random.uniform([batch_size, num_boxes], minval=0, maxval=num_classes + 1, dtype=tf.int32) loss_fn = maskrcnn_losses.FastrcnnBoxLoss(huber_loss_delta=1.) self.assertEqual( tf.rank(loss_fn(box_outputs, class_targets, box_targets)), 0) def testMaskrcnnLoss(self): batch_size = 2 num_masks = 10 mask_height = 16 mask_width = 16 num_classes = 5 mask_outputs = tf.random.uniform( [batch_size, num_masks, mask_height, mask_width]) mask_targets = tf.cast( tf.random.uniform([batch_size, num_masks, mask_height, mask_width], minval=0, maxval=2, dtype=tf.int32), tf.float32) select_class_targets = tf.random.uniform([batch_size, num_masks], minval=0, maxval=num_classes + 1, dtype=tf.int32) loss_fn = maskrcnn_losses.MaskrcnnLoss() self.assertEqual( tf.rank(loss_fn(mask_outputs, mask_targets, select_class_targets)), 0) if __name__ == '__main__': tf.test.main()