图像增强重现性

问题描述

当我将以下数据管道用于图像分割任务时,如何重现相同的图像增强结果?我想比较不同的模型,因此数据扩充必须是确定性的。

class data_loader(object):
    def __init__(self,image_paths: List[str],mask_paths: List[str],image_size: int=IMAGE_SIZE,augment: bool=True):

        self.image_paths = image_paths
        self.mask_paths = mask_paths
        self.image_size = image_size
        self.augment = augment

    def randomHueSaturationValue(self,image,hue_shift_limit=(-180,180),sat_shift_limit=(-255,255),val_shift_limit=(-255,u=0.5):
        if np.random.random() < u:
            image = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
            h,s,v = cv2.split(image)
            hue_shift = np.random.randint(hue_shift_limit[0],hue_shift_limit[1] + 1)
            hue_shift = np.uint8(hue_shift)
            h += hue_shift
            sat_shift = np.random.uniform(sat_shift_limit[0],sat_shift_limit[1])
            s = cv2.add(s,sat_shift)
            val_shift = np.random.uniform(val_shift_limit[0],val_shift_limit[1])
            v = cv2.add(v,val_shift)
            image = cv2.merge((h,v))
            image = cv2.cvtColor(image,cv2.COLOR_HSV2BGR)
        return image

    def randomShiftScaleRotate(self,mask,shift_limit=(-0.0,0.0),scale_limit=(-0.0,rotate_limit=(-0.0,aspect_limit=(-0.0,borderMode=cv2.BORDER_CONSTANT,u=0.5):
        if np.random.random() < u:
            height,width,channel = image.shape

            angle = np.random.uniform(rotate_limit[0],rotate_limit[1])
            scale = np.random.uniform(1 + scale_limit[0],1 + scale_limit[1])
            aspect = np.random.uniform(1 + aspect_limit[0],1 + aspect_limit[1])
            sx = scale * aspect / (aspect ** 0.5)
            sy = scale / (aspect ** 0.5)
            dx = round(np.random.uniform(shift_limit[0],shift_limit[1]) * width)
            dy = round(np.random.uniform(shift_limit[0],shift_limit[1]) * height)

            cc = np.math.cos(angle / 180 * np.math.pi) * sx
            ss = np.math.sin(angle / 180 * np.math.pi) * sy
            rotate_matrix = np.array([[cc,-ss],[ss,cc]])

            Box0 = np.array([[0,0],[width,height],[0,])
            Box1 = Box0 - np.array([width / 2,height / 2])
            Box1 = np.dot(Box1,rotate_matrix.T) + np.array([width / 2 + dx,height / 2 + dy])

            Box0 = Box0.astype(np.float32)
            Box1 = Box1.astype(np.float32)
            mat = cv2.getPerspectiveTransform(Box0,Box1)
            image = cv2.warpPerspective(image,mat,(width,height),flags=cv2.INTER_LINEAR,borderMode=borderMode,borderValue=(
                                            0,))
            mask = cv2.warpPerspective(mask,borderValue=(
                                           0,))

        return image,mask

    def randomHorizontalFlip(self,u=0.5):
        if np.random.random() < u:
            image = cv2.flip(image,1)
            mask = cv2.flip(mask,1)
        return image,mask

    def randomVerticleFlip(self,0)
            mask = cv2.flip(mask,0)
        return image,mask

    def randomrotate90(self,u=0.5):
        if np.random.random() < u:
            image = np.rot90(image)
            mask = np.rot90(mask)
        return image,mask

    def read(self,image_path,mask_path):
        image_path = image_path.decode()
        image = cv2.imread(image_path,cv2.IMREAD_COLOR)

        mask_path = mask_path.decode()
        mask = cv2.imread(mask_path,cv2.IMREAD_GRAYSCALE)
        return image,mask

    def resize(self,mask):
        image = cv2.resize(image,(self.image_size,self.image_size))
        mask = cv2.resize(mask,self.image_size))
        return image,mask

    def normalize(self,mask):
        image = image / 255.
        image = image * 3.2 - 1.6
        mask = mask / 255.
        mask[mask >= 0.5] = 1
        mask[mask <= 0.5] = 0
        mask = np.expand_dims(mask,axis=-1)
        return image,mask

    def map_fn(self,mask_path):

        def process(image_path,mask_path):
            image,mask = self.read(image_path,mask_path)
            image,mask = self.resize(image,mask)
            if self.augment:
                image = self.randomHueSaturationValue(image,hue_shift_limit=(-30,30),sat_shift_limit=(-5,5),val_shift_limit=(-15,15))

                image,mask = self.randomShiftScaleRotate(image,shift_limit=(-0.1,0.1),scale_limit=(-0.1,aspect_limit=(-0.1,rotate_limit=(-0,0))
                image,mask = self.randomHorizontalFlip(image,mask)
                image,mask = self.randomVerticleFlip(image,mask = self.randomrotate90(image,mask)

            image,mask = self.normalize(image,mask)
            return image,mask
        
        image,mask = tf.numpy_function(process,[image_path,mask_path],[tf.float64,tf.float64])

        image.set_shape([self.image_size,self.image_size,3])
        mask.set_shape([self.image_size,1])
        return image,mask

    def tf_data(self,batch_size):
        dataset = tf.data.Dataset.from_tensor_slices((self.image_paths,self.mask_paths))
        dataset = dataset.shuffle(len(self.image_paths),seed=101)
        dataset = dataset.map(self.map_fn,num_parallel_calls=AUTOTUNE)
        dataset = dataset.batch(batch_size)
        dataset = dataset.prefetch(buffer_size=AUTOTUNE)
        return dataset

培训和验证数据集:

train_data = data_loader(image_paths=train_images,mask_paths=train_masks,image_size=IMAGE_SIZE,augment=True).tf_data(batch_size=BATCH_SIZE)
val_data = data_loader(image_paths=val_images,mask_paths=val_masks,augment=False).tf_data(batch_size=BATCH_SIZE)

在制作数据集之前,我已经设置了random.seednp.random.seedtf.random.set_seed,但是它不起作用。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)