# wangzhuo2019/ssan architecture

> Architecture diagram of the GitHub repository wangzhuo2019/ssan, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/wangzhuo2019/ssan
- Repository: https://github.com/wangzhuo2019/ssan

## Overview

This is a PyTorch research implementation of domain-generalized face anti-spoofing. The main workflow selects cross-dataset training and held-out testing, loads and augments face/depth-map samples, trains an SSAN model with liveness, shuffled-style contrastive, and domain-adversarial objectives, then evaluates video scores and saves checkpoints. The README also documents a separate large-scale benchmark; its directory is present, but its implementation is not sampled, so its internal wiring is not inferred.

Main entry points: [`solver.py`](https://github.com/wangzhuo2019/ssan/blob/main/solver.py) (Train and test), [`datasets/data_merge.py`](https://github.com/wangzhuo2019/ssan/blob/main/datasets/data_merge.py) (Protocol dataset bank), [`networks/__init__.py`](https://github.com/wangzhuo2019/ssan/blob/main/networks/__init__.py) (Model selection), [`configs/__init__.py`](https://github.com/wangzhuo2019/ssan/blob/main/configs/__init__.py) (Experiment settings)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_workflow["Experiment workflow"]
  node_settings["Experiment settings<br/>[__init__.py]"]
  node_solver["Train and test<br/>[solver.py]"]
end

subgraph group_data["Data preparation"]
  node_dataset_bank["Protocol dataset bank<br/>[data_merge.py]"]
  node_dataset_storage[("Face datasets")]
  node_casia_train["CASIA-family train loader"]
  node_casia_eval["CASIA-family eval loader"]
  node_oulu_train["OULU train loader"]
  node_oulu_eval["OULU eval loader"]
  node_augment["Training transforms"]
  node_eval_transforms["Evaluation transforms"]
end

subgraph group_model["SSAN models"]
  node_factory["Model selection<br/>[__init__.py]"]
  node_ssan_r["SSAN-R<br/>[SSAN_R.py]"]
  node_ssan_m["SSAN-M<br/>[SSAN_M.py]"]
  node_shared_modules["AdaIN and GRL<br/>[pub_mod.py]"]
end

subgraph group_learning["Learning and evaluation"]
  node_losses["Contrastive loss<br/>[__init__.py]"]
  node_optimizer["Optimizer selection<br/>[__init__.py]"]
  node_evaluation["Video scoring<br/>[solver.py]"]
  node_metrics["FAS metrics<br/>[performance.py]"]
end

subgraph group_benchmark["Benchmark"]
  node_large_benchmark["Large-scale benchmark"]
end

node_researcher(("Researcher"))

node_researcher -->|"configures"| node_settings
node_researcher -->|"starts"| node_solver
node_settings -->|"supplies settings"| node_solver
node_solver -->|"requests splits"| node_dataset_bank
node_dataset_bank -->|"creates train set"| node_casia_train
node_dataset_bank -->|"creates eval set"| node_casia_eval
node_dataset_bank -->|"creates train set"| node_oulu_train
node_dataset_bank -->|"creates eval set"| node_oulu_eval
node_dataset_bank -->|"reads samples"| node_dataset_storage
node_solver -->|"selects transforms"| node_augment
node_solver -->|"selects transforms"| node_eval_transforms
node_solver -->|"builds model"| node_factory
node_factory -->|"selects"| node_ssan_r
node_factory -->|"selects"| node_ssan_m
node_ssan_r -->|"uses"| node_shared_modules
node_ssan_m -->|"uses"| node_shared_modules
node_solver -->|"creates optimizer"| node_optimizer
node_solver -->|"computes contrastive loss"| node_losses
node_solver -->|"runs test"| node_evaluation
node_evaluation -->|"computes metrics"| node_metrics
node_researcher -.->|"uses benchmark protocol"| node_large_benchmark

click node_settings "https://github.com/wangzhuo2019/ssan/blob/main/configs/__init__.py"
click node_solver "https://github.com/wangzhuo2019/ssan/blob/main/solver.py"
click node_dataset_bank "https://github.com/wangzhuo2019/ssan/blob/main/datasets/data_merge.py"
click node_casia_train "https://github.com/wangzhuo2019/ssan/blob/main/datasets/Load_CASIA_train.py"
click node_casia_eval "https://github.com/wangzhuo2019/ssan/blob/main/datasets/Load_CASIA_valtest.py"
click node_oulu_train "https://github.com/wangzhuo2019/ssan/blob/main/datasets/Load_OULUNPU_train.py"
click node_oulu_eval "https://github.com/wangzhuo2019/ssan/blob/main/datasets/Load_OULUNPU_valtest.py"
click node_augment "https://github.com/wangzhuo2019/ssan/blob/main/transformers/transformer_train.py"
click node_eval_transforms "https://github.com/wangzhuo2019/ssan/blob/main/transformers/transformer_test.py"
click node_factory "https://github.com/wangzhuo2019/ssan/blob/main/networks/__init__.py"
click node_ssan_r "https://github.com/wangzhuo2019/ssan/blob/main/networks/SSAN_R.py"
click node_ssan_m "https://github.com/wangzhuo2019/ssan/blob/main/networks/SSAN_M.py"
click node_shared_modules "https://github.com/wangzhuo2019/ssan/blob/main/networks/pub_mod.py"
click node_losses "https://github.com/wangzhuo2019/ssan/blob/main/loss/__init__.py"
click node_optimizer "https://github.com/wangzhuo2019/ssan/blob/main/optimizers/__init__.py"
click node_evaluation "https://github.com/wangzhuo2019/ssan/blob/main/solver.py"
click node_metrics "https://github.com/wangzhuo2019/ssan/blob/main/utils/performance.py"
click node_large_benchmark "https://github.com/wangzhuo2019/ssan/tree/main/Large_Scale_FAS_Benchmarks"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_settings,node_solver toneBlue
class node_dataset_bank,node_dataset_storage,node_casia_train,node_casia_eval,node_oulu_train,node_oulu_eval,node_augment,node_eval_transforms toneAmber
class node_factory,node_ssan_r,node_ssan_m,node_shared_modules toneMint
class node_losses,node_optimizer,node_evaluation,node_metrics toneRose
class node_large_benchmark,node_researcher toneIndigo
```

## Components

### Experiment workflow

- [Experiment settings](https://github.com/wangzhuo2019/ssan/blob/main/configs/__init__.py): `configs/__init__.py`
- [Train and test](https://github.com/wangzhuo2019/ssan/blob/main/solver.py): `solver.py`

### Data preparation

- [Protocol dataset bank](https://github.com/wangzhuo2019/ssan/blob/main/datasets/data_merge.py): `datasets/data_merge.py`
- **Face datasets**
- [CASIA-family train loader](https://github.com/wangzhuo2019/ssan/blob/main/datasets/Load_CASIA_train.py): `datasets/Load_CASIA_train.py`
- [CASIA-family eval loader](https://github.com/wangzhuo2019/ssan/blob/main/datasets/Load_CASIA_valtest.py): `datasets/Load_CASIA_valtest.py`
- [OULU train loader](https://github.com/wangzhuo2019/ssan/blob/main/datasets/Load_OULUNPU_train.py): `datasets/Load_OULUNPU_train.py`
- [OULU eval loader](https://github.com/wangzhuo2019/ssan/blob/main/datasets/Load_OULUNPU_valtest.py): `datasets/Load_OULUNPU_valtest.py`
- [Training transforms](https://github.com/wangzhuo2019/ssan/blob/main/transformers/transformer_train.py): `transformers/transformer_train.py`
- [Evaluation transforms](https://github.com/wangzhuo2019/ssan/blob/main/transformers/transformer_test.py): `transformers/transformer_test.py`

### SSAN models

- [Model selection](https://github.com/wangzhuo2019/ssan/blob/main/networks/__init__.py): `networks/__init__.py`
- [SSAN-R](https://github.com/wangzhuo2019/ssan/blob/main/networks/SSAN_R.py): `networks/SSAN_R.py`
- [SSAN-M](https://github.com/wangzhuo2019/ssan/blob/main/networks/SSAN_M.py): `networks/SSAN_M.py`
- [AdaIN and GRL](https://github.com/wangzhuo2019/ssan/blob/main/networks/pub_mod.py): `networks/pub_mod.py`

### Learning and evaluation

- [Contrastive loss](https://github.com/wangzhuo2019/ssan/blob/main/loss/__init__.py): `loss/__init__.py`
- [Optimizer selection](https://github.com/wangzhuo2019/ssan/blob/main/optimizers/__init__.py): `optimizers/__init__.py`
- [Video scoring](https://github.com/wangzhuo2019/ssan/blob/main/solver.py): `solver.py`
- [FAS metrics](https://github.com/wangzhuo2019/ssan/blob/main/utils/performance.py): `utils/performance.py`

### Benchmark

- [Large-scale benchmark](https://github.com/wangzhuo2019/ssan/tree/main/Large_Scale_FAS_Benchmarks): `Large_Scale_FAS_Benchmarks`

### Other components

- **Researcher**

## Connections

- Researcher → Experiment settings: configures
- Researcher → Train and test: starts
- Experiment settings → Train and test: supplies settings
- Train and test → Protocol dataset bank: requests splits
- Protocol dataset bank → CASIA-family train loader: creates train set
- Protocol dataset bank → CASIA-family eval loader: creates eval set
- Protocol dataset bank → OULU train loader: creates train set
- Protocol dataset bank → OULU eval loader: creates eval set
- Protocol dataset bank → Face datasets: reads samples
- Train and test → Training transforms: selects transforms
- Train and test → Evaluation transforms: selects transforms
- Train and test → Model selection: builds model
- Model selection → SSAN-R: selects
- Model selection → SSAN-M: selects
- SSAN-R → AdaIN and GRL: uses
- SSAN-M → AdaIN and GRL: uses
- Train and test → Optimizer selection: creates optimizer
- Train and test → Contrastive loss: computes contrastive loss
- Train and test → Video scoring: runs test
- Video scoring → FAS metrics: computes metrics
- Researcher → Large-scale benchmark: uses benchmark protocol
