Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
7ce29a1
Fix network_type docstring formatting in PerceptualLoss
aman0311x Dec 22, 2025
e2d0a02
DCO Remediation Commit for Mohammad Amanour Rahman <amanourrahman@gma…
aman0311x Dec 22, 2025
96ea131
DCO Remediation Commit for Mohammad Amanour Rahman <amanourrahman@gma…
aman0311x Dec 22, 2025
cc0c951
Fix PerceptualLoss enum references and docstrings
aman0311x Dec 22, 2025
eeef172
DCO Remediation Commit for Mohammad Amanour Rahman <amanourrahman@gma…
aman0311x Dec 22, 2025
84e7d70
DCO Remediation Commit for Mohammad Amanour Rahman <amanourrahman@gma…
aman0311x Dec 22, 2025
3e92d74
Fix PerceptualLoss enum references and docstrings
aman0311x Dec 22, 2025
ea64afa
DCO Remediation Commit for Mohammad Amanour Rahman <amanourrahman@gma…
aman0311x Dec 22, 2025
0c667a9
DCO Remediation Commit for Mohammad Amanour Rahman <amanourrahman@gma…
aman0311x Dec 22, 2025
ccea893
DCO Remediation Commit for Mohammad Amanour Rahman <amanourrahman@gma…
aman0311x Dec 22, 2025
8be3faa
Fix network_type docstring formatting in PerceptualLoss
aman0311x Dec 22, 2025
f563b89
WIP: temp commit before cherry-pick
aman0311x Dec 22, 2025
a234edf
Mohammad Amanour Rahman <amanourrahman@gmail.com>
aman0311x Dec 22, 2025
2d423b8
feat: add installation hints for missing image writers #7980
aman0311x Dec 23, 2025
55b8430
DCO Remediation Commit for Mohammad Amanour Rahman <amanourrahman@gma…
aman0311x Dec 24, 2025
efc37aa
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Dec 24, 2025
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
23 changes: 21 additions & 2 deletions monai/data/image_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,27 @@ def resolve_writer(ext_name, error_if_not_found=True) -> Sequence:
continue
except Exception: # other writer init errors indicating it exists
avail_writers.append(_writer)
if not avail_writers and error_if_not_found:
raise OptionalImportError(f"No ImageWriter backend found for {fmt}.")
if not avail_writers and error_if_not_found:
recommended_packages = {
"png": "Pillow",
"jpg": "Pillow",
"jpeg": "Pillow",
"nii": "nibabel or SimpleITK",
"nii.gz": "nibabel or SimpleITK",
"nrrd": "pynrrd",
"tif": "Pillow or tifffile",
"tiff": "Pillow or tifffile",
}

fmt_clean = fmt.replace(".", "").lower()
package_hint = recommended_packages.get(fmt_clean, "")

msg = f"No ImageWriter backend found for {fmt}."
if package_hint:
msg += f" Please install '{package_hint}' (e.g., pip install {package_hint})."

raise OptionalImportError(msg)

writer_tuple = ensure_tuple(avail_writers)
SUPPORTED_WRITERS[fmt] = writer_tuple
return writer_tuple
Expand Down
20 changes: 13 additions & 7 deletions monai/losses/perceptual.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
torchvision, _ = optional_import("torchvision")


class PercetualNetworkType(StrEnum):
class PerceptualNetworkType(StrEnum):
alex = "alex"
vgg = "vgg"
squeeze = "squeeze"
Expand All @@ -49,9 +49,15 @@ class PerceptualLoss(nn.Module):

Args:
spatial_dims: number of spatial dimensions.
network_type: {``"alex"``, ``"vgg"``, ``"squeeze"``, ``"radimagenet_resnet50"``,
``"medicalnet_resnet10_23datasets"``, ``"medicalnet_resnet50_23datasets"``, ``"resnet50"``}
Specifies the network architecture to use. Defaults to ``"alex"``.
network_type: str | PercetualNetworkType = PercetualNetworkType.alex,
One of:
- "alex"
- "vgg"
- "squeeze"
- "radimagenet_resnet50"
- "medicalnet_resnet10_23datasets"
- "medicalnet_resnet50_23datasets"
- "resnet50"
is_fake_3d: if True use 2.5D approach for a 3D perceptual loss.
fake_3d_ratio: ratio of how many slices per axis are used in the 2.5D approach.
cache_dir: path to cache directory to save the pretrained network weights.
Expand All @@ -70,7 +76,7 @@ class PerceptualLoss(nn.Module):
def __init__(
self,
spatial_dims: int,
network_type: str = PercetualNetworkType.alex,
network_type: str = PerceptualNetworkType.alex,
is_fake_3d: bool = True,
fake_3d_ratio: float = 0.5,
cache_dir: str | None = None,
Expand All @@ -93,10 +99,10 @@ def __init__(
if channel_wise and "medicalnet_" not in network_type:
raise ValueError("Channel-wise loss is only compatible with MedicalNet networks.")

if network_type.lower() not in list(PercetualNetworkType):
if network_type.lower() not in list(PerceptualNetworkType):
raise ValueError(
"Unrecognised criterion entered for Adversarial Loss. Must be one in: %s"
% ", ".join(PercetualNetworkType)
% ", ".join(PerceptualNetworkType)
)

if cache_dir:
Expand Down
Loading