batchgeneratorsv2 0.2__tar.gz → 0.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/PKG-INFO +1 -1
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/spatial/spatial.py +136 -103
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2.egg-info/PKG-INFO +1 -1
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/pyproject.toml +1 -1
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/LICENSE +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/__init__.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/benchmarks/__init__.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/benchmarks/bg_comparison/__init__.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/benchmarks/bg_comparison/nnUNet_pipeline_bg.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/benchmarks/bg_comparison/nnUNet_pipeline_here.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/benchmarks/unique_values.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/dataloading/__init__.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/helpers/__init__.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/helpers/scalar_type.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/__init__.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/base/__init__.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/base/basic_transform.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/intensity/__init__.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/intensity/brightness.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/intensity/contrast.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/intensity/gamma.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/intensity/gaussian_noise.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/nnunet/__init__.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/nnunet/random_binary_operator.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/nnunet/remove_connected_components.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/nnunet/seg_to_onehot.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/noise/__init__.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/noise/gaussian_blur.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/spatial/__init__.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/spatial/low_resolution.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/spatial/mirroring.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/__init__.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/compose.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/cropping.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/deep_supervision_downsampling.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/nnunet_masking.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/pseudo2d.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/random.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/remove_label.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/seg_to_regions.py +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2.egg-info/SOURCES.txt +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2.egg-info/dependency_links.txt +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2.egg-info/requires.txt +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2.egg-info/top_level.txt +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/readme.md +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/setup.cfg +0 -0
- {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/setup.py +0 -0
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/spatial/spatial.py
RENAMED
|
@@ -33,6 +33,9 @@ class SpatialTransform(BasicTransform):
|
|
|
33
33
|
bg_style_seg_sampling: bool = True,
|
|
34
34
|
mode_seg: str = 'bilinear'
|
|
35
35
|
):
|
|
36
|
+
"""
|
|
37
|
+
magnitude must be given in pixels!
|
|
38
|
+
"""
|
|
36
39
|
super().__init__()
|
|
37
40
|
self.patch_size = patch_size
|
|
38
41
|
if not isinstance(patch_center_dist_from_border, (tuple, list)):
|
|
@@ -52,7 +55,6 @@ class SpatialTransform(BasicTransform):
|
|
|
52
55
|
self.mode_seg = mode_seg
|
|
53
56
|
|
|
54
57
|
def get_parameters(self, **data_dict) -> dict:
|
|
55
|
-
# note that we revert the axis order here because grid_sample uses dimensions in reverse order!
|
|
56
58
|
dim = data_dict['image'].ndim - 1
|
|
57
59
|
|
|
58
60
|
do_rotation = np.random.uniform() < self.p_rotation
|
|
@@ -60,14 +62,14 @@ class SpatialTransform(BasicTransform):
|
|
|
60
62
|
do_deform = np.random.uniform() < self.p_elastic_deform
|
|
61
63
|
|
|
62
64
|
if do_rotation:
|
|
63
|
-
angles = [sample_scalar(self.rotation, image=data_dict['image'], dim=i) for i in range(
|
|
65
|
+
angles = [sample_scalar(self.rotation, image=data_dict['image'], dim=i) for i in range(0, 3)]
|
|
64
66
|
else:
|
|
65
67
|
angles = [0] * dim
|
|
66
68
|
if do_scale:
|
|
67
69
|
if np.random.uniform() <= self.p_synchronize_scaling_across_axes:
|
|
68
70
|
scales = [sample_scalar(self.scaling, image=data_dict['image'], dim=None)] * dim
|
|
69
71
|
else:
|
|
70
|
-
scales = [sample_scalar(self.scaling, image=data_dict['image'], dim=i) for i in range(
|
|
72
|
+
scales = [sample_scalar(self.scaling, image=data_dict['image'], dim=i) for i in range(0, 3)]
|
|
71
73
|
else:
|
|
72
74
|
scales = [1] * dim
|
|
73
75
|
|
|
@@ -85,7 +87,6 @@ class SpatialTransform(BasicTransform):
|
|
|
85
87
|
# elastic deformation. We need to create the displacement field here
|
|
86
88
|
# we use the method from augment_spatial_2 in batchgenerators
|
|
87
89
|
if do_deform:
|
|
88
|
-
grid_scale = [i / j for i, j in zip(data_dict['image'].shape[1:], self.patch_size)][::-1]
|
|
89
90
|
if np.random.uniform() <= self.p_synchronize_def_scale_across_axes:
|
|
90
91
|
deformation_scales = [
|
|
91
92
|
sample_scalar(self.elastic_deform_scale, image=data_dict['image'], dim=None, patch_size=self.patch_size)
|
|
@@ -93,16 +94,16 @@ class SpatialTransform(BasicTransform):
|
|
|
93
94
|
else:
|
|
94
95
|
deformation_scales = [
|
|
95
96
|
sample_scalar(self.elastic_deform_scale, image=data_dict['image'], dim=i, patch_size=self.patch_size)
|
|
96
|
-
for i in range(
|
|
97
|
+
for i in range(0, 3)
|
|
97
98
|
]
|
|
98
99
|
|
|
99
100
|
# sigmas must be in pixels, as this will be applied to the deformation field
|
|
100
|
-
sigmas = [i * j for i, j in zip(deformation_scales, self.patch_size)]
|
|
101
|
-
|
|
102
|
-
# we need to correct magnitude by grid_scale to account for the fact that the grid will be wrt to the image size but the magnitude should be wrt the patch size. oof.
|
|
101
|
+
sigmas = [i * j for i, j in zip(deformation_scales, self.patch_size)]
|
|
102
|
+
|
|
103
103
|
magnitude = [
|
|
104
104
|
sample_scalar(self.elastic_deform_magnitude, image=data_dict['image'], patch_size=self.patch_size,
|
|
105
|
-
dim=i, deformation_scale=deformation_scales[i])
|
|
105
|
+
dim=i, deformation_scale=deformation_scales[i])
|
|
106
|
+
for i in range(0, 3)]
|
|
106
107
|
# doing it like this for better memory layout for blurring
|
|
107
108
|
offsets = torch.normal(mean=0, std=1, size=(dim, *self.patch_size))
|
|
108
109
|
|
|
@@ -122,13 +123,13 @@ class SpatialTransform(BasicTransform):
|
|
|
122
123
|
offsets = torch.permute(offsets, (1, 2, 3, 0))
|
|
123
124
|
else:
|
|
124
125
|
offsets = None
|
|
125
|
-
|
|
126
|
+
|
|
126
127
|
shape = data_dict['image'].shape[1:]
|
|
127
128
|
if not self.random_crop:
|
|
128
|
-
center_location_in_pixels = [i / 2 for i in shape]
|
|
129
|
+
center_location_in_pixels = [i / 2 for i in shape]
|
|
129
130
|
else:
|
|
130
131
|
center_location_in_pixels = []
|
|
131
|
-
for d in range(
|
|
132
|
+
for d in range(0, 3):
|
|
132
133
|
mn = self.patch_center_dist_from_border[d]
|
|
133
134
|
mx = shape[d] - self.patch_center_dist_from_border[d]
|
|
134
135
|
if mx < mn:
|
|
@@ -146,15 +147,11 @@ class SpatialTransform(BasicTransform):
|
|
|
146
147
|
# No spatial transformation is being done. Round grid_center and crop without having to interpolate.
|
|
147
148
|
# This saves compute.
|
|
148
149
|
# cropping requires the center to be given as integer coordinates
|
|
149
|
-
img = crop_tensor(img, [math.floor(i) for i in params['center_location_in_pixels']]
|
|
150
|
+
img = crop_tensor(img, [math.floor(i) for i in params['center_location_in_pixels']], self.patch_size, pad_mode='constant',
|
|
150
151
|
pad_kwargs={'value': 0})
|
|
151
152
|
return img
|
|
152
153
|
else:
|
|
153
|
-
grid =
|
|
154
|
-
|
|
155
|
-
# the grid must be scaled. The grid is [-1, 1] in image coordinates, but we want it to represent the smaller patch
|
|
156
|
-
grid_scale = torch.Tensor([i / j for i, j in zip(img.shape[1:], self.patch_size)][::-1])
|
|
157
|
-
grid /= grid_scale
|
|
154
|
+
grid = _create_centered_identity_grid2(self.patch_size)
|
|
158
155
|
|
|
159
156
|
# we deform first, then rotate
|
|
160
157
|
if params['elastic_offsets'] is not None:
|
|
@@ -168,10 +165,11 @@ class SpatialTransform(BasicTransform):
|
|
|
168
165
|
mn = grid.mean(dim=list(range(img.ndim - 1)))
|
|
169
166
|
else:
|
|
170
167
|
mn = 0
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
grid += - mn
|
|
174
|
-
return grid_sample(img[None], grid[
|
|
168
|
+
|
|
169
|
+
new_center = torch.Tensor([c - s / 2 for c, s in zip(params['center_location_in_pixels'], img.shape[1:])])
|
|
170
|
+
grid += (new_center - mn)
|
|
171
|
+
return grid_sample(img[None], _convert_my_grid_to_grid_sample_grid(grid, img.shape[1:])[None],
|
|
172
|
+
mode='bilinear', padding_mode="zeros", align_corners=False)[0]
|
|
175
173
|
|
|
176
174
|
def _apply_to_segmentation(self, segmentation: torch.Tensor, **params) -> torch.Tensor:
|
|
177
175
|
segmentation = segmentation.contiguous()
|
|
@@ -180,17 +178,13 @@ class SpatialTransform(BasicTransform):
|
|
|
180
178
|
# This saves compute.
|
|
181
179
|
# cropping requires the center to be given as integer coordinates
|
|
182
180
|
segmentation = crop_tensor(segmentation,
|
|
183
|
-
[math.floor(i) for i in params['center_location_in_pixels']]
|
|
181
|
+
[math.floor(i) for i in params['center_location_in_pixels']],
|
|
184
182
|
self.patch_size,
|
|
185
183
|
pad_mode='constant',
|
|
186
184
|
pad_kwargs={'value': 0})
|
|
187
185
|
return segmentation
|
|
188
186
|
else:
|
|
189
|
-
grid =
|
|
190
|
-
|
|
191
|
-
# the grid must be scaled. The grid is [-1, 1] in image coordinates, but we want it to represent the smaller patch
|
|
192
|
-
grid_scale = torch.Tensor([i / j for i, j in zip(segmentation.shape[1:], self.patch_size)][::-1])
|
|
193
|
-
grid /= grid_scale
|
|
187
|
+
grid = _create_centered_identity_grid2(self.patch_size)
|
|
194
188
|
|
|
195
189
|
# we deform first, then rotate
|
|
196
190
|
if params['elastic_offsets'] is not None:
|
|
@@ -203,9 +197,11 @@ class SpatialTransform(BasicTransform):
|
|
|
203
197
|
mn = grid.mean(dim=list(range(segmentation.ndim - 1)))
|
|
204
198
|
else:
|
|
205
199
|
mn = 0
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
200
|
+
|
|
201
|
+
new_center = torch.Tensor([c - s / 2 for c, s in zip(params['center_location_in_pixels'], segmentation.shape[1:])])
|
|
202
|
+
|
|
203
|
+
grid += (new_center - mn)
|
|
204
|
+
grid = _convert_my_grid_to_grid_sample_grid(grid, segmentation.shape[1:])
|
|
209
205
|
|
|
210
206
|
if self.mode_seg == 'nearest':
|
|
211
207
|
result_seg = grid_sample(
|
|
@@ -305,15 +301,38 @@ def create_affine_matrix_2d(rotation_angle, scaling_factors):
|
|
|
305
301
|
return RS
|
|
306
302
|
|
|
307
303
|
|
|
308
|
-
def _create_identity_grid(size: List[int]) -> Tensor:
|
|
309
|
-
|
|
304
|
+
# def _create_identity_grid(size: List[int]) -> Tensor:
|
|
305
|
+
# space = [torch.linspace((-s + 1) / s, (s - 1) / s, s) for s in size[::-1]]
|
|
306
|
+
# grid = torch.meshgrid(space, indexing="ij")
|
|
307
|
+
# grid = torch.stack(grid, -1)
|
|
308
|
+
# spatial_dims = list(range(len(size)))
|
|
309
|
+
# grid = grid.permute((*spatial_dims[::-1], len(size)))
|
|
310
|
+
# return grid
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def _create_centered_identity_grid2(size: Union[Tuple[int, ...], List[int]]) -> torch.Tensor:
|
|
314
|
+
space = [torch.linspace((1 - s) / 2, (s - 1) / 2, s) for s in size]
|
|
310
315
|
grid = torch.meshgrid(space, indexing="ij")
|
|
311
316
|
grid = torch.stack(grid, -1)
|
|
312
|
-
spatial_dims = list(range(len(size)))
|
|
313
|
-
grid = grid.permute((*spatial_dims[::-1], len(size)))
|
|
314
317
|
return grid
|
|
315
318
|
|
|
316
319
|
|
|
320
|
+
def _convert_my_grid_to_grid_sample_grid(my_grid: torch.Tensor, original_shape: Union[Tuple[int, ...], List[int]]):
|
|
321
|
+
# rescale
|
|
322
|
+
for d in range(len(original_shape)):
|
|
323
|
+
s = original_shape[d]
|
|
324
|
+
my_grid[..., d] /= (s / 2)
|
|
325
|
+
my_grid = torch.flip(my_grid, (len(my_grid.shape) - 1, ))
|
|
326
|
+
# my_grid = my_grid.flip((len(my_grid.shape) - 1,))
|
|
327
|
+
return my_grid
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
# size = (4, 5, 6)
|
|
331
|
+
# grid_old = _create_identity_grid(size)
|
|
332
|
+
# grid_new = _create_centered_identity_grid2(size)
|
|
333
|
+
# grid_new_converted = _convert_my_grid_to_grid_sample_grid(grid_new, size)
|
|
334
|
+
# torch.all(torch.isclose(grid_new_converted, grid_old))
|
|
335
|
+
|
|
317
336
|
# An alternative way of generating the displacement fieldQ
|
|
318
337
|
# def displacement_field(data: torch.Tensor):
|
|
319
338
|
# downscaling_global = np.random.uniform() ** 2 * 4 + 2
|
|
@@ -395,30 +414,86 @@ if __name__ == '__main__':
|
|
|
395
414
|
# with this part we can qualitatively test that the correct axes are ebing augmented. Just set one of the probs to 1 and off you go
|
|
396
415
|
#################
|
|
397
416
|
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
417
|
+
def eldef_scale(image, dim, patch_size):
|
|
418
|
+
return 0.1
|
|
419
|
+
|
|
420
|
+
def eldef_magnitude(image, dim, patch_size, deformation_scale):
|
|
421
|
+
return 10 if dim == 2 else 0
|
|
422
|
+
|
|
423
|
+
def rot(image, dim):
|
|
424
|
+
return 45/360 * 2 * np.pi if dim == 0 else 0
|
|
425
|
+
|
|
426
|
+
def scaling(image, dim):
|
|
427
|
+
return 0.5 if dim == 0 else 1
|
|
428
|
+
|
|
429
|
+
# lines
|
|
430
|
+
patch = torch.zeros((1, 64, 60, 68))
|
|
431
|
+
patch[:, :, 10, 30] = 1
|
|
432
|
+
patch[:, 50, :, 30] = 1
|
|
433
|
+
patch[:, 40, 20, :] = 1
|
|
434
|
+
|
|
435
|
+
# patch_block
|
|
436
|
+
patch_block = torch.zeros((1, 64, 60, 68))
|
|
437
|
+
patch_block[:, 22:42, 20:40, 24:44] = 1
|
|
438
|
+
|
|
439
|
+
patch_line = torch.zeros((1, 64, 60, 128))
|
|
440
|
+
patch_line[:, 22:24, 30:32, 10:-10] = 1
|
|
441
|
+
use = patch_line
|
|
442
|
+
|
|
443
|
+
sp = SpatialTransform(
|
|
444
|
+
patch_size=patch.shape[1:],
|
|
445
|
+
patch_center_dist_from_border=0,
|
|
446
|
+
random_crop=False,
|
|
447
|
+
p_elastic_deform=0,
|
|
448
|
+
p_rotation=1,
|
|
449
|
+
p_scaling=0,
|
|
450
|
+
elastic_deform_scale=eldef_scale,
|
|
451
|
+
elastic_deform_magnitude=eldef_magnitude,
|
|
452
|
+
p_synchronize_def_scale_across_axes=0,
|
|
453
|
+
rotation=rot,
|
|
454
|
+
scaling=scaling,
|
|
455
|
+
p_synchronize_scaling_across_axes=0,
|
|
456
|
+
bg_style_seg_sampling=False,
|
|
457
|
+
mode_seg='bilinear'
|
|
458
|
+
)
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
SimpleITK.WriteImage(SimpleITK.GetImageFromArray(use[0].numpy()), 'orig.nii.gz')
|
|
462
|
+
|
|
463
|
+
params = sp.get_parameters(image=use)
|
|
464
|
+
transformed = sp._apply_to_image(use, **params)
|
|
465
|
+
|
|
466
|
+
SimpleITK.WriteImage(SimpleITK.GetImageFromArray(transformed[0].numpy()), 'transformed.nii.gz')
|
|
467
|
+
|
|
468
|
+
# p = torch.zeros((1, 1, 8, 16, 32))
|
|
469
|
+
# p[:, :, 2:6, 10:16, 10:24] = 1
|
|
470
|
+
# grid = _create_identity_grid(p.shape[2:])
|
|
471
|
+
# grid[:, :, :, 0] *= 0.5
|
|
472
|
+
# out = grid_sample(p, grid[None], mode='bilinear', padding_mode="zeros", align_corners=False)
|
|
473
|
+
# torch.all(out == p)
|
|
474
|
+
# SimpleITK.WriteImage(SimpleITK.GetImageFromArray(p[0, 0].numpy()), 'orig.nii.gz')
|
|
475
|
+
# SimpleITK.WriteImage(SimpleITK.GetImageFromArray(out[0, 0].numpy()), 'transformed.nii.gz')
|
|
476
|
+
|
|
477
|
+
#################
|
|
478
|
+
# with this part I verify that the crop through spatialtransforms grid sample yields the same result as crop_tensor
|
|
479
|
+
#################
|
|
480
|
+
|
|
407
481
|
# sp = SpatialTransform(
|
|
408
|
-
# patch_size=(
|
|
482
|
+
# patch_size=(48, 52, 54),
|
|
409
483
|
# patch_center_dist_from_border=0,
|
|
410
|
-
# random_crop=
|
|
484
|
+
# random_crop=True,
|
|
411
485
|
# p_elastic_deform=0,
|
|
412
|
-
# elastic_deform_scale=0,
|
|
413
|
-
# elastic_deform_magnitude=0,
|
|
414
|
-
# p_synchronize_def_scale_across_axes=0,
|
|
415
486
|
# p_rotation=1,
|
|
416
|
-
# rotation=rot,
|
|
417
487
|
# p_scaling=0,
|
|
418
|
-
#
|
|
419
|
-
#
|
|
420
|
-
#
|
|
421
|
-
#
|
|
488
|
+
# rotation=0
|
|
489
|
+
# )
|
|
490
|
+
# sp2 = SpatialTransform(
|
|
491
|
+
# patch_size=(48, 52, 54),
|
|
492
|
+
# patch_center_dist_from_border=0,
|
|
493
|
+
# random_crop=True,
|
|
494
|
+
# p_elastic_deform=0,
|
|
495
|
+
# p_rotation=0,
|
|
496
|
+
# p_scaling=0,
|
|
422
497
|
# )
|
|
423
498
|
#
|
|
424
499
|
# patch = torch.zeros((1, 64, 60, 68))
|
|
@@ -427,62 +502,20 @@ if __name__ == '__main__':
|
|
|
427
502
|
# patch[:, 40, 20, :] = 1
|
|
428
503
|
# SimpleITK.WriteImage(SimpleITK.GetImageFromArray(patch[0].numpy()), 'orig.nii.gz')
|
|
429
504
|
#
|
|
505
|
+
# center_coords = [50, 10, 16]
|
|
430
506
|
# params = sp.get_parameters(image=patch)
|
|
507
|
+
# params['center_location_in_pixels'] = center_coords
|
|
508
|
+
# params2 = sp2.get_parameters(image=patch)
|
|
509
|
+
# params2['center_location_in_pixels'] = center_coords
|
|
431
510
|
# transformed = sp._apply_to_image(patch, **params)
|
|
511
|
+
# transformed2 = sp._apply_to_image(patch, **params2)
|
|
432
512
|
#
|
|
433
513
|
# SimpleITK.WriteImage(SimpleITK.GetImageFromArray(transformed[0].numpy()), 'transformed.nii.gz')
|
|
514
|
+
# SimpleITK.WriteImage(SimpleITK.GetImageFromArray(transformed2[0].numpy()), 'transformed2.nii.gz')
|
|
434
515
|
|
|
435
|
-
# p = torch.zeros((1, 1, 8, 16, 32))
|
|
436
|
-
# p[:, :, 2:6, 10:16, 10:24] = 1
|
|
437
|
-
# grid = _create_identity_grid(p.shape[2:])
|
|
438
|
-
# grid[:, :, :, 0] *= 0.5
|
|
439
|
-
# out = grid_sample(p, grid[None], mode='bilinear', padding_mode="zeros", align_corners=False)
|
|
440
|
-
# torch.all(out == p)
|
|
441
|
-
# SimpleITK.WriteImage(SimpleITK.GetImageFromArray(p[0, 0].numpy()), 'orig.nii.gz')
|
|
442
|
-
# SimpleITK.WriteImage(SimpleITK.GetImageFromArray(out[0, 0].numpy()), 'transformed.nii.gz')
|
|
443
516
|
|
|
444
|
-
#################
|
|
445
|
-
# with this part I verify that the crop through spatialtransforms grid sample yields the same result as crop_tensor
|
|
446
|
-
#################
|
|
447
517
|
|
|
448
|
-
|
|
449
|
-
patch_size=(48, 52, 54),
|
|
450
|
-
patch_center_dist_from_border=0,
|
|
451
|
-
random_crop=True,
|
|
452
|
-
p_elastic_deform=0,
|
|
453
|
-
p_rotation=1,
|
|
454
|
-
p_scaling=0,
|
|
455
|
-
rotation=0
|
|
456
|
-
)
|
|
457
|
-
sp2 = SpatialTransform(
|
|
458
|
-
patch_size=(48, 52, 54),
|
|
459
|
-
patch_center_dist_from_border=0,
|
|
460
|
-
random_crop=True,
|
|
461
|
-
p_elastic_deform=0,
|
|
462
|
-
p_rotation=0,
|
|
463
|
-
p_scaling=0,
|
|
464
|
-
)
|
|
465
|
-
|
|
466
|
-
patch = torch.zeros((1, 64, 60, 68))
|
|
467
|
-
patch[:, :, 10, 30] = 1
|
|
468
|
-
patch[:, 50, :, 30] = 1
|
|
469
|
-
patch[:, 40, 20, :] = 1
|
|
470
|
-
SimpleITK.WriteImage(SimpleITK.GetImageFromArray(patch[0].numpy()), 'orig.nii.gz')
|
|
471
|
-
|
|
472
|
-
center_coords = [30, 28, 44]
|
|
473
|
-
params = sp.get_parameters(image=patch)
|
|
474
|
-
params['center_location_in_pixels'] = center_coords
|
|
475
|
-
params2 = sp2.get_parameters(image=patch)
|
|
476
|
-
params2['center_location_in_pixels'] = center_coords
|
|
477
|
-
transformed = sp._apply_to_image(patch, **params)
|
|
478
|
-
transformed2 = sp._apply_to_image(patch, **params)
|
|
479
|
-
|
|
480
|
-
SimpleITK.WriteImage(SimpleITK.GetImageFromArray(transformed[0].numpy()), 'transformed.nii.gz')
|
|
481
|
-
SimpleITK.WriteImage(SimpleITK.GetImageFromArray(transformed2[0].numpy()), 'transformed2.nii.gz')
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
####################
|
|
518
|
+
####################
|
|
486
519
|
# This is exploraroty code to check how to retrieve coordinates. I used it to verify that grid_sample does in fact
|
|
487
520
|
# use coordinates in reversed dimension order (zyx and not xyz)
|
|
488
521
|
####################
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/benchmarks/unique_values.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/base/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/intensity/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/intensity/contrast.py
RENAMED
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/intensity/gamma.py
RENAMED
|
File without changes
|
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/nnunet/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/noise/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/spatial/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/spatial/mirroring.py
RENAMED
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/__init__.py
RENAMED
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/compose.py
RENAMED
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/cropping.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/pseudo2d.py
RENAMED
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/random.py
RENAMED
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/remove_label.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|