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.
Files changed (47) hide show
  1. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/PKG-INFO +1 -1
  2. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/spatial/spatial.py +136 -103
  3. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2.egg-info/PKG-INFO +1 -1
  4. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/pyproject.toml +1 -1
  5. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/LICENSE +0 -0
  6. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/__init__.py +0 -0
  7. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/benchmarks/__init__.py +0 -0
  8. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/benchmarks/bg_comparison/__init__.py +0 -0
  9. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/benchmarks/bg_comparison/nnUNet_pipeline_bg.py +0 -0
  10. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/benchmarks/bg_comparison/nnUNet_pipeline_here.py +0 -0
  11. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/benchmarks/unique_values.py +0 -0
  12. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/dataloading/__init__.py +0 -0
  13. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/helpers/__init__.py +0 -0
  14. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/helpers/scalar_type.py +0 -0
  15. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/__init__.py +0 -0
  16. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/base/__init__.py +0 -0
  17. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/base/basic_transform.py +0 -0
  18. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/intensity/__init__.py +0 -0
  19. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/intensity/brightness.py +0 -0
  20. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/intensity/contrast.py +0 -0
  21. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/intensity/gamma.py +0 -0
  22. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/intensity/gaussian_noise.py +0 -0
  23. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/nnunet/__init__.py +0 -0
  24. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/nnunet/random_binary_operator.py +0 -0
  25. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/nnunet/remove_connected_components.py +0 -0
  26. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/nnunet/seg_to_onehot.py +0 -0
  27. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/noise/__init__.py +0 -0
  28. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/noise/gaussian_blur.py +0 -0
  29. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/spatial/__init__.py +0 -0
  30. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/spatial/low_resolution.py +0 -0
  31. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/spatial/mirroring.py +0 -0
  32. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/__init__.py +0 -0
  33. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/compose.py +0 -0
  34. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/cropping.py +0 -0
  35. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/deep_supervision_downsampling.py +0 -0
  36. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/nnunet_masking.py +0 -0
  37. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/pseudo2d.py +0 -0
  38. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/random.py +0 -0
  39. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/remove_label.py +0 -0
  40. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2/transforms/utils/seg_to_regions.py +0 -0
  41. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2.egg-info/SOURCES.txt +0 -0
  42. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2.egg-info/dependency_links.txt +0 -0
  43. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2.egg-info/requires.txt +0 -0
  44. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/batchgeneratorsv2.egg-info/top_level.txt +0 -0
  45. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/readme.md +0 -0
  46. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/setup.cfg +0 -0
  47. {batchgeneratorsv2-0.2 → batchgeneratorsv2-0.2.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: batchgeneratorsv2
3
- Version: 0.2
3
+ Version: 0.2.1
4
4
  Summary: Batchgenerators but better
5
5
  Author: Helmholtz Imaging Applied Computer Vision Lab
6
6
  Author-email: Fabian Isensee <f.isensee@dkfz-heidelberg.de>
@@ -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(dim - 1, -1, -1)]
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(dim - 1, -1, -1)]
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(dim - 1, -1, -1)
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)][::-1]
101
- # the magnitude of the deformation field must adhere to the torch's value range for grid_sample, i.e. [-1. 1] and not pixel coordinates. Do not use sigmas here
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]) / grid_scale[i] for i in range(dim - 1, -1, -1)]
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
- # grid center must be in [-1, 1] as required by grid_sample
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][::-1]
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(dim - 1, -1, -1):
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']][::-1], self.patch_size, pad_mode='constant',
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 = _create_identity_grid(self.patch_size)
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
- new_center = torch.Tensor(
172
- [(j / (i / 2) - 1) for i, j in zip(img.shape[1:][::-1], params['center_location_in_pixels'])])
173
- grid += - mn + new_center
174
- return grid_sample(img[None], grid[None], mode='bilinear', padding_mode="zeros", align_corners=False)[0]
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']][::-1],
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 = _create_identity_grid(self.patch_size)
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
- new_center = torch.Tensor(
207
- [(j / (i / 2) - 1) for i, j in zip(segmentation.shape[1:][::-1], params['center_location_in_pixels'])])
208
- grid += - mn + new_center
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
- space = [torch.linspace((-s + 1) / s, (s - 1) / s, s) for s in size[::-1]]
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
- # def constant_scaling(image, dim, patch_size):
399
- # return 0.1
400
- #
401
- # def constant_magnitude(image, dim, patch_size, deformation_scale):
402
- # return 0.25 if dim == 2 else 0
403
- #
404
- # def rot(image, dim):
405
- # return 45/360 * 2 * np.pi if dim == 1 else 0
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=(64, 60, 68),
482
+ # patch_size=(48, 52, 54),
409
483
  # patch_center_dist_from_border=0,
410
- # random_crop=False,
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
- # scaling=constant_scaling,
419
- # p_synchronize_scaling_across_axes=0,
420
- # bg_style_seg_sampling=False,
421
- # mode_seg='bilinear'
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
- sp = SpatialTransform(
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
  ####################
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: batchgeneratorsv2
3
- Version: 0.2
3
+ Version: 0.2.1
4
4
  Summary: Batchgenerators but better
5
5
  Author: Helmholtz Imaging Applied Computer Vision Lab
6
6
  Author-email: Fabian Isensee <f.isensee@dkfz-heidelberg.de>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "batchgeneratorsv2"
3
- version = "0.2"
3
+ version = "0.2.1"
4
4
  requires-python = ">=3.9"
5
5
  description = "Batchgenerators but better"
6
6
  readme = "readme.md"