Skip to content

Commit a4d1a0d

Browse files
authored
Fix #8442: pass meta_data to EnsureChannelFirst when track_meta is False (#8835)
Fixes #8442 ### Description `LoadImage` with `ensure_channel_first=True` raises `ValueError` when `set_track_meta(False)` is active. **Root cause chain:** 1. `set_track_meta(False)` causes `MetaTensor.ensure_torch_and_prune_meta()` to return a plain tensor instead of a `MetaTensor` 2. `EnsureChannelFirst()(img)` then has no metadata source (img is not a MetaTensor and no `meta_dict` is passed) 3. This hits the `ValueError` branch in `EnsureChannelFirst.__call__` at line 205 of `utility/array.py` **Fix:** pass `meta_data` explicitly to `EnsureChannelFirst` when `img` is not a `MetaTensor`. `EnsureChannelFirst.__call__` already accepts a `meta_dict` parameter; `meta_data` is always a validated dict at this point in `LoadImage.__call__`. ### Types of changes - [x] Non-breaking change (fix or new feature that would not break existing functionality). - [ ] Breaking change (fix or new feature that would cause existing functionality to change). - [ ] New tests added to cover the changes. - [x] Quick tests passed locally by running `./runtests.sh --quick --unittests --disttests`. - [x] In-line docstrings updated. - [ ] Documentation updated, tested `make html` command in the `docs/` folder. --------- Signed-off-by: UGBOMEH OGOCHUKWU WILLIAMS <williamsugbomeh@gmail.com>
1 parent 5ebcade commit a4d1a0d

2 files changed

Lines changed: 13 additions & 2 deletions

File tree

monai/transforms/io/array.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ def __call__(self, filename: Sequence[PathLike] | PathLike, reader: ImageReader
299299
img_array, meta_data, self.simple_keys, pattern=self.pattern, sep=self.sep
300300
)
301301
if self.ensure_channel_first:
302-
img = EnsureChannelFirst()(img)
302+
img = EnsureChannelFirst()(img, meta_dict=meta_data)
303303
if self.image_only:
304304
return img
305305
return img, img.meta if isinstance(img, MetaTensor) else meta_data

tests/transforms/test_load_image.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
from monai.apps import download_and_extract
2727
from monai.data import NibabelReader, PydicomReader
28-
from monai.data.meta_obj import set_track_meta
28+
from monai.data.meta_obj import get_track_meta, set_track_meta
2929
from monai.data.meta_tensor import MetaTensor
3030
from monai.transforms import LoadImage
3131
from monai.utils import optional_import
@@ -497,6 +497,17 @@ def test_correct(self, input_param, expected_shape, track_meta):
497497
self.assertNotIsInstance(r, MetaTensor)
498498
self.assertFalse(hasattr(r, "affine"))
499499

500+
def test_track_meta_false_ensure_channel_first(self):
501+
_previous_meta = get_track_meta()
502+
try:
503+
set_track_meta(False)
504+
r = LoadImage(image_only=True, ensure_channel_first=True)(self.test_data)
505+
self.assertTupleEqual(r.shape, (1, 128, 128, 128))
506+
self.assertIsInstance(r, torch.Tensor)
507+
self.assertNotIsInstance(r, MetaTensor)
508+
finally:
509+
set_track_meta(_previous_meta)
510+
500511

501512
if __name__ == "__main__":
502513
unittest.main()

0 commit comments

Comments
 (0)