|
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] |