AAGCN / augumentation.py
fossbk's picture
Upload 8 files
a6976f4 verified
import math
import numpy as np
from numpy import random
from einops import einsum
import torch
class Rotate(object):
def __init__(self, range_angle, num_frames, num_nodes, point):
self.range_angle = range_angle
self.num_frames = num_frames
self.num_nodes = num_nodes
self.point = point
def __call__(self, data, label):
# data, label = sample
data = data.double()
angle = math.radians(random.uniform((-1)*self.range_angle, self.range_angle))
rotation_matrix = torch.Tensor([[math.cos(angle), (-1)*math.sin(angle)],
[math.sin(angle), math.cos(angle)]])
# print(type(rotation_matrix))
ox, oy = self.point
data[0, :, :] -= ox
data[1, :, :] -= oy
result = einsum(rotation_matrix.double(), data, "a b, b c d e -> a c d e") + 0.5
return result, label
class Left(object):
def __init__(self, width):
self.width = width
def __call__(self, data, label):
idx = find_frames(data)
p = random.random()
if p > 0.5:
data[0, :idx, :] -= self.width
return data, label
class Right(object):
def __init__(self, width):
self.width = width
def __call__(self, data, label):
idx = find_frames(data)
p = random.random()
if p > 0.5:
data[0, :idx, :] += self.width
return data, label
class GaussianNoise(object):
def __init__(self, mean, var):
self.mean = mean
self.var = var
def __call__(self, data, label):
# C, T, V, 1
print(data.size())
noise = torch.randn(size = data.size())
data = data + noise
return data, label
class Compose(object):
def __init__(self, transforms):
self.transforms = transforms
def __call__(self, data, label):
for t in self.transforms:
data, label = t(data, label)
return data, label
def find_frames(data):
for i in range(data.shape[1]):
if(data[:, i, :][0][0] == 0):
# print(i)
return i
return data.shape[1]