This file is the command checklist for getting data, verifying it, training the baseline, running multi-attribute comparisons, and reading results.
Run all commands from the repo root:
cd /home/carl/sujosh/APPR-PHOTOSIf your environment already exists, activate it:
conda activate appr-photosChoose one create command below if the environment does not exist yet.
If you need to create a CUDA-enabled environment:
bash scripts/setup_env.sh appr-photos 3.10 cuda:cu128
conda activate appr-photosIf you need a portable CPU environment:
bash scripts/setup_env.sh appr-photos 3.10 cpu
conda activate appr-photosCheck that PyTorch sees the selected runtime:
python - <<'PY'
import torch
from aapr.utils.device import get_device
print("torch:", torch.__version__)
print("cuda_available:", torch.cuda.is_available())
print("selected_device:", get_device("auto"))
PYCelebA is the prepared dataset path for this repo.
bash scripts/download_data.sh celeba data/raw/celebaThis creates:
data/raw/celeba/
metadata.csv
celeba/
img_align_celeba/
000001.jpg
...
The default prepared metadata uses:
utility: smiling / not_smiling
privacy: speaker_id, gender
Run this before training:
python scripts/prepare_datasets.py --verify --stats --root data/raw/celebaExpected successful shape:
status: OK
num_images: 202599
has_metadata_csv: True
Photos: 202599 samples | 10177 speakers
Class names: ['not_smiling', 'smiling']
Smoke test the original single-utility training path:
python scripts/train.py \
--config configs/experiment/celeba_baseline.yaml \
training.num_epochs=1 \
dataset.batch_size=16 \
dataset.num_workers=0 \
output.dir=outputs/smoke_baseline \
output.checkpoint_dir=outputs/smoke_baseline/checkpoints \
output.log_dir=outputs/smoke_baseline/logs \
output.tensorboard_dir=outputs/smoke_baseline/tensorboardSmoke test the multi-utility, multi-privacy comparison path:
python scripts/run_celeba_attribute_comparison.py \
--mode multi \
--epochs 1 \
--batch-size 16 \
--num-workers 0 \
--limit-samples 512 \
--output-root outputs/smoke_attribute_comparisonDo not use --limit-samples for final results.
Run the baseline smiling utility task:
python scripts/train.py --config configs/experiment/celeba_baseline.yamlRun the larger-batch baseline:
python scripts/train.py \
--config configs/experiment/celeba_accelerated.yaml \
dataset.batch_size=128 \
dataset.num_workers=8If memory is tight, reduce batch size:
python scripts/train.py \
--config configs/experiment/celeba_accelerated.yaml \
dataset.batch_size=64 \
dataset.num_workers=4This is the main command for the current expanded work. It trains separate single-utility runs and one combined multi-utility run.
python scripts/run_celeba_attribute_comparison.py \
--mode both \
--epochs 10 \
--batch-size 128 \
--num-workers 8The default comparison uses:
utilities:
Smiling
Mouth_Slightly_Open
Eyeglasses
Wearing_Hat
Blurry
privacy heads:
speaker_id
gender
young
If the full run is too large, use:
python scripts/run_celeba_attribute_comparison.py \
--mode both \
--epochs 10 \
--batch-size 64 \
--num-workers 4Run only the combined multi-utility model:
python scripts/run_celeba_attribute_comparison.py \
--mode multi \
--epochs 10 \
--batch-size 128 \
--num-workers 8Run only separate utility experiments:
python scripts/run_celeba_attribute_comparison.py \
--mode single \
--epochs 10 \
--batch-size 128 \
--num-workers 8Choose a custom set of utility labels:
python scripts/run_celeba_attribute_comparison.py \
--mode both \
--epochs 10 \
--batch-size 128 \
--num-workers 8 \
--utilities Smiling Eyeglasses Wearing_Hat Mouth_Slightly_Open Blurry \
--privacy speaker_id gender youngPrint planned commands without training:
python scripts/run_celeba_attribute_comparison.py --dry-run --mode bothPrepare generated metadata only:
python scripts/run_celeba_attribute_comparison.py --prepare-only --mode bothFor a longer run:
mkdir -p outputs/logs
nohup python scripts/run_celeba_attribute_comparison.py \
--mode both \
--epochs 10 \
--batch-size 128 \
--num-workers 8 \
> outputs/logs/attribute_comparison.out 2>&1 &
echo $!Watch progress:
tail -f outputs/logs/attribute_comparison.outEvaluate the baseline checkpoint:
python scripts/evaluate.py \
--checkpoint outputs/celeba_baseline/checkpoints/best_model.ptEvaluate the combined multi-utility checkpoint:
python scripts/evaluate.py \
--checkpoint outputs/celeba_attribute_comparison/multi_utility/checkpoints/best_model.ptMain comparison files:
outputs/celeba_attribute_comparison/comparison_manifest.json
outputs/celeba_attribute_comparison/comparison_results.json
outputs/celeba_attribute_comparison/comparison_results.csv
Print a compact table:
python - <<'PY'
import pandas as pd
path = "outputs/celeba_attribute_comparison/comparison_results.csv"
df = pd.read_csv(path)
cols = [
"run",
"best_epoch",
"test_utility_uar",
"test_utility_wa",
"test_utility_f1",
"test_privacy_gender_uar",
"test_privacy_young_uar",
"test_privacy_speaker_id_acc",
"test_mi_speaker",
]
print(df[[c for c in cols if c in df.columns]].to_string(index=False))
PYInspect one run:
tail -n 80 outputs/celeba_attribute_comparison/multi_utility/train.log
cat outputs/celeba_attribute_comparison/multi_utility/test_results.jsonFor all comparison runs:
tensorboard --logdir outputs/celeba_attribute_comparisonFor the baseline:
tensorboard --logdir outputs/celeba_baseline/tensorboardUse this for the main report table:
python scripts/run_celeba_attribute_comparison.py \
--mode both \
--epochs 10 \
--batch-size 128 \
--num-workers 8Then report from:
outputs/celeba_attribute_comparison/comparison_results.csv