File size: 8,961 Bytes
f6b93e5
 
 
 
 
 
 
 
 
 
 
 
 
 
5bf6264
f6b93e5
 
c317455
 
f6b93e5
 
 
 
 
 
 
 
 
 
 
5bf6264
f6b93e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5bf6264
f6b93e5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
---
pipeline_tag: image-classification
library_name: pytorch
tags:
- fine-grained-image-recognition
- image-classification
- teacher-guided-data-augmentation
- timm
---

# TGDA: fine-grained image recognition from scratch with teacher-guided data augmentation

These are the checkpoints behind *Fine-Grained Image Recognition from Scratch with Teacher-Guided Data Augmentation* ([arXiv:2507.12157](https://arxiv.org/abs/2507.12157)). Students trained from scratch learn from a fine-grained teacher (a ResNet-101 trained with counterfactual attention learning, CAL), which also guides data-aware augmentation of the student's inputs. Code: [arkel23/TGDA](https://github.com/arkel23/TGDA).

250 checkpoints, one per configuration, each the last epoch of one training seed. Each file
is a `torch.save` dict with `config` (the full training configuration), `model` (the state dict),
`accuracy` and `epoch`, with no optimizer state. File names are the runs' experiment-log names,
ending in the serial. Load them with [fgir-zoo](https://github.com/arkel23/fgir-zoo). The
[collection](https://huggingface.co/collections/ERISLab/tgda-fgir-from-scratch-with-teacher-guided-augmentation-6ab32cd151f4fc1063b55f64) groups this repo with the paper.

## Layout

| Folder | Serials | What | Files |
|---|---|---|---|
| `sota_448` | 301-304 | Main state-of-the-art table: ResNet-18/34/50/101 students, TGDA with TrivialAugment, label smoothing and stochastic depth | 12 |
| `lrnet_128` | 201-204 | Main LRNet table: low-resolution students at 128 px from a 448 px teacher | 24 |
| `vitfs_448` | 100, 101 | Efficient ViTs and the ViTFS variants, teacher and student at 448 px | 54 |
| `vitfs_224_t448` | 102 | Teacher at 448 px, student at 224 px | 15 |
| `vitfs_224` | 103 | Teacher and student at 224 px | 9 |
| `vitfs_128` | 109 | ViTFS tiny/micro/nano students at 128 px from a 448 px teacher | 8 |
| `vit_ce_448` | 107 | The serial-101 models trained with cross-entropy only (no teacher) | 36 |
| `vitfs_transfer` | 104-106 | A TGDA-trained student transferred to two new datasets with cross-entropy | 8 |
| `ablations_128` | 212, 214, 221-223, 241-248, 251, 261-263, 271-278, 281 | Ablations: TGDA without extra regularization, one- vs two-stage training, augmentation type, teacher type, transfer | 73 |
| `scratch_vs_pt_448` | 320, 321, 331 | 200 epochs from scratch with cross-entropy or KD, and ImageNet-pretrained with KD | 9 |
| `sweeps_128` | 0, 1 | KD weight and temperature sweeps on CUB | 2 |

`manifest.csv` lists every file with its dataset, student, teacher, serial, seed, image size,
class count, accuracy, SHA-256 and size.

## Load a checkpoint and classify an image

```python
import torch
from PIL import Image
from torchvision import transforms
from fgir_zoo import tgda

model = tgda.create_model('sota_448/cub_resnet18_resnet101_cal_tgda_301')
cfg = model.config
tf = transforms.Compose([
    transforms.Resize((cfg.test_resize_size, cfg.test_resize_size),
                      interpolation=transforms.InterpolationMode.BICUBIC),
    transforms.CenterCrop(cfg.student_image_size or cfg.image_size),
    transforms.ToTensor(),
    transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),
])
# a CUB-200-2011 test image, class index 50 (051.Horned_Grebe)
x = tf(Image.open('Horned_Grebe_0050_34561.jpg').convert('RGB')).unsqueeze(0)
with torch.no_grad():
    logits = model(x)
print(logits.argmax(-1).item(), logits.softmax(-1).max().item())  # 50 0.9855
```

## Accuracy of the released checkpoints

Top-1 accuracy (%) stored in each file, on the dataset's test split at the end of training.
Each value is one seed; the paper reports its own aggregates, so its tables can differ slightly.

### `sota_448`

| Model | aircraft | cars | cub |
|---|---|---|---|
| `resnet101 <- resnet101` | 94.81 | 95.19 | 89.25 |
| `resnet18 <- resnet101` | 93.73 | 94.86 | 87.49 |
| `resnet34 <- resnet101` | 94.24 | 95.04 | 88.40 |
| `resnet50 <- resnet101` | 94.78 | 95.16 | 88.95 |

### `lrnet_128`

| Model | aircraft | cars | cub |
|---|---|---|---|
| `lrnet14 <- resnet101` | 89.02 | 92.74 | 80.48 |
| `lrnet18 <- resnet101` | 90.67 | 93.21 | 82.48 |
| `lrnet26 <- resnet101` | 91.30 | 93.57 | 82.65 |
| `lrnet50 <- resnet101` | 91.81 | 93.74 | 84.12 |
| `resnet101 <- resnet101` | 88.57 | 92.19 | 81.48 |
| `resnet18 <- resnet101` | 86.95 | 91.18 | 77.68 |
| `resnet34 <- resnet101` | 85.45 | 91.03 | 78.81 |
| `resnet50 <- resnet101` | 90.19 | 92.96 | 82.74 |

### `vitfs_448`

| Model | aircraft | cars | cub |
|---|---|---|---|
| `efficientvit_m2 <- resnet101` | 92.50 | 94.11 | 85.42 |
| `efficientvit_m3 <- resnet101` | 92.80 | 94.50 | 85.48 |
| `lcnet_035 <- resnet101` | 91.42 | 91.12 | 78.43 |
| `levit_128s <- resnet101` | 88.66 | 91.98 | 81.24 |
| `mobilevit_s <- resnet101` | 92.68 | 93.79 | 83.48 |
| `mobilevitv2_100 <- resnet101` | 94.36 | 94.57 | 87.59 |
| `mobilevitv2_125 <- resnet101` | 93.64 | 94.63 | 87.35 |
| `nest_tiny <- resnet101` | 89.89 | 93.25 | 85.48 |
| `pvt_v2_b0 <- resnet101` | 91.84 | 93.79 | 86.93 |
| `pvt_v2_b1 <- resnet101` | 92.53 | 94.29 | 86.85 |
| `swin_tiny_patch4_window7_224 <- resnet101` | 89.62 | 93.35 | 82.40 |
| `tiny_vit_5m_224 <- resnet101` | 93.37 | 94.43 | 88.45 |
| `vit_t16 <- resnet101` | 61.00 |  | 58.70 |
| `vitfs_tiny_patch16_clc_gap_reg4_dinov2_bn <- resnet101` | 90.58 | 94.01 | 85.47 |
| `vitfs_tiny_patch16_gap_224 <- resnet101` | 85.30 |  | 82.72 |
| `vitfs_tiny_patch16_gap_reg4_dinov2_bn_init <- resnet101` | 92.20 | 94.48 | 86.26 |
| `vitfs_tiny_patch16_gap_reg4_dinov2_init <- resnet101` | 89.32 | 93.07 | 83.72 |
| `vitfs_tiny_patch16_kvm_gap_reg4_dinov2_bn <- resnet101` |  | 94.25 | 83.91 |

### `vitfs_224_t448`

| Model | aircraft | cars | cub |
|---|---|---|---|
| `vit_t16 <- resnet101` | 55.06 | 51.29 | 49.48 |
| `vitfs_micro_patch16_gap_reg4_dinov2_bn <- resnet101` | 88.81 | 92.41 | 78.25 |
| `vitfs_nano_patch16_gap_reg4_dinov2_bn <- resnet101` | 85.06 | 90.44 | 70.88 |
| `vitfs_tiny_patch16_gap_reg4_dinov2_bn_init <- resnet101` | 90.49 | 93.91 | 81.20 |
| `vitfs_tiny_patch16_gap_reg4_dinov2_init <- resnet101` | 86.35 | 92.71 | 77.94 |

### `vitfs_224`

| Model | aircraft | cars | cub |
|---|---|---|---|
| `vitfs_tiny_patch16_gap_224 <- resnet101` | 52.63 | 86.16 | 75.61 |
| `vitfs_tiny_patch16_gap_reg4_dinov2_bn_init <- resnet101` | 60.13 | 92.64 | 79.89 |
| `vitfs_tiny_patch16_gap_reg4_dinov2_init <- resnet101` | 47.76 | 86.57 | 76.46 |

### `vitfs_128`

| Model | aircraft | cars | cub |
|---|---|---|---|
| `vitfs_micro_patch16_gap_reg4_dinov2_bn <- resnet101` | 79.21 | 88.45 | 66.40 |
| `vitfs_nano_patch16_gap_reg4_dinov2_bn <- resnet101` | 77.47 | 83.97 | 61.32 |
| `vitfs_tiny_patch16_gap_reg4_dinov2_bn_init <- resnet101` | 81.10 | 90.24 |  |

### `vit_ce_448`

| Model | aircraft | cars | cub |
|---|---|---|---|
| `efficientvit_m2` | 87.49 | 83.75 | 73.25 |
| `efficientvit_m3` | 87.46 | 80.19 | 72.82 |
| `levit_128s` | 82.27 | 87.07 | 69.59 |
| `mobilevit_s` | 88.36 | 91.20 | 72.01 |
| `mobilevitv2_100` | 89.11 | 90.57 | 78.60 |
| `mobilevitv2_125` | 87.85 | 90.34 | 81.50 |
| `nest_tiny` | 82.99 | 81.23 | 71.13 |
| `pvt_v2_b0` | 86.41 | 89.76 | 75.09 |
| `pvt_v2_b1` | 85.63 |  |  |
| `swin_tiny_patch4_window7_224` | 65.80 | 63.26 |  |
| `vit_t16` | 45.60 | 26.38 | 30.81 |
| `vitfs_tiny_patch16_gap_224` |  |  | 0.78 |
| `vitfs_tiny_patch16_gap_reg4_dinov2_bn_init` |  | 88.41 | 69.92 |
| `vitfs_tiny_patch16_gap_reg4_dinov2_init` | 76.84 | 81.35 | 60.30 |

### `vitfs_transfer`

| Model | aircraft | cars | cub |
|---|---|---|---|
| `vit_t16` | 50.23 | 39.12 |  |
| `vitfs_tiny_patch16_gap_reg4_dinov2_bn_init` | 87.19 | 90.70 | 82.52 |

### `ablations_128`

| Model | aircraft | cars | cub |
|---|---|---|---|
| `lrnet14` | 86.05 | 89.34 | 65.10 |
| `lrnet14 <- resnet101` | 85.30 | 93.06 | 81.79 |
| `resnet101d <- resnet101` | 88.18 | 92.54 |  |
| `resnet18` | 73.72 | 82.13 | 56.54 |
| `resnet18 <- resnet101` | 82.03 | 88.22 | 75.34 |
| `resnet34d <- resnet101` | 87.46 | 91.64 | 78.65 |

### `scratch_vs_pt_448`

| Model | aircraft | cars | cub |
|---|---|---|---|
| `resnet101` | 83.08 | 84.36 | 66.41 |
| `resnet101 <- resnet101` | 93.91 | 94.60 | 87.63 |

### `sweeps_128`

| Model | cub |
|---|---|
| `resnet18 <- resnet101` | 80.34 |

## Requirements

- `fgir-zoo` (`pip install git+https://github.com/arkel23/fgir-zoo.git`), which pins
  `timm==0.9.12`
- `torch` (checked with 2.5.1)

## Citation

```bibtex
@misc{rios_tgda_2025,
  title         = {Fine-Grained Image Recognition from Scratch with Teacher-Guided Data Augmentation},
  author        = {Rios, Edwin Arkel and Mikael, Fernando and Gosal, Oswin and Oyerinde, Femiloye and
                   Liang, Hao-Chun and Lai, Bo-Cheng and Hu, Min-Chun},
  year          = {2025},
  eprint        = {2507.12157},
  archivePrefix = {arXiv},
  primaryClass  = {cs.CV},
  doi           = {10.48550/arXiv.2507.12157},
  url           = {https://arxiv.org/abs/2507.12157}
}
```