Spaces:
Runtime error
Runtime error
| # coding=utf-8 | |
| # Copyright 2021 The Deeplab2 Authors. | |
| # | |
| # 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. | |
| """This file contains utility function for handling the dataset.""" | |
| import tensorflow as tf | |
| def get_semantic_and_panoptic_label(dataset_info, label, ignore_label): | |
| """Helper function to get semantic and panoptic label from panoptic label. | |
| This functions gets the semantic and panoptic label from panoptic label for | |
| different datasets. The labels must be encoded with semantic_label * | |
| label_divisor + instance_id. For thing classes, the instance ID 0 is reserved | |
| for crowd regions. Please note, the returned panoptic label has replaced | |
| the crowd region with ignore regions. Yet, the semantic label makes use of | |
| these regions. | |
| Args: | |
| dataset_info: A dictionary storing dataset information. | |
| label: A Tensor of panoptic label. | |
| ignore_label: An integer specifying the ignore_label. | |
| Returns: | |
| semantic_label: A Tensor of semantic segmentation label. | |
| panoptic_label: A Tensor of panoptic segmentation label, which follows the | |
| Cityscapes annotation where | |
| panoptic_label = semantic_label * panoptic_label_divisor + instance_id. | |
| thing_mask: A boolean Tensor specifying the thing regions. Zero if no thing. | |
| crowd_region: A boolean Tensor specifying crowd region. Zero if no crowd | |
| annotation. | |
| Raises: | |
| ValueError: An error occurs when the ignore_label is not in range | |
| [0, label_divisor]. | |
| """ | |
| panoptic_label_divisor = dataset_info['panoptic_label_divisor'] | |
| if ignore_label >= panoptic_label_divisor or ignore_label < 0: | |
| raise ValueError('The ignore_label must be in [0, label_divisor].') | |
| semantic_label = label // panoptic_label_divisor | |
| # Find iscrowd region if any and set to ignore for panoptic labels. | |
| # 1. Find thing mask. | |
| thing_mask = tf.zeros_like(semantic_label, tf.bool) | |
| for thing_id in dataset_info['class_has_instances_list']: | |
| thing_mask = tf.logical_or( | |
| thing_mask, | |
| tf.equal(semantic_label, thing_id)) | |
| # 2. Find crowd region (thing label that have instance_id == 0). | |
| crowd_region = tf.logical_and( | |
| thing_mask, | |
| tf.equal(label % panoptic_label_divisor, 0)) | |
| # 3. Set crowd region to ignore label. | |
| panoptic_label = tf.where( | |
| crowd_region, | |
| tf.ones_like(label) * ignore_label * panoptic_label_divisor, | |
| label) | |
| return semantic_label, panoptic_label, thing_mask, crowd_region | |