From 55a629c0e19cf51a7904a7a5c1e35e953e8a1cd1 Mon Sep 17 00:00:00 2001 From: ytl0623 Date: Wed, 18 Mar 2026 22:44:53 +0800 Subject: [PATCH 1/4] Fix incorrect truncated parameter in make_gaussian_kernel causing corrupted LocalNormalizedCrossCorrelationLoss Signed-off-by: ytl0623 --- monai/losses/image_dissimilarity.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monai/losses/image_dissimilarity.py b/monai/losses/image_dissimilarity.py index 29cce74926..015d7d38ff 100644 --- a/monai/losses/image_dissimilarity.py +++ b/monai/losses/image_dissimilarity.py @@ -35,7 +35,7 @@ def make_triangular_kernel(kernel_size: int) -> torch.Tensor: def make_gaussian_kernel(kernel_size: int) -> torch.Tensor: sigma = torch.tensor(kernel_size / 3.0) - kernel = gaussian_1d(sigma=sigma, truncated=kernel_size // 2, approx="sampled", normalize=False) * ( + kernel = gaussian_1d(sigma=sigma, truncated=(kernel_size // 2) / sigma, approx="sampled", normalize=False) * ( 2.5066282 * sigma ) return kernel[:kernel_size] From cfcee1f1614972beb6a5971204576050c20d60f7 Mon Sep 17 00:00:00 2001 From: ytl0623 Date: Wed, 18 Mar 2026 23:30:58 +0800 Subject: [PATCH 2/4] add unit test Signed-off-by: ytl0623 --- tests/integration/test_reg_loss_integration.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/integration/test_reg_loss_integration.py b/tests/integration/test_reg_loss_integration.py index cdc174ddd0..ea3c316459 100644 --- a/tests/integration/test_reg_loss_integration.py +++ b/tests/integration/test_reg_loss_integration.py @@ -26,6 +26,7 @@ [LocalNormalizedCrossCorrelationLoss, {"kernel_size": 7, "kernel_type": "rectangular"}, ["pred", "target"]], [LocalNormalizedCrossCorrelationLoss, {"kernel_size": 5, "kernel_type": "triangular"}, ["pred", "target"]], [LocalNormalizedCrossCorrelationLoss, {"kernel_size": 3, "kernel_type": "gaussian"}, ["pred", "target"]], + [LocalNormalizedCrossCorrelationLoss, {"kernel_size": 7, "kernel_type": "gaussian"}, ["pred", "target"]], [GlobalMutualInformationLoss, {"num_bins": 10}, ["pred", "target"]], [GlobalMutualInformationLoss, {"kernel_type": "b-spline", "num_bins": 10}, ["pred", "target"]], ] @@ -98,6 +99,23 @@ def forward(self, x): optimizer.step() self.assertGreater(init_loss, loss_val, "loss did not decrease") +def test_lncc_gaussian_kernel_gt3_identical_images(self): + """ + Regression test for make_gaussian_kernel truncated parameter bug. + LNCC on identical inputs must be close to -1.0 for gaussian kernel_size > 3. + """ + for kernel_size in [5, 7]: + with self.subTest(kernel_size=kernel_size): + loss_fn = LocalNormalizedCrossCorrelationLoss( + spatial_dims=2, kernel_size=kernel_size, kernel_type="gaussian" + ).to(self.device) + x = torch.rand(2, 1, 32, 32, device=self.device) + y = x.clone() + loss = loss_fn(x, y) + self.assertTrue( + torch.allclose(loss, torch.tensor(-1.0, device=self.device, dtype=loss.dtype), atol=1e-3), + f"LNCC of identical images should be -1.0, got {loss.item():.6f} (kernel_size={kernel_size})", + ) if __name__ == "__main__": unittest.main() From 8fa11304ec22051326d3f21a469b07b5fd97e280 Mon Sep 17 00:00:00 2001 From: ytl0623 Date: Thu, 19 Mar 2026 09:18:20 +0800 Subject: [PATCH 3/4] Update tests/integration/test_reg_loss_integration.py Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: ytl0623 --- tests/integration/test_reg_loss_integration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/test_reg_loss_integration.py b/tests/integration/test_reg_loss_integration.py index ea3c316459..122150b82d 100644 --- a/tests/integration/test_reg_loss_integration.py +++ b/tests/integration/test_reg_loss_integration.py @@ -99,7 +99,7 @@ def forward(self, x): optimizer.step() self.assertGreater(init_loss, loss_val, "loss did not decrease") -def test_lncc_gaussian_kernel_gt3_identical_images(self): + def test_lncc_gaussian_kernel_gt3_identical_images(self): """ Regression test for make_gaussian_kernel truncated parameter bug. LNCC on identical inputs must be close to -1.0 for gaussian kernel_size > 3. From 7945c0a13afc38a64492dc3379926e7ee7c2b604 Mon Sep 17 00:00:00 2001 From: ytl0623 Date: Thu, 19 Mar 2026 23:11:19 +0800 Subject: [PATCH 4/4] reformatted Signed-off-by: ytl0623 --- tests/integration/test_reg_loss_integration.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integration/test_reg_loss_integration.py b/tests/integration/test_reg_loss_integration.py index 122150b82d..27dbb22d5d 100644 --- a/tests/integration/test_reg_loss_integration.py +++ b/tests/integration/test_reg_loss_integration.py @@ -117,5 +117,6 @@ def test_lncc_gaussian_kernel_gt3_identical_images(self): f"LNCC of identical images should be -1.0, got {loss.item():.6f} (kernel_size={kernel_size})", ) + if __name__ == "__main__": unittest.main()