Spaces:
Running on Zero
Running on Zero
| import torch | |
| from torch import nn | |
| import numpy as np | |
| import scipy | |
| from src.flair.utils.motionblur import Kernel as MotionKernel | |
| class Blurkernel(nn.Module): | |
| def __init__(self, blur_type='gaussian', kernel_size=31, std=3.0, device=None): | |
| super().__init__() | |
| self.blur_type = blur_type | |
| self.kernel_size = kernel_size | |
| self.std = std | |
| self.device = device | |
| self.seq = nn.Sequential( | |
| nn.ReflectionPad2d(self.kernel_size//2), | |
| nn.Conv2d(3, 3, self.kernel_size, stride=1, padding=0, bias=False, groups=3) | |
| ) | |
| self.weights_init() | |
| def forward(self, x): | |
| return self.seq(x) | |
| def weights_init(self): | |
| if self.blur_type == "gaussian": | |
| n = np.zeros((self.kernel_size, self.kernel_size)) | |
| n[self.kernel_size // 2,self.kernel_size // 2] = 1 | |
| k = scipy.ndimage.gaussian_filter(n, sigma=self.std) | |
| k = torch.from_numpy(k) | |
| self.k = k | |
| for name, f in self.named_parameters(): | |
| f.data.copy_(k) | |
| elif self.blur_type == "motion": | |
| k = MotionKernel(size=(self.kernel_size, self.kernel_size), intensity=self.std).kernelMatrix | |
| k = torch.from_numpy(k) | |
| self.k = k | |
| for name, f in self.named_parameters(): | |
| f.data.copy_(k) | |
| def update_weights(self, k): | |
| if not torch.is_tensor(k): | |
| k = torch.from_numpy(k).to(self.device) | |
| for name, f in self.named_parameters(): | |
| f.data.copy_(k) | |
| def get_kernel(self): | |
| return self.k | |