Source code for image_segmentation.datasets.segmentation.oxford_iiit_pet

"""
I only made this code to keep the interface (NervetUPT, ultrasound_nerve_brachial_plexus)
 (__call__, load_instance_by_id, and order of tuple), 
I still recommend using tfds to create the datasets
"""
import tensorflow as tf
import tensorflow_datasets as tfds
from functools import lru_cache

[docs]class OxfordIiitPet: def __init__(self, split=[70, 15, 15], seed: int=42, one_hot: bool=True): self.one_hot = one_hot self.split= OxfordIiitPet._get_splits(split) dataset, info = tfds.load('oxford_iiit_pet:3.*.*', with_info=True, split=self.split) self.info = info self.train, self.val, self.test = dataset self.classes = 3 self.train = self.train.map(lambda x: self._keep_interface(x)) self.val= self.val.map(lambda x: self._keep_interface(x)) self.test = self.test.map(lambda x: self._keep_interface(x)) self.labels_info = {0:'cat', 1:'dog'}
[docs] @lru_cache(maxsize=None) def load_instance_by_id(self, id_img): for dataset in [self.train, self.val, self.test]: dataset = dataset.filter(lambda img, mask, label, id_image : id_image ==id_img) for x in dataset: return x
@staticmethod def _get_splits(splits): sum = 0 splits_ = [] for percentage in splits: sum += percentage splits_.append(f'train[{sum-percentage}%:{sum}%]') return splits_
[docs] def to_one_hot(self, mask): one_hot = tf.one_hot(mask, self.classes) return tf.gather(one_hot,0,axis=2)
def _keep_interface(self, x): img = tf.cast(x['image'], tf.float32)/255. mask = x['segmentation_mask'] - 1 mask = self.to_one_hot(mask) if self.one_hot else mask label = x['species'] id_image = x['file_name'] return img, mask, label, id_image def __call__(self,): return self.train, self.val, self.test