Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion monai/losses/image_dissimilarity.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
Expand Down
18 changes: 18 additions & 0 deletions tests/integration/test_reg_loss_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"]],
]
Expand Down Expand Up @@ -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})",
)
Comment thread
ytl0623 marked this conversation as resolved.
Outdated

if __name__ == "__main__":
unittest.main()
Loading