# UA-HFNet — Project Structure
## Step 0: Run data inspection first
```bash
python scripts/inspect_data.py --data_root /your/data/path
```
Before running, open `scripts/inspect_data.py` and edit the `CENTER_CONFIG`
dict at the top to match your actual filenames. The key things to set:
| Variable | What to fill |
|---|---|
| `"center1_CT.npy"` | your actual CT filename for center 1 |
| `"center1_labels.csv"` | your CSV filename for center 1 |
| `"center23_labels.csv"` | your merged CSV for centers 2+3 |
| `csv_filter` | set to `None` if the CSV has no center_id column |
## What the script checks
- Shape of every .npy file and whether N matches the CSV row count
- Value range (min/max/mean/std) per modality — helps verify normalization
- NaN and Inf counts
- Label distribution (csPCa prevalence per center)
- Whether total N == 527
## After running, tell me:
1. The shape output for each modality (e.g. `(363, 32, 64, 64)`)
2. The value ranges — especially PET (should be SUV ~0–20 before norm)
3. Any warnings or errors
Then I will write:
- `data/dataset.py` — PyTorch Dataset class
- `data/preprocess.py` — resize / normalize if needed
- `data/augment.py` — 3D augmentations
- `configs/config.yaml` — all hyperparameters
## Project layout (will be built incrementally)
```
ua_hfnet/
├── scripts/
│ └── inspect_data.py ← START HERE
├── data/
│ ├── dataset.py
│ ├── preprocess.py
│ └── augment.py
├── models/
│ ├── encoder.py (3D ResNet-18)
│ ├── pillar1_edl.py (uncertainty heads)
│ ├── pillar2_attn.py (cross-modal attention)
│ └── ua_hfnet.py (full model)
├── losses/
│ ├── focal_loss.py
│ └── edl_loss.py
├── train/
│ ├── train.py
│ ├── evaluate.py
│ └── cross_val.py
├── baselines/
│ ├── concat_model.py
│ └── sota_models.py
├── viz/
│ ├── attn_map.py
│ ├── uncertainty_viz.py
│ └── results_plot.py
├── utils/
│ └── metrics.py
└── configs/
└── config.yaml
```