# Copyright 2025 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.

"""RetinaNet task definition."""
import tensorflow as tf, tf_keras

from official.core import task_factory
from official.projects.qat.vision.configs import retinanet as exp_cfg
from official.projects.qat.vision.modeling import factory
from official.vision.tasks import retinanet


@task_factory.register_task_cls(exp_cfg.RetinaNetTask)
class RetinaNetTask(retinanet.RetinaNetTask):
  """A task for RetinaNet object detection with QAT."""

  def build_model(self) -> tf_keras.Model:
    """Builds RetinaNet model with QAT."""
    model = super(RetinaNetTask, self).build_model()
    # Call the model with dummy input to build the head part.
    dummpy_input = tf.zeros([1] + self.task_config.model.input_size)
    model(dummpy_input, training=True)

    # Only build a QAT model when quantization version is v2; otherwise leave it
    # for outer quantization scope.
    if (
        self.task_config.quantization
        and self.task_config.quantization.version == 'v2'
    ):
      model = factory.build_qat_retinanet(
          model,
          self.task_config.quantization,
          model_config=self.task_config.model,
      )
    return model
