Source code for image_segmentation.datasets.segmentation.sintetic_dataset.sintetic_dataset

"""
================
Sintetic Dataset
================
"""
import random

import numpy as np
import skimage
import tensorflow as tf

from .texture_generation import NoiseUtils


[docs]class SinteticDataset: def __init__(self, seed=42, samples=10, img_shape=128, blob_size_fraction=0.3, target_texture='cloud'): self.seed = seed self.samples = samples self.img_shape = img_shape self.blob_size_fraction = blob_size_fraction self.target_texture = target_texture self.textures = ['marble','wood','cloud'] self.textures.remove(target_texture) def __generate_structure(self, texture): structure = NoiseUtils(self.img_shape) texture = getattr(structure,texture) structure.makeTexture(texture = texture) structure = structure.img return structure
[docs] def generate_sample(self, seed): img = self.__generate_structure(self.target_texture) mask = org_mask = skimage.data.binary_blobs(length=self.img_shape, blob_size_fraction=self.blob_size_fraction, seed=seed) img = img*mask np.random.shuffle(self.textures) for i,texture in enumerate(self.textures): img1 = self.__generate_structure(texture) img = img + img1*(~mask) mask = skimage.data.binary_blobs(length=self.img_shape, blob_size_fraction=self.blob_size_fraction, seed=seed+i+1) + org_mask if random.uniform(0, 1) > 0.5: break return img[...,None], org_mask[...,None]
[docs] def gen_dataset(self): def generator(): np.random.seed(self.seed) seeds = np.random.randint(self.samples,size=self.samples) for seed in seeds: img, mask = self.generate_sample(seed) yield img, mask return generator
def __call__(self,): output_signature = (tf.TensorSpec((None,None,None), tf.float32), tf.TensorSpec((None,None,None), tf.float32)) return tf.data.Dataset.from_generator(self.gen_dataset(), output_signature = output_signature )