Highlight_Detection_with_MomentDETR / lbhd /batch_image_transforms.py
AnsenH's picture
feat: add our model
24615d9
Raw
History Blame Contribute Delete
6.5 kB
import torch
import torch.nn as nn
from torchvision import transforms
from torchvision.transforms import functional as TF
class BatchRandomGrayscale(nn.Module):
def __init__(self, p=0.1):
super(BatchRandomGrayscale, self).__init__()
self.p = p
def forward(self, images):
'''
It is assumed that all images have the same number of channels
'''
if torch.rand(1) < self.p:
n_channels = TF.get_image_num_channels(images[0])
return [TF.rgb_to_grayscale(image, num_output_channels=n_channels) for image in images]
return images
class BatchColorJitter(nn.Module):
def __init__(self, brightness=0, contrast=0, saturation=0, hue=0):
super(BatchColorJitter, self).__init__()
self.t = transforms.ColorJitter(brightness, contrast, saturation, hue)
self.functions = [TF.adjust_brightness, TF.adjust_contrast, TF.adjust_saturation, TF.adjust_hue]
def get_params(self):
'''
returns:
`indices`: the order in which brightness, contrast, saturation and hue will be adjusted
`brightness_factor`, `contrast_factor`, `saturation_factor` and `hue_factor`: float values or None
'''
return self.t.get_params(self.t.brightness, self.t.contrast, self.t.saturation, self.t.hue)
def per_image_transform(self, image, indices, factors):
for index in indices:
if factors[index] is None:
continue
fn = self.functions[index]
image = fn(image, factors[index])
return image
def forward(self, images):
indices, *factors = self.get_params()
return [self.per_image_transform(image, indices, factors) for image in images]
class BatchRandomHorizontalFlip(nn.Module):
def __init__(self, p=0.5):
super(BatchRandomHorizontalFlip, self).__init__()
self.p = p
def forward(self, images):
if torch.rand(1) < self.p:
return [TF.hflip(image) for image in images]
return images
class BatchRandomVerticalFlip(nn.Module):
def __init__(self, p=0.5):
super(BatchRandomVerticalFlip, self).__init__()
self.p = p
def forward(self, images):
if torch.rand(1) < self.p:
return [TF.vflip(image) for image in images]
return images
class BatchRandomAdjustSharpness(nn.Module):
def __init__(self, sharpness_factor, p=0.5):
super(BatchRandomAdjustSharpness, self).__init__()
self.sharpness_factor = sharpness_factor
self.p = p
def forward(self, images):
if torch.rand(1) < self.p:
return [TF.adjust_sharpness(image, self.sharpness_factor) for image in images]
return images
class BatchRandomPosterize(nn.Module):
def __init__(self, bits, p=0.5):
super(BatchRandomPosterize, self).__init__()
self.bits = bits
self.p = p
def forward(self, images):
if torch.rand(1) < self.p:
return [TF.posterize(image, self.bits) for image in images]
return images
class BatchRandomEqualize(nn.Module):
def __init__(self, p=0.5):
super(BatchRandomEqualize, self).__init__()
self.p = p
def forward(self, images):
if torch.rand(1) < self.p:
return [TF.equalize(image) for image in images]
return images
class BatchRandomInvert(nn.Module):
def __init__(self, p=0.5):
super(BatchRandomInvert, self).__init__()
self.p = p
def forward(self, images):
if torch.rand(1) < self.p:
return [TF.invert(image) for image in images]
return images
class BatchRandomSolarize(nn.Module):
def __init__(self, threshold, p=0.5):
super(BatchRandomSolarize, self).__init__()
self.threshold = threshold
self.p = p
def forward(self, images):
if torch.rand(1) < self.p:
return [TF.solarize(image, self.threshold) for image in images]
return images
class BatchResize(nn.Module):
def __init__(self, size, interpolation=transforms.InterpolationMode.BILINEAR, max_size=None, antialias=None):
super(BatchResize, self).__init__()
self.size = size
self.interpolation = interpolation
self.max_size = max_size
self.antialias = antialias
def forward(self, images):
return [TF.resize(image, self.size, self.interpolation, self.max_size, self.antialias) for image in images]
class BatchRandomApply(nn.Module):
def __init__(self, batch_transforms, p=0.5):
super(BatchRandomApply, self).__init__()
self.batch_transforms = batch_transforms
self.p = p
def forward(self, images):
if torch.rand(1) < self.p:
for bt in self.batch_transforms:
images = bt(images)
return images
return images
class BatchCenterCrop(nn.Module):
def __init__(self, size):
super(BatchCenterCrop, self).__init__()
self.size = size
def forward(self, images):
return [TF.center_crop(image, self.size) for image in images]
class BatchPad(nn.Module):
def __init__(self, padding, fill=0, padding_mode='constant'):
super(BatchPad, self).__init__()
self.padding, self.fill, self.padding_mode = padding, fill, padding_mode
def forward(self, images):
return [TF.pad(image, self.padding, self.fill, self.padding_mode) for image in images]
class BatchToTensor(nn.Module):
def __init__(self):
super(BatchToTensor, self).__init__()
def forward(self, images):
return [TF.to_tensor(image) for image in images]
class BatchCompose(nn.Module):
def __init__(self, batch_transforms):
super(BatchCompose, self).__init__()
self.batch_transforms = batch_transforms
def forward(self, images):
for bt in self.batch_transforms:
images = bt(images)
return images
batch_transforms = nn.ModuleList([
BatchColorJitter(0.3,0.3,0.3),
BatchRandomHorizontalFlip(),
BatchRandomGrayscale(),
BatchRandomAdjustSharpness(3),
BatchRandomPosterize(bits=5, p=0.1),
BatchRandomApply(nn.ModuleList([BatchPad([0,30])]), p=0.2),
BatchResize([224,224]),
BatchToTensor()
])
batch_transform_train = BatchCompose(batch_transforms)
batch_transform_val = nn.ModuleList([
BatchResize([224,224]),
BatchToTensor()
])
batch_transform_val = BatchCompose(batch_transform_val)