Views
No views yet
Status: This repository currently contains the official PyTorch code for IUS.Pretrained checkpoints are not included yet and will be released separately.
1git clone https://github.com/innoisys/ius.git
2cd ius pip install -r requirements.txtius/
├── configs/ # YAML configuration files
├── data/ # Data loading and preprocessing
│ ├── data_utils.py # Common utilities for image/data handling
│ ├── dataloader.py # Dataloader definitions
│ ├── dataset.py # Dataset implementations
│ ├── loading.py # Dataset setup from YAML configuration
│ ├── parsers.py # Data parser implementations
│ └── perceptual_transforms.py # PFM (Perceptual Feature Map) generation
├── datasets/ # Real datasets for EPU-CNN training & baseline feature contribution profile estimation
├── datasets_synthetic/ # Synthetic data for IUS evaluation
├── ius/ # IUS implementation
│ ├── ius.py # IUS measure class
│ └── ius_eval_parser.py # Suggested synthetic data parser (not requiring label information)
├── model/ # EPU-CNN model implementation
│ ├── epu.py # Main EPU-CNN model definition
│ ├── module_mapping.py # Mappings from YAML config names to torch.nn layers/activations
│ ├── register_modules.py # Registry for configurable model components
│ ├── subnetworks.py # Subnetwork implementation
│ └── subnetwork_utilities.py # Subnetwork helper modules
├── results/ # Training and inference outputs
│ ├── cb_vectors.py # Saved baseline feature contribution profiles (from infer_cb_vector.py)
│ ├── checkpoints.py # Saved EPU-CNN checkpoints and training configurations (from train_epu.py)
│ ├── classification_performance.py # Classification performance results (from infer_epu.py)
│ ├── ius_eval.py # IUS evaluation results (from eval_ius.py)
│ └── logs.py # TensorBoard logs (from train_epu.py )
├── scripts/ # Training and inference scripts
│ ├── eval_ius.py # Runs synthetic data evaluation with IUS
│ ├── infer_cb_vector.py # Estimates baseline feature contribution profiles
│ ├── infer_epu.py # Runs EPU-CNN inference/evaluation
│ └── train_epu.py # Trains EPU-CNN models
└── utils/ # Utility functions
├── callbacks.py # Training callbacks
├── config_utils.py # YAML/configuration utilities
├── early_stopping.py # Early stopping logic
├── eval_utils.py # Utilities for EPU-CNN evaluation scripts
├── metrics.py # Classification performance metrics
├── omega_parser.py # OmegaConf-based configuration parser
├── sanity_utils.py # Configuration validation and sanity checks
├── tensorboard.py # Tensorboard utilities
├── train_utils.py # Training setup and helping utilities
└── trainer.py # Main training loop implementationconfigs/ with the following structure:1model:
2 num_subnetworks: 4 # set to 4, corresponds to number of perceptual feature maps,
3 num_classes: 1
4 epu_activation: "sigmoid"
5 subnetwork_config:
6 architecture: "base_one" # default ius backbone
7 input_channels: 1 # number of channels in perceptual feature decomposition, set to 1
8 base_channels: 32
9 fc_hidden_units: 64
10 pred_activation: "tanh"
11data_params:
12 dataset_path: "../datasets/dataset_name"
13 images_extension: "jpg"
14 data_loading:
15 batch_size: 64
16 shuffle: true
17 num_workers: 0
18 pin_memory: false
19 persistent_workers: false
20 data_preprocessing:
21 data_mode: "rgb" # "rgb" or "grayscale"
22 data_parser: "filename" # "filename" or "folder" or "medmnist"
23 resize_dims: [128, 128]
24 medmnist_csv_file: None
25 label_mapping:
26 abnormal: 1
27 normal: 0
28train_params:
29 mode: "binary"
30 loss: "binary_cross_entropy"
31 epochs: 200
32 optimizer: "sgd"
33 learning_rate: 0.001
34 momentum: 0.9
35 weight_decay: 0.001
36 early_stopping_patience: 30
37 early_stopping_monitor: "val_loss" # "val_loss" or "val_metrics.auc"
38 early_stopping_mode: "min" # "min" or "max"
39log_dir: "../results/logs" # default parent path
40checkpoint_dir: "../results/checkpoints" # default parent path
41experiment_name: "ius_dataset_name" # desired experiment pathn_classes: 1, epu_activation: "sigmoid"input_size and batch_size based on your GPU memorylabel_mapping according to your dataset classesdatasets/
├── dataset_name/
├── train/
│ ├── abnormal_001.jpg
│ ├── abnormal_002.jpg
│ ├── normal_001.jpg
│ ├── normal_002.jpg
├── validation/
│ ├── abnormal_003.jpg
│ ├── normal_003.jpg
└── test/
├── abnormal_004.jpg
└── normal_004.jpg1data_params:
2 dataset_path: "../datasets/dataset_name"
3 images_extension: "jpg"
4 data_preprocessing:
5 data_mode: "rgb" # "rgb" or "grayscale"
6 data_parser: "filename"
7 resize_dims: [128, 128]
8 medmnist_csv_file: None
9 label_mapping:
10 abnormal: 1
11 normal: 0datasets/
├── dataset_name/
├── train/
│ ├── abnormal
│ │ ├── image_001.jpg
│ │ └── image_002.jpg
│ └── normal
│ ├── image_001.jpg
│ └── image_002.jpg
├── validation/
│ ├── abnormal
│ │ └── image_003.jpg
│ └── normal
│ └── image_003.jpg
└── test/
├── abnormal
│ └── image_004.jpg
└── normal
└── image_004.jpg1data_params:
2 dataset_path: "../datasets/dataset_name"
3 images_extension: "jpg"
4 data_preprocessing:
5 data_mode: "rgb" # "rgb" or "grayscale"
6 data_parser: "folder"
7 resize_dims: [128, 128]
8 medmnist_csv_file: None
9 label_mapping:
10 abnormal: 1
11 normal: 0datasets/
├── pneumoniamnist/
│ ├── pneumoniamnist.csv
│ ├── test_0_0.png
│ ├── test_1_1.png
│ ├── train_0_1.png
│ ├── train_1_0.png
│ ├── train_2_0.png
│ ├── train_3_1.png
│ ├── val_0_1.png
│ └── val_1_0.png 1data_params:
2 dataset_path: "../datasets/pneumoniamnist"
3 images_extension: "png"
4 data_preprocessing:
5 data_mode: "rgb" # "rgb" or "grayscale"
6 data_parser: "folder"
7 resize_dims: [128, 128]
8 medmnist_csv_file: "../datasets/pneumoniamnist/pneumoniamnist.csv"
9 label_mapping:
10 pneumonia: 1
11 normal: 0config.yaml file:1
2# Basic training
3python scripts/train_epu.py --config_filepath configs/train_config.yaml
4
5# Training with TensorBoard monitoring
6python scripts/train_epu.py --config_filepath configs/train_config.yaml --tensorboard--tensorboard flag, the script automatically:logs directoryhttp://localhost:6006python scripts/infer_epu.py --experiment_folder_name ius_dataset_name_base_one_0000_timestamp1# Estimates all baseline feature contribution profiles
2python scripts/infer_cb_vector.py --experiment_folder_name ius_dataset_name_base_one_0000_timestamp
3
4# Estimates the baseline feature contribution profile of a single class
5python scripts/infer_cb_vector.py --experiment_folder_name ius_dataset_name_base_one_0000_timestamp --cb_data normal1# For synthetic dataset IUS evaluation
2python scripts/eval_ius.py --experiment_folder_name ius_dataset_name_base_one_0000_timestamp --cb_vector_tag normal --synthetic_images datasets_synthetic/dataset_name/normal --synthetic_img_extension png
3
4# For a single image IUS evaluation
5python scripts/eval_ius.py --experiment_folder_name ius_dataset_name_base_one_0000_timestamp --cb_vector_tag normal --synthetic_images datasets_synthetic/dataset_name/normal/seed_000.png --synthetic_img_extension pngdatasets_synthetic/
├── dataset_name/
├── normal/
├── seed_000.png
└── seed_001.png1@article{
2 author = {Panagiota Gatoula and George Dimas and Dimitris K. Iakovidis},
3 title = {Interpretable Similarity of Synthetic Image Utility},
4 journal = {IEEE Transactions on Medical Imaging},
5 year = {2026},
6 publisher = {IEEE},
7 doi = {10.1109/TMI.2026.3679527}
8}