From 8e4933d85ab107abdf0c357f04af6417d55cd1f2 Mon Sep 17 00:00:00 2001 From: UGBOMEH OGOCHUKWU WILLIAMS Date: Sat, 18 Apr 2026 14:37:28 +0100 Subject: [PATCH 1/3] Fix #8442: pass meta_data to EnsureChannelFirst when track_meta is False When set_track_meta(False) is active, MetaTensor.ensure_torch_and_prune_meta returns a plain tensor. The subsequent EnsureChannelFirst() call then has no metadata source, causing a ValueError. Fix: pass meta_data explicitly when img is not a MetaTensor. Signed-off-by: UGBOMEH OGOCHUKWU WILLIAMS --- monai/transforms/io/array.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/monai/transforms/io/array.py b/monai/transforms/io/array.py index 049779f606..580dc398cf 100644 --- a/monai/transforms/io/array.py +++ b/monai/transforms/io/array.py @@ -299,7 +299,10 @@ def __call__(self, filename: Sequence[PathLike] | PathLike, reader: ImageReader img_array, meta_data, self.simple_keys, pattern=self.pattern, sep=self.sep ) if self.ensure_channel_first: - img = EnsureChannelFirst()(img) + if not isinstance(img, MetaTensor): + img = EnsureChannelFirst()(img, meta_dict=meta_data) + else: + img = EnsureChannelFirst()(img) if self.image_only: return img return img, img.meta if isinstance(img, MetaTensor) else meta_data From e914e8f01ec11a1874bcb65ab4047f2da3418b60 Mon Sep 17 00:00:00 2001 From: UGBOMEH OGOCHUKWU WILLIAMS Date: Fri, 1 May 2026 20:22:23 +0100 Subject: [PATCH 2/3] Fix #8442: simplify channel-first call and add regression test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apply review suggestion: pass meta_data unconditionally to EnsureChannelFirst — when img is a MetaTensor, EnsureChannelFirst overrides meta_dict with img.meta internally, so the explicit if/else is not needed. Add regression test covering set_track_meta(False) with ensure_channel_first=True on LoadImage. Signed-off-by: UGBOMEH OGOCHUKWU WILLIAMS --- monai/transforms/io/array.py | 5 +---- tests/transforms/test_load_image.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/monai/transforms/io/array.py b/monai/transforms/io/array.py index 580dc398cf..aadd96763d 100644 --- a/monai/transforms/io/array.py +++ b/monai/transforms/io/array.py @@ -299,10 +299,7 @@ def __call__(self, filename: Sequence[PathLike] | PathLike, reader: ImageReader img_array, meta_data, self.simple_keys, pattern=self.pattern, sep=self.sep ) if self.ensure_channel_first: - if not isinstance(img, MetaTensor): - img = EnsureChannelFirst()(img, meta_dict=meta_data) - else: - img = EnsureChannelFirst()(img) + img = EnsureChannelFirst()(img, meta_dict=meta_data) if self.image_only: return img return img, img.meta if isinstance(img, MetaTensor) else meta_data diff --git a/tests/transforms/test_load_image.py b/tests/transforms/test_load_image.py index 031e38272e..75fb577ab2 100644 --- a/tests/transforms/test_load_image.py +++ b/tests/transforms/test_load_image.py @@ -497,6 +497,16 @@ def test_correct(self, input_param, expected_shape, track_meta): self.assertNotIsInstance(r, MetaTensor) self.assertFalse(hasattr(r, "affine")) + def test_track_meta_false_ensure_channel_first(self): + try: + set_track_meta(False) + r = LoadImage(image_only=True, ensure_channel_first=True)(self.test_data) + self.assertTupleEqual(r.shape, (1, 128, 128, 128)) + self.assertIsInstance(r, torch.Tensor) + self.assertNotIsInstance(r, MetaTensor) + finally: + set_track_meta(True) + if __name__ == "__main__": unittest.main() From 045363d40f880bce69a736af52794593db5cd43e Mon Sep 17 00:00:00 2001 From: UGBOMEH OGOCHUKWU WILLIAMS Date: Wed, 6 May 2026 23:11:29 +0100 Subject: [PATCH 3/3] Apply review: restore previous track_meta state in regression test Capture the prior get_track_meta() value and restore it in the finally block instead of hard-coding True, so the test does not clobber state that was set by an earlier test. Per review suggestion. Signed-off-by: UGBOMEH OGOCHUKWU WILLIAMS --- tests/transforms/test_load_image.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/transforms/test_load_image.py b/tests/transforms/test_load_image.py index 75fb577ab2..4a470a624c 100644 --- a/tests/transforms/test_load_image.py +++ b/tests/transforms/test_load_image.py @@ -25,7 +25,7 @@ from monai.apps import download_and_extract from monai.data import NibabelReader, PydicomReader -from monai.data.meta_obj import set_track_meta +from monai.data.meta_obj import get_track_meta, set_track_meta from monai.data.meta_tensor import MetaTensor from monai.transforms import LoadImage from monai.utils import optional_import @@ -498,6 +498,7 @@ def test_correct(self, input_param, expected_shape, track_meta): self.assertFalse(hasattr(r, "affine")) def test_track_meta_false_ensure_channel_first(self): + _previous_meta = get_track_meta() try: set_track_meta(False) r = LoadImage(image_only=True, ensure_channel_first=True)(self.test_data) @@ -505,7 +506,7 @@ def test_track_meta_false_ensure_channel_first(self): self.assertIsInstance(r, torch.Tensor) self.assertNotIsInstance(r, MetaTensor) finally: - set_track_meta(True) + set_track_meta(_previous_meta) if __name__ == "__main__":