Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_noncontiguous(self, device):
batch_size = 3
inp = torch.rand(3, 5, 5).expand(batch_size, -1, -1, -1).to(device)
actual = kornia.filters.spatial_gradient(inp)
expected = actual
assert_allclose(actual, actual)
def op_script(input):
return kornia.filters.spatial_gradient(input)
img = torch.rand(2, 3, 4, 5).to(device)
expected = torch.tensor([[[[
[0., 1., 0., -1., 0.],
[1., 3., 0., -3., -1.],
[2., 4., 0., -4., -2.],
[1., 3., 0., -3., -1.],
[0., 1., 0., -1., 0.],
], [
[0., 1., 2., 1., 0.],
[1., 3., 4., 3., 1.],
[0., 0., 0., 0., 0],
[-1., -3., -4., -3., -1],
[0., -1., -2., -1., 0.],
]]]]).to(device) / 8.0
edges = kornia.filters.spatial_gradient(inp, normalized=True)
assert_allclose(edges, expected)
def test_gradcheck(self, device):
batch_size, channels, height, width = 1, 2, 5, 4
img = torch.rand(batch_size, channels, height, width).to(device)
img = utils.tensor_to_gradcheck_var(img) # to var
assert gradcheck(kornia.filters.spatial_gradient, (img,),
raise_exception=True)
[0.0039, 0.0065, 0.0040, 0.0000, 0.0040, 0.0065, 0.0039],
[0.0012, 0.0039, 0.0020, 0.0000, 0.0020, 0.0039, 0.0012]]]])
"""
if not torch.is_tensor(input):
raise TypeError("Input type is not a torch.Tensor. Got {}"
.format(type(input)))
if not len(input.shape) == 4:
raise ValueError("Invalid input shape, we expect BxCxHxW. Got: {}"
.format(input.shape))
if sigmas is not None:
if not torch.is_tensor(sigmas):
raise TypeError("sigmas type is not a torch.Tensor. Got {}"
.format(type(sigmas)))
if (not len(sigmas.shape) == 1) or (sigmas.size(0) != input.size(0)):
raise ValueError("Invalid sigmas shape, we expect B == input.size(0). Got: {}".format(sigmas.shape))
gradients: torch.Tensor = spatial_gradient(input, grads_mode)
dx: torch.Tensor = gradients[:, :, 0]
dy: torch.Tensor = gradients[:, :, 1]
# compute the structure tensor M elements
def g(x):
return gaussian_blur2d(x, (7, 7), (1., 1.))
dx2: torch.Tensor = g(dx ** 2)
dy2: torch.Tensor = g(dy ** 2)
dxy: torch.Tensor = g(dx * dy)
det_m: torch.Tensor = dx2 * dy2 - dxy * dxy
trace_m: torch.Tensor = dx2 + dy2
# compute the response map
scores: torch.Tensor = det_m - k * (trace_m ** 2)
if sigmas is not None:
scores = scores * sigmas.pow(4).view(-1, 1, 1, 1)
[0.0155, 0.0334, 0.0194, 0.0000, 0.0194, 0.0334, 0.0155]]]])
"""
if not torch.is_tensor(input):
raise TypeError("Input type is not a torch.Tensor. Got {}"
.format(type(input)))
if not len(input.shape) == 4:
raise ValueError("Invalid input shape, we expect BxCxHxW. Got: {}"
.format(input.shape))
if sigmas is not None:
if not torch.is_tensor(sigmas):
raise TypeError("sigmas type is not a torch.Tensor. Got {}"
.format(type(sigmas)))
if (not len(sigmas.shape) == 1) or (sigmas.size(0) != input.size(0)):
raise ValueError("Invalid sigmas shape, we expect B == input.size(0). Got: {}"
.format(sigmas.shape))
gradients: torch.Tensor = spatial_gradient(input, grads_mode, 2)
dxx: torch.Tensor = gradients[:, :, 0]
dxy: torch.Tensor = gradients[:, :, 1]
dyy: torch.Tensor = gradients[:, :, 2]
scores: torch.Tensor = dxx * dyy - dxy ** 2
if sigmas is not None:
scores = scores * sigmas.pow(4).view(-1, 1, 1, 1)
return scores
if not len(depth.shape) == 4 and depth.shape[-3] == 1:
raise ValueError(f"Input depth musth have a shape (B, 1, H, W). Got: {depth.shape}")
if not isinstance(camera_matrix, torch.Tensor):
raise TypeError(f"Input camera_matrix type is not a torch.Tensor. "
f"Got {type(camera_matrix)}.")
if not len(camera_matrix.shape) == 3 and camera_matrix.shape[-2:] == (3, 3):
raise ValueError(f"Input camera_matrix must have a shape (B, 3, 3). "
f"Got: {camera_matrix.shape}.")
# compute the 3d points from depth
xyz: torch.Tensor = depth_to_3d(depth, camera_matrix) # Bx3xHxW
# compute the pointcloud spatial gradients
gradients: torch.Tensor = spatial_gradient(xyz) # Bx3x2xHxW
# compute normals
a, b = gradients[:, :, 0], gradients[:, :, 1] # Bx3xHxW
normals: torch.Tensor = torch.cross(a, b, dim=1) # Bx3xHxW
return F.normalize(normals, dim=1, p=2)
def forward(self, input):
if not torch.is_tensor(input):
raise TypeError("Input type is not a torch.Tensor. Got {}"
.format(type(input)))
if not len(input.shape) == 4:
raise ValueError("Invalid input shape, we expect Bx1xHxW. Got: {}"
.format(input.shape))
B, CH, W, H = input.size()
if (W != self.patch_size) or (H != self.patch_size) or (CH != 1):
raise TypeError(
"input shape should be must be [Bx1x{}x{}]. "
"Got {}".format(self.patch_size, self.patch_size, input.size()))
self.pk = self.pk.to(input.dtype).to(input.device)
grads: torch.Tensor = spatial_gradient(input, 'diff')
# unpack the edges
gx: torch.Tensor = grads[:, :, 0]
gy: torch.Tensor = grads[:, :, 1]
mag: torch.Tensor = torch.sqrt(gx * gx + gy * gy + self.eps)
ori: torch.Tensor = torch.atan2(gy, gx + self.eps) + 2.0 * pi
mag = mag * self.gk.expand_as(mag).type_as(mag).to(mag.device)
o_big: torch.Tensor = float(self.num_ang_bins) * ori / (2.0 * pi)
bo0_big_: torch.Tensor = torch.floor(o_big)
wo1_big_: torch.Tensor = (o_big - bo0_big_)
bo0_big: torch.Tensor = bo0_big_ % self.num_ang_bins
bo1_big: torch.Tensor = (bo0_big + 1) % self.num_ang_bins
wo0_big: torch.Tensor = (1.0 - wo1_big_) * mag # type: ignore
wo1_big: torch.Tensor = wo1_big_ * mag
>>> output = gftt_response(input)
tensor([[[[0.0155, 0.0334, 0.0194, 0.0000, 0.0194, 0.0334, 0.0155],
[0.0334, 0.0575, 0.0339, 0.0000, 0.0339, 0.0575, 0.0334],
[0.0194, 0.0339, 0.0497, 0.0000, 0.0497, 0.0339, 0.0194],
[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000],
[0.0194, 0.0339, 0.0497, 0.0000, 0.0497, 0.0339, 0.0194],
[0.0334, 0.0575, 0.0339, 0.0000, 0.0339, 0.0575, 0.0334],
[0.0155, 0.0334, 0.0194, 0.0000, 0.0194, 0.0334, 0.0155]]]])
"""
if not torch.is_tensor(input):
raise TypeError("Input type is not a torch.Tensor. Got {}"
.format(type(input)))
if not len(input.shape) == 4:
raise ValueError("Invalid input shape, we expect BxCxHxW. Got: {}"
.format(input.shape))
gradients: torch.Tensor = spatial_gradient(input, grads_mode)
dx: torch.Tensor = gradients[:, :, 0]
dy: torch.Tensor = gradients[:, :, 1]
# compute the structure tensor M elements
def g(x):
return gaussian_blur2d(x, (7, 7), (1., 1.))
dx2: torch.Tensor = g(dx ** 2)
dy2: torch.Tensor = g(dy ** 2)
dxy: torch.Tensor = g(dx * dy)
det_m: torch.Tensor = dx2 * dy2 - dxy * dxy
trace_m: torch.Tensor = dx2 + dy2
e1: torch.Tensor = 0.5 * (trace_m + torch.sqrt((trace_m ** 2 - 4 * det_m).abs()))
e2: torch.Tensor = 0.5 * (trace_m - torch.sqrt((trace_m ** 2 - 4 * det_m).abs()))