Exchange rows transform

Hi everyone,

We are working on a segmentation model to localize a position in images similar to this below (and corresponding mask):

s-0.075_pos-14758141_one-strong_seed-1_ancestry

s-0.075_pos-14758141_one-strong_seed-1_ancestry_P

We would like to apply a custom transform to randomly exchange rows (not columns!) in the image. We are having trouble finding a transform function that can do this in v2. In v1 there was Jitter which could randomly exchange pixels across all axes. Is there a version of this transform in v2 that has an option to exchange entire rows? If not, does anyone have ideas for a custom transform we could write to accomplish random row exchange?

Thank you!

1 Like

Watching to see any answers here! I’ve had a hard time figuring out how to do anything with jitter in v2.

1 Like

try this: https://gist.github.com/tcapelle/25adfa75eb99a5e249f7d78f5131b967

def permute_rows(img, k=5):
    "permute k rows on Tensor"
    n = img.shape[-2]
    rows_idxs = L(random.choices(range_of(n), k=k))
    idxs = rows_idxs.sorted()
    img[..., idxs, :] = img[..., rows_idxs, :]  #batch compatible
    return img

and then as a Transform:

class RandPermute(InplaceTransform):
    "Permute rows on image, all batch identically"
    split_idx,order=0,98 #only apply on train set, before Normalize
    def __init__(self, k=5):
        self.k = k
    
    def encodes(self, img: TensorImage):
        return permute_rows(img, k=self.k)
2 Likes
  • you will need to apply this transform after ToTensor, so at least it will need an order greater than ToTensor.order.
  • you will also want to apply this to only train set, so split_idxs=0 (None applies to both)
  • InplaceTransform can be used as this tfm modifies the original image (exchanging rows).
1 Like

Thank you, @tcapelle ! This is exactly what I was looking for!!