File size: 3,915 Bytes
b8730cc
 
aeb9c44
b8730cc
aeb9c44
 
 
 
 
 
 
 
b8730cc
aeb9c44
b8730cc
aeb9c44
 
 
 
b8730cc
aeb9c44
 
b8730cc
aeb9c44
 
 
b8730cc
aeb9c44
 
b8730cc
aeb9c44
 
 
b8730cc
aeb9c44
b8730cc
aeb9c44
b8730cc
aeb9c44
 
 
 
 
 
 
 
 
 
b8730cc
aeb9c44
b8730cc
aeb9c44
 
 
 
b8730cc
aeb9c44
b8730cc
aeb9c44
 
 
 
 
 
b8730cc
 
aeb9c44
b8730cc
aeb9c44
b8730cc
aeb9c44
b8730cc
aeb9c44
 
 
b8730cc
aeb9c44
b8730cc
aeb9c44
 
 
 
 
 
 
 
 
 
 
b8730cc
aeb9c44
b8730cc
aeb9c44
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# Multimodal PC Fault Detection Using Audio-Visual Evidence Fusion

Two-branch architecture (ViT visual + AST audio) with late fusion for 5 PC fault classes.

## Fault Classes
| ID | Class | Audio Signal | Visual Signal |
|----|-------|-------------|---------------|
| 0 | `normal_operation` | Quiet fan hum | Clean desktop |
| 1 | `boot_failure` | BIOS beep codes | POST error screen |
| 2 | `overheating_fan` | Loud/grinding fan | Thermal warning UI |
| 3 | `storage_failure` | HDD clicking | SMART/CHKDSK errors |
| 4 | `system_crash` | Audio glitch/silence | BSOD |

## Quick Start

```bash
# Clone
git clone https://huggingface.co/Ellaft/multimodal-pc-fault-detector
cd multimodal-pc-fault-detector

# Install
pip install -r requirements.txt

# Train (downloads dataset automatically from Hub)
cd src
python train.py --quick_test --no_push

# Full training (15 epochs, ~1hr on A100)
python train.py --eval_robustness

# All 6 ablation experiments
python run_ablations.py --quick_test
```

## Dataset

**[Ellaft/pc-fault-real-dataset](https://huggingface.co/datasets/Ellaft/pc-fault-real-dataset)** β€” 1,500 audio-visual pairs, auto-downloaded when you run `train.py`.

| Source | Content |
|--------|---------|
| Real fan recordings | [HenriqueFrancaa/cooling-fans-db0](https://huggingface.co/datasets/HenriqueFrancaa/cooling-fans-db0) β€” normal vs abnormal PC cooling fans |
| Synthetic beep codes | 12 real AMI/Award/Phoenix BIOS beep patterns with timing jitter |
| Synthetic HDD clicks | Repetitive clicking, motor hum, head crash grinding |
| Synthetic crash audio | Noise bursts, buffer glitches, feedback loops, system hangs |
| Synthetic BSOD images | Windows 10/11/7/XP styles with real stop codes |
| Synthetic POST screens | BIOS vendor screens with real error messages |
| Synthetic thermal UIs | HWMonitor, BIOS warning, notification popup styles |
| Synthetic disk errors | SMART warnings, CHKDSK, CrystalDiskInfo displays |

To rebuild or extend the dataset (add YouTube scraping, etc.):
```bash
cd data
pip install -r requirements_data.txt
python build_dataset.py --max_per_class 500 --upload
```

## Architecture

```
Audio (WAV) ──→ AST (AudioSet) + LoRA ──→ [CLS] 768d ──→ audio_head ──→ L_audio
                                              β”‚
                                              β”œβ”€β”€β†’ concat ──→ fusion_classifier ──→ L_fusion
                                              β”‚
Visual (JPG) ─→ ViT-B/16 (IN-21k) + LoRA ─→ [CLS] 768d ──→ visual_head ──→ L_visual
```

**Loss** = L_fusion + 1.5 Γ— L_visual + 0.5 Γ— L_audio

## Anti-Modality-Collapse

Three techniques prevent the visual branch from being ignored:

1. **Auxiliary unimodal heads** β€” force each branch to independently classify
2. **OGM-GE** ([Peng et al., CVPR 2022](https://arxiv.org/abs/2203.15332)) β€” suppress dominant modality gradients at each step
3. **Asymmetric learning rates** β€” visual branch gets 3Γ— base LR, audio gets 0.5Γ—

## Files

```
src/
  config.py          β€” All hyperparameters
  models.py          β€” ViT + AST + LateFusion + OGM-GE + auxiliary heads
  dataset_v2.py      β€” Loads from Ellaft/pc-fault-real-dataset
  train.py           β€” Training loop with OGM-GE
  run_ablations.py   β€” 6-experiment ablation runner

data/
  build_dataset.py   β€” Dataset builder (YouTube + HF + synthetic)
```

## CLI Options

```bash
python train.py --mode multimodal      # default
python train.py --mode visual_only     # unimodal ablation
python train.py --mode audio_only      # unimodal ablation
python train.py --finetune full --lr 2e-5  # full fine-tuning
python train.py --no_ogm              # disable OGM-GE
python train.py --ogm_alpha 0.5       # more aggressive modulation
python train.py --lambda_visual 2.0   # stronger visual auxiliary loss
python train.py --visual_lr_mult 5.0  # 5Γ— LR for visual branch
```