| 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 = 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)]]) |
| |
| 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): |
| |
| 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): |
| |
| return i |
| return data.shape[1] |