Mattysmittttt commited on
Commit
ec97dbb
·
verified ·
1 Parent(s): d9a3efa

Initial CamoNet release

Browse files
README.md ADDED
@@ -0,0 +1,164 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ language:
4
+ - en
5
+ tags:
6
+ - image-classification
7
+ - vision
8
+ - camouflage
9
+ - military
10
+ - osint
11
+ - dinov2
12
+ pipeline_tag: image-classification
13
+ library_name: transformers
14
+ base_model: facebook/dinov2-small
15
+ ---
16
+
17
+ # CamoNet
18
+
19
+ A fine-grained military camouflage pattern classifier.
20
+
21
+ Given a photo of a uniform, vehicle, or fabric fragment, CamoNet predicts
22
+ which of **40 historical and contemporary military camouflage patterns** it
23
+ belongs to — along with country of origin, era, and visual family.
24
+
25
+ Built on a fine-tuned **DINOv2** backbone (`facebook/dinov2-small`), chosen
26
+ because its self-supervised ImageNet pre-training learns the kind of dense
27
+ texture features that camouflage classification depends on.
28
+
29
+ ## Quick start
30
+
31
+ ```python
32
+ from transformers import pipeline
33
+
34
+ clf = pipeline("image-classification", model="Mattysmittttt/camonet")
35
+ clf("path/to/uniform.jpg", top_k=3)
36
+ # [{'label': 'us_marpat_woodland', 'score': 0.91},
37
+ # {'label': 'ca_cadpat_tw', 'score': 0.04},
38
+ # {'label': 'us_aor2', 'score': 0.02}]
39
+ ```
40
+
41
+ For richer output (origin, era, family) use the bundled `taxonomy.py`:
42
+
43
+ ```python
44
+ from huggingface_hub import hf_hub_download
45
+ import importlib.util, sys
46
+
47
+ path = hf_hub_download("Mattysmittttt/camonet", "taxonomy.py")
48
+ spec = importlib.util.spec_from_file_location("camonet_tax", path)
49
+ tax = importlib.util.module_from_spec(spec); spec.loader.exec_module(tax)
50
+
51
+ print(tax.PATTERN_BY_ID["us_marpat_woodland"])
52
+ # Pattern(id='us_marpat_woodland', name='MARPAT Woodland',
53
+ # origin='USMC', era='2002-present', family='digital', notes=...)
54
+ ```
55
+
56
+ ## Pattern coverage (40 classes)
57
+
58
+ | Family | Count | Examples |
59
+ | ------------- | ----- | --------------------------------------------------------- |
60
+ | digital | 10 | MARPAT, CADPAT, UCP, EMR Digital Flora, Type 07, ROK Granite |
61
+ | blob | 8 | Flecktarn, AUSCAM, M90, TAZ 90, JGSDF, TTsKO, M75, Splittertarn |
62
+ | desert | 7 | Chocolate Chip, DCU 3-Color, AOR1, DPM Desert, Tropentarn |
63
+ | multi-terrain | 6 | MultiCam, OCP Scorpion W2, MTP, AMCU, Partizan, Kryptek Mandrake |
64
+ | woodland | 4 | M81 Woodland, ERDL, French CCE, Italian Vegetata |
65
+ | brushstroke | 4 | Tiger Stripe, DPM Woodland, KLMK, VSR-93 Flora |
66
+ | arid | 1 | A-TACS AU |
67
+
68
+ Full taxonomy with origin and era for each pattern lives in `taxonomy.py`.
69
+
70
+ ## Intended uses
71
+
72
+ - **OSINT & journalism** — assist analysts in identifying camouflage patterns
73
+ in conflict imagery, photographs, and footage.
74
+ - **Museum & archival cataloguing** — auto-tag uniform collections.
75
+ - **Milsurp & collector tooling** — identify unknown patterns from photographs.
76
+ - **Airsoft, milsim, reenactment** — kit verification.
77
+ - **Educational / reference** — interactive teaching tool for military history.
78
+
79
+ ## Limitations & out-of-scope use
80
+
81
+ - **Heavily worn, faded, or damaged fabric** drifts predictions toward visually
82
+ adjacent patterns. Treat low-confidence outputs as such.
83
+ - **Many real-world patterns share design DNA** (MARPAT ↔ AOR1/2 ↔ CADPAT).
84
+ A top-3 read is more honest than top-1 in those cases.
85
+ - **The model has not been trained on every pattern in existence** — it covers
86
+ ~40 of the most widely-issued. Out-of-distribution patterns will be forced
87
+ into the closest learned class.
88
+ - **Not a person/face/identity classifier.** It looks at fabric, not faces.
89
+ - **Not a substitute for expert authentication** of historical garments.
90
+
91
+ ## Training data
92
+
93
+ Composed from public web sources:
94
+ - eBay militaria listings (clean product photography, well-labeled)
95
+ - Reddit r/camo, r/Militariacollecting, r/milsurp (in-the-wild photos)
96
+ - Hand-curated reference plates per pattern
97
+
98
+ Actual scale used for this checkpoint: 3,080 labeled images across 40 patterns
99
+ (≈77 per pattern average; min 14, max 137), stratified 85/15 train/val
100
+ (2,635 train / 445 val).
101
+
102
+ The dataset is **not redistributed** — only the trained weights are. The
103
+ scrape pipeline is included in the source repo so the dataset is reproducible.
104
+
105
+ ## Training details
106
+
107
+ | Hyperparameter | Value |
108
+ | ---------------- | -------------------- |
109
+ | Backbone | `facebook/dinov2-small` (22M params) |
110
+ | Image size | 224×224 |
111
+ | Optimizer | AdamW |
112
+ | Learning rate | 5e-5, cosine, 10% warmup |
113
+ | Weight decay | 0.05 |
114
+ | Batch size | 32 |
115
+ | Epochs | 8 (best checkpoint by top-1) |
116
+ | Augmentation | resize+crop, hflip, ±10° rotation, light blur (no colour jitter — colour matters for camo) |
117
+ | Precision | fp32 (Apple Silicon MPS) |
118
+
119
+ ## Evaluation
120
+
121
+ Reported on the held-out 15% validation split (445 images, 40 classes):
122
+
123
+ | Metric | Score |
124
+ | ------- | ------ |
125
+ | Top-1 | 0.7371 |
126
+ | Top-3 | 0.8652 |
127
+
128
+ Per-class confusion analysis is in `eval/confusion.png` once you run
129
+ `scripts/evaluate.py`.
130
+
131
+ ## Bias, risks, ethical considerations
132
+
133
+ CamoNet identifies **fabric patterns**, not people, faces, vehicles as units,
134
+ or military formations. Its outputs are about textile design.
135
+
136
+ Camouflage classification is well-established public knowledge — pattern
137
+ catalogues like Camopedia have been freely available for over a decade, and
138
+ the patterns themselves are visible in countless public photographs, parades,
139
+ news coverage, and museum exhibits. The model does not provide capabilities
140
+ beyond what an attentive observer with reference material could already do.
141
+
142
+ That said, downstream use sits in the OSINT space, where claims based on a
143
+ single image carry real-world consequences. Users should:
144
+ - Treat predictions as **one signal among many**, not authoritative ID.
145
+ - Surface confidence scores, not just top-1 labels.
146
+ - Avoid using the model to make claims about individual identity, unit
147
+ attribution, or operational intent.
148
+
149
+ ## Citation
150
+
151
+ ```bibtex
152
+ @misc{camonet2026,
153
+ title = {CamoNet: Fine-Grained Military Camouflage Pattern Classification},
154
+ author = {Smith, Matt},
155
+ year = {2026},
156
+ url = {https://huggingface.co/Mattysmittttt/camonet}
157
+ }
158
+ ```
159
+
160
+ ## License
161
+
162
+ Apache-2.0 for the model weights and code.
163
+
164
+ Built on `facebook/dinov2-base` (Apache-2.0).
checkpoint-581/config.json ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "apply_layernorm": true,
3
+ "architectures": [
4
+ "Dinov2ForImageClassification"
5
+ ],
6
+ "attention_probs_dropout_prob": 0.0,
7
+ "drop_path_rate": 0.0,
8
+ "dtype": "float32",
9
+ "hidden_act": "gelu",
10
+ "hidden_dropout_prob": 0.0,
11
+ "hidden_size": 384,
12
+ "id2label": {
13
+ "0": "us_erdl",
14
+ "1": "us_m81_woodland",
15
+ "2": "us_dcu_chocolate_chip",
16
+ "3": "us_dcu_3color",
17
+ "4": "us_marpat_woodland",
18
+ "5": "us_marpat_desert",
19
+ "6": "us_ucp",
20
+ "7": "us_multicam",
21
+ "8": "us_ocp_scorpion",
22
+ "9": "us_aor1",
23
+ "10": "us_aor2",
24
+ "11": "us_tigerstripe",
25
+ "12": "uk_dpm_woodland",
26
+ "13": "uk_dpm_desert",
27
+ "14": "uk_mtp",
28
+ "15": "de_flecktarn",
29
+ "16": "de_tropentarn",
30
+ "17": "de_splittertarn",
31
+ "18": "ru_klmk",
32
+ "19": "ru_ttsko",
33
+ "20": "ru_vsr_93",
34
+ "21": "ru_emr_digital_flora",
35
+ "22": "ru_surpat",
36
+ "23": "ru_partizan",
37
+ "24": "ca_cadpat_tw",
38
+ "25": "ca_cadpat_ar",
39
+ "26": "fr_cce",
40
+ "27": "fr_daguet",
41
+ "28": "it_vegetata",
42
+ "29": "au_auscam",
43
+ "30": "au_amcu",
44
+ "31": "se_m90",
45
+ "32": "ch_taz_90",
46
+ "33": "no_m75",
47
+ "34": "cn_type07_universal",
48
+ "35": "cn_type07_desert",
49
+ "36": "kr_granite",
50
+ "37": "jp_jgsdf",
51
+ "38": "commercial_kryptek_mandrake",
52
+ "39": "commercial_atacs_au"
53
+ },
54
+ "image_size": 518,
55
+ "initializer_range": 0.02,
56
+ "label2id": {
57
+ "au_amcu": 30,
58
+ "au_auscam": 29,
59
+ "ca_cadpat_ar": 25,
60
+ "ca_cadpat_tw": 24,
61
+ "ch_taz_90": 32,
62
+ "cn_type07_desert": 35,
63
+ "cn_type07_universal": 34,
64
+ "commercial_atacs_au": 39,
65
+ "commercial_kryptek_mandrake": 38,
66
+ "de_flecktarn": 15,
67
+ "de_splittertarn": 17,
68
+ "de_tropentarn": 16,
69
+ "fr_cce": 26,
70
+ "fr_daguet": 27,
71
+ "it_vegetata": 28,
72
+ "jp_jgsdf": 37,
73
+ "kr_granite": 36,
74
+ "no_m75": 33,
75
+ "ru_emr_digital_flora": 21,
76
+ "ru_klmk": 18,
77
+ "ru_partizan": 23,
78
+ "ru_surpat": 22,
79
+ "ru_ttsko": 19,
80
+ "ru_vsr_93": 20,
81
+ "se_m90": 31,
82
+ "uk_dpm_desert": 13,
83
+ "uk_dpm_woodland": 12,
84
+ "uk_mtp": 14,
85
+ "us_aor1": 9,
86
+ "us_aor2": 10,
87
+ "us_dcu_3color": 3,
88
+ "us_dcu_chocolate_chip": 2,
89
+ "us_erdl": 0,
90
+ "us_m81_woodland": 1,
91
+ "us_marpat_desert": 5,
92
+ "us_marpat_woodland": 4,
93
+ "us_multicam": 7,
94
+ "us_ocp_scorpion": 8,
95
+ "us_tigerstripe": 11,
96
+ "us_ucp": 6
97
+ },
98
+ "layer_norm_eps": 1e-06,
99
+ "layerscale_value": 1.0,
100
+ "mlp_ratio": 4,
101
+ "model_type": "dinov2",
102
+ "num_attention_heads": 6,
103
+ "num_channels": 3,
104
+ "num_hidden_layers": 12,
105
+ "out_features": [
106
+ "stage12"
107
+ ],
108
+ "out_indices": [
109
+ 12
110
+ ],
111
+ "patch_size": 14,
112
+ "problem_type": "single_label_classification",
113
+ "qkv_bias": true,
114
+ "reshape_hidden_states": true,
115
+ "stage_names": [
116
+ "stem",
117
+ "stage1",
118
+ "stage2",
119
+ "stage3",
120
+ "stage4",
121
+ "stage5",
122
+ "stage6",
123
+ "stage7",
124
+ "stage8",
125
+ "stage9",
126
+ "stage10",
127
+ "stage11",
128
+ "stage12"
129
+ ],
130
+ "transformers_version": "5.7.0",
131
+ "use_cache": false,
132
+ "use_mask_token": true,
133
+ "use_swiglu_ffn": false
134
+ }
checkpoint-581/model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e70c3561255a6355fb8b3f2bf9f1908dc6f0ffe450a79fc7d9de81ef48dcbd05
3
+ size 88374736
checkpoint-581/optimizer.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6c530284e3d9d25bc8c2a0cdb085de1f36b99f3bc1de3f53881f0e6bd631ec2a
3
+ size 176876939
checkpoint-581/rng_state.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f13fa096c82c4698939c19f78b0766bd5c2a2142c49acdf650aabfa34b99d7f1
3
+ size 14455
checkpoint-581/scheduler.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2b31335693ae80680c90999bc6cfab87b4543a49278f1c79cd67beaba0cc4cd1
3
+ size 1465
checkpoint-581/trainer_state.json ADDED
@@ -0,0 +1,307 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "best_global_step": 581,
3
+ "best_metric": 0.7325842696629213,
4
+ "best_model_checkpoint": "checkpoints/camonet/checkpoint-581",
5
+ "epoch": 7.0,
6
+ "eval_steps": 500,
7
+ "global_step": 581,
8
+ "is_hyper_param_search": false,
9
+ "is_local_process_zero": true,
10
+ "is_world_process_zero": true,
11
+ "log_history": [
12
+ {
13
+ "epoch": 0.24096385542168675,
14
+ "grad_norm": 111.35398864746094,
15
+ "learning_rate": 1.417910447761194e-05,
16
+ "loss": 4.043815612792969,
17
+ "step": 20
18
+ },
19
+ {
20
+ "epoch": 0.4819277108433735,
21
+ "grad_norm": 71.05435943603516,
22
+ "learning_rate": 2.91044776119403e-05,
23
+ "loss": 3.5163707733154297,
24
+ "step": 40
25
+ },
26
+ {
27
+ "epoch": 0.7228915662650602,
28
+ "grad_norm": 60.80617141723633,
29
+ "learning_rate": 4.402985074626866e-05,
30
+ "loss": 3.0165132522583007,
31
+ "step": 60
32
+ },
33
+ {
34
+ "epoch": 0.963855421686747,
35
+ "grad_norm": 64.55865478515625,
36
+ "learning_rate": 4.9950171333287335e-05,
37
+ "loss": 2.4458030700683593,
38
+ "step": 80
39
+ },
40
+ {
41
+ "epoch": 1.0,
42
+ "eval_loss": 2.536519765853882,
43
+ "eval_runtime": 6.8652,
44
+ "eval_samples_per_second": 64.82,
45
+ "eval_steps_per_second": 2.039,
46
+ "eval_top1": 0.3325842696629214,
47
+ "eval_top3": 0.5438202247191011,
48
+ "step": 83
49
+ },
50
+ {
51
+ "epoch": 1.2048192771084336,
52
+ "grad_norm": 60.52080535888672,
53
+ "learning_rate": 4.964638184169378e-05,
54
+ "loss": 2.153371238708496,
55
+ "step": 100
56
+ },
57
+ {
58
+ "epoch": 1.4457831325301205,
59
+ "grad_norm": 70.68125915527344,
60
+ "learning_rate": 4.906984324751821e-05,
61
+ "loss": 1.828770637512207,
62
+ "step": 120
63
+ },
64
+ {
65
+ "epoch": 1.6867469879518073,
66
+ "grad_norm": 60.982425689697266,
67
+ "learning_rate": 4.822693581319326e-05,
68
+ "loss": 1.7083017349243164,
69
+ "step": 140
70
+ },
71
+ {
72
+ "epoch": 1.927710843373494,
73
+ "grad_norm": 58.39655303955078,
74
+ "learning_rate": 4.712698757103414e-05,
75
+ "loss": 1.712203025817871,
76
+ "step": 160
77
+ },
78
+ {
79
+ "epoch": 2.0,
80
+ "eval_loss": 1.7305916547775269,
81
+ "eval_runtime": 7.5482,
82
+ "eval_samples_per_second": 58.954,
83
+ "eval_steps_per_second": 1.855,
84
+ "eval_top1": 0.5415730337078651,
85
+ "eval_top3": 0.7146067415730337,
86
+ "step": 166
87
+ },
88
+ {
89
+ "epoch": 2.1686746987951806,
90
+ "grad_norm": 60.08979415893555,
91
+ "learning_rate": 4.5782171094600005e-05,
92
+ "loss": 1.3887232780456542,
93
+ "step": 180
94
+ },
95
+ {
96
+ "epoch": 2.4096385542168672,
97
+ "grad_norm": 64.29576873779297,
98
+ "learning_rate": 4.420736879094927e-05,
99
+ "loss": 1.3437091827392578,
100
+ "step": 200
101
+ },
102
+ {
103
+ "epoch": 2.6506024096385543,
104
+ "grad_norm": 62.950355529785156,
105
+ "learning_rate": 4.242000820453141e-05,
106
+ "loss": 1.139847469329834,
107
+ "step": 220
108
+ },
109
+ {
110
+ "epoch": 2.891566265060241,
111
+ "grad_norm": 43.11043167114258,
112
+ "learning_rate": 4.043986915532434e-05,
113
+ "loss": 1.2316542625427247,
114
+ "step": 240
115
+ },
116
+ {
117
+ "epoch": 3.0,
118
+ "eval_loss": 1.4789479970932007,
119
+ "eval_runtime": 7.5421,
120
+ "eval_samples_per_second": 59.002,
121
+ "eval_steps_per_second": 1.856,
122
+ "eval_top1": 0.6269662921348315,
123
+ "eval_top3": 0.7842696629213484,
124
+ "step": 249
125
+ },
126
+ {
127
+ "epoch": 3.1325301204819276,
128
+ "grad_norm": 66.58777618408203,
129
+ "learning_rate": 3.828886484552254e-05,
130
+ "loss": 1.033012580871582,
131
+ "step": 260
132
+ },
133
+ {
134
+ "epoch": 3.3734939759036147,
135
+ "grad_norm": 53.87052536010742,
136
+ "learning_rate": 3.5990799357157864e-05,
137
+ "loss": 0.8578171730041504,
138
+ "step": 280
139
+ },
140
+ {
141
+ "epoch": 3.6144578313253013,
142
+ "grad_norm": 72.20587921142578,
143
+ "learning_rate": 3.357110422430506e-05,
144
+ "loss": 0.8009697914123535,
145
+ "step": 300
146
+ },
147
+ {
148
+ "epoch": 3.855421686746988,
149
+ "grad_norm": 47.637420654296875,
150
+ "learning_rate": 3.105655699509458e-05,
151
+ "loss": 0.8424944877624512,
152
+ "step": 320
153
+ },
154
+ {
155
+ "epoch": 4.0,
156
+ "eval_loss": 1.3673882484436035,
157
+ "eval_runtime": 8.6387,
158
+ "eval_samples_per_second": 51.512,
159
+ "eval_steps_per_second": 1.621,
160
+ "eval_top1": 0.6202247191011236,
161
+ "eval_top3": 0.8112359550561797,
162
+ "step": 332
163
+ },
164
+ {
165
+ "epoch": 4.096385542168675,
166
+ "grad_norm": 44.70951461791992,
167
+ "learning_rate": 2.8474984898065406e-05,
168
+ "loss": 0.7181183815002441,
169
+ "step": 340
170
+ },
171
+ {
172
+ "epoch": 4.337349397590361,
173
+ "grad_norm": 40.632354736328125,
174
+ "learning_rate": 2.5854956892233006e-05,
175
+ "loss": 0.6570661544799805,
176
+ "step": 360
177
+ },
178
+ {
179
+ "epoch": 4.578313253012048,
180
+ "grad_norm": 41.45029067993164,
181
+ "learning_rate": 2.32254675087996e-05,
182
+ "loss": 0.5137750148773194,
183
+ "step": 380
184
+ },
185
+ {
186
+ "epoch": 4.8192771084337345,
187
+ "grad_norm": 53.68215560913086,
188
+ "learning_rate": 2.061561598327112e-05,
189
+ "loss": 0.5405148029327392,
190
+ "step": 400
191
+ },
192
+ {
193
+ "epoch": 5.0,
194
+ "eval_loss": 1.1706817150115967,
195
+ "eval_runtime": 8.8354,
196
+ "eval_samples_per_second": 50.365,
197
+ "eval_steps_per_second": 1.585,
198
+ "eval_top1": 0.6831460674157304,
199
+ "eval_top3": 0.849438202247191,
200
+ "step": 415
201
+ },
202
+ {
203
+ "epoch": 5.0602409638554215,
204
+ "grad_norm": 75.12175750732422,
205
+ "learning_rate": 1.8054284228864366e-05,
206
+ "loss": 0.49901180267333983,
207
+ "step": 420
208
+ },
209
+ {
210
+ "epoch": 5.301204819277109,
211
+ "grad_norm": 18.631591796875,
212
+ "learning_rate": 1.55698172149106e-05,
213
+ "loss": 0.29165282249450686,
214
+ "step": 440
215
+ },
216
+ {
217
+ "epoch": 5.542168674698795,
218
+ "grad_norm": 10.731932640075684,
219
+ "learning_rate": 1.3189709287346813e-05,
220
+ "loss": 0.3043174982070923,
221
+ "step": 460
222
+ },
223
+ {
224
+ "epoch": 5.783132530120482,
225
+ "grad_norm": 47.11884689331055,
226
+ "learning_rate": 1.0940299902627938e-05,
227
+ "loss": 0.41364297866821287,
228
+ "step": 480
229
+ },
230
+ {
231
+ "epoch": 6.0,
232
+ "eval_loss": 1.1097288131713867,
233
+ "eval_runtime": 8.2234,
234
+ "eval_samples_per_second": 54.114,
235
+ "eval_steps_per_second": 1.702,
236
+ "eval_top1": 0.7258426966292135,
237
+ "eval_top3": 0.8674157303370786,
238
+ "step": 498
239
+ },
240
+ {
241
+ "epoch": 6.024096385542169,
242
+ "grad_norm": 20.367740631103516,
243
+ "learning_rate": 8.846482142219752e-06,
244
+ "loss": 0.34232077598571775,
245
+ "step": 500
246
+ },
247
+ {
248
+ "epoch": 6.265060240963855,
249
+ "grad_norm": 29.076051712036133,
250
+ "learning_rate": 6.931427233395696e-06,
251
+ "loss": 0.18118011951446533,
252
+ "step": 520
253
+ },
254
+ {
255
+ "epoch": 6.506024096385542,
256
+ "grad_norm": 21.859106063842773,
257
+ "learning_rate": 5.21632812492738e-06,
258
+ "loss": 0.204935622215271,
259
+ "step": 540
260
+ },
261
+ {
262
+ "epoch": 6.746987951807229,
263
+ "grad_norm": 24.722841262817383,
264
+ "learning_rate": 3.7201649553876366e-06,
265
+ "loss": 0.21130716800689697,
266
+ "step": 560
267
+ },
268
+ {
269
+ "epoch": 6.9879518072289155,
270
+ "grad_norm": 27.248981475830078,
271
+ "learning_rate": 2.4594950095101513e-06,
272
+ "loss": 0.2202404260635376,
273
+ "step": 580
274
+ },
275
+ {
276
+ "epoch": 7.0,
277
+ "eval_loss": 1.105672001838684,
278
+ "eval_runtime": 8.1718,
279
+ "eval_samples_per_second": 54.455,
280
+ "eval_steps_per_second": 1.713,
281
+ "eval_top1": 0.7325842696629213,
282
+ "eval_top3": 0.8741573033707866,
283
+ "step": 581
284
+ }
285
+ ],
286
+ "logging_steps": 20,
287
+ "max_steps": 664,
288
+ "num_input_tokens_seen": 0,
289
+ "num_train_epochs": 8,
290
+ "save_steps": 500,
291
+ "stateful_callbacks": {
292
+ "TrainerControl": {
293
+ "args": {
294
+ "should_epoch_stop": false,
295
+ "should_evaluate": false,
296
+ "should_log": false,
297
+ "should_save": true,
298
+ "should_training_stop": false
299
+ },
300
+ "attributes": {}
301
+ }
302
+ },
303
+ "total_flos": 4.8058967165239296e+17,
304
+ "train_batch_size": 32,
305
+ "trial_name": null,
306
+ "trial_params": null
307
+ }
checkpoint-581/training_args.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6afabf8f636fefd143058269d2e6c5383477744d5a9e8c2dc666c57c59670119
3
+ size 5265
checkpoint-664/config.json ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "apply_layernorm": true,
3
+ "architectures": [
4
+ "Dinov2ForImageClassification"
5
+ ],
6
+ "attention_probs_dropout_prob": 0.0,
7
+ "drop_path_rate": 0.0,
8
+ "dtype": "float32",
9
+ "hidden_act": "gelu",
10
+ "hidden_dropout_prob": 0.0,
11
+ "hidden_size": 384,
12
+ "id2label": {
13
+ "0": "us_erdl",
14
+ "1": "us_m81_woodland",
15
+ "2": "us_dcu_chocolate_chip",
16
+ "3": "us_dcu_3color",
17
+ "4": "us_marpat_woodland",
18
+ "5": "us_marpat_desert",
19
+ "6": "us_ucp",
20
+ "7": "us_multicam",
21
+ "8": "us_ocp_scorpion",
22
+ "9": "us_aor1",
23
+ "10": "us_aor2",
24
+ "11": "us_tigerstripe",
25
+ "12": "uk_dpm_woodland",
26
+ "13": "uk_dpm_desert",
27
+ "14": "uk_mtp",
28
+ "15": "de_flecktarn",
29
+ "16": "de_tropentarn",
30
+ "17": "de_splittertarn",
31
+ "18": "ru_klmk",
32
+ "19": "ru_ttsko",
33
+ "20": "ru_vsr_93",
34
+ "21": "ru_emr_digital_flora",
35
+ "22": "ru_surpat",
36
+ "23": "ru_partizan",
37
+ "24": "ca_cadpat_tw",
38
+ "25": "ca_cadpat_ar",
39
+ "26": "fr_cce",
40
+ "27": "fr_daguet",
41
+ "28": "it_vegetata",
42
+ "29": "au_auscam",
43
+ "30": "au_amcu",
44
+ "31": "se_m90",
45
+ "32": "ch_taz_90",
46
+ "33": "no_m75",
47
+ "34": "cn_type07_universal",
48
+ "35": "cn_type07_desert",
49
+ "36": "kr_granite",
50
+ "37": "jp_jgsdf",
51
+ "38": "commercial_kryptek_mandrake",
52
+ "39": "commercial_atacs_au"
53
+ },
54
+ "image_size": 518,
55
+ "initializer_range": 0.02,
56
+ "label2id": {
57
+ "au_amcu": 30,
58
+ "au_auscam": 29,
59
+ "ca_cadpat_ar": 25,
60
+ "ca_cadpat_tw": 24,
61
+ "ch_taz_90": 32,
62
+ "cn_type07_desert": 35,
63
+ "cn_type07_universal": 34,
64
+ "commercial_atacs_au": 39,
65
+ "commercial_kryptek_mandrake": 38,
66
+ "de_flecktarn": 15,
67
+ "de_splittertarn": 17,
68
+ "de_tropentarn": 16,
69
+ "fr_cce": 26,
70
+ "fr_daguet": 27,
71
+ "it_vegetata": 28,
72
+ "jp_jgsdf": 37,
73
+ "kr_granite": 36,
74
+ "no_m75": 33,
75
+ "ru_emr_digital_flora": 21,
76
+ "ru_klmk": 18,
77
+ "ru_partizan": 23,
78
+ "ru_surpat": 22,
79
+ "ru_ttsko": 19,
80
+ "ru_vsr_93": 20,
81
+ "se_m90": 31,
82
+ "uk_dpm_desert": 13,
83
+ "uk_dpm_woodland": 12,
84
+ "uk_mtp": 14,
85
+ "us_aor1": 9,
86
+ "us_aor2": 10,
87
+ "us_dcu_3color": 3,
88
+ "us_dcu_chocolate_chip": 2,
89
+ "us_erdl": 0,
90
+ "us_m81_woodland": 1,
91
+ "us_marpat_desert": 5,
92
+ "us_marpat_woodland": 4,
93
+ "us_multicam": 7,
94
+ "us_ocp_scorpion": 8,
95
+ "us_tigerstripe": 11,
96
+ "us_ucp": 6
97
+ },
98
+ "layer_norm_eps": 1e-06,
99
+ "layerscale_value": 1.0,
100
+ "mlp_ratio": 4,
101
+ "model_type": "dinov2",
102
+ "num_attention_heads": 6,
103
+ "num_channels": 3,
104
+ "num_hidden_layers": 12,
105
+ "out_features": [
106
+ "stage12"
107
+ ],
108
+ "out_indices": [
109
+ 12
110
+ ],
111
+ "patch_size": 14,
112
+ "problem_type": "single_label_classification",
113
+ "qkv_bias": true,
114
+ "reshape_hidden_states": true,
115
+ "stage_names": [
116
+ "stem",
117
+ "stage1",
118
+ "stage2",
119
+ "stage3",
120
+ "stage4",
121
+ "stage5",
122
+ "stage6",
123
+ "stage7",
124
+ "stage8",
125
+ "stage9",
126
+ "stage10",
127
+ "stage11",
128
+ "stage12"
129
+ ],
130
+ "transformers_version": "5.7.0",
131
+ "use_cache": false,
132
+ "use_mask_token": true,
133
+ "use_swiglu_ffn": false
134
+ }
checkpoint-664/model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f031d15334bc1698fb596012bd81714f63fd681fd59d5449676adf48a646df9c
3
+ size 88374736
checkpoint-664/optimizer.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d99fa38e87af5a5e19017039c16471f4028218b821accf34340609cfffa0cf3d
3
+ size 176876939
checkpoint-664/rng_state.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b46fdb450f07235e10b0a3cbfc22c5b992fc3bc85e2c60f4f801ecd647891c56
3
+ size 14455
checkpoint-664/scheduler.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8c0cbb77a8e8b419fe10a81523c74c9579f72bbd02dec4c9d361e0562468c717
3
+ size 1465
checkpoint-664/trainer_state.json ADDED
@@ -0,0 +1,345 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "best_global_step": 664,
3
+ "best_metric": 0.7370786516853932,
4
+ "best_model_checkpoint": "checkpoints/camonet/checkpoint-664",
5
+ "epoch": 8.0,
6
+ "eval_steps": 500,
7
+ "global_step": 664,
8
+ "is_hyper_param_search": false,
9
+ "is_local_process_zero": true,
10
+ "is_world_process_zero": true,
11
+ "log_history": [
12
+ {
13
+ "epoch": 0.24096385542168675,
14
+ "grad_norm": 111.35398864746094,
15
+ "learning_rate": 1.417910447761194e-05,
16
+ "loss": 4.043815612792969,
17
+ "step": 20
18
+ },
19
+ {
20
+ "epoch": 0.4819277108433735,
21
+ "grad_norm": 71.05435943603516,
22
+ "learning_rate": 2.91044776119403e-05,
23
+ "loss": 3.5163707733154297,
24
+ "step": 40
25
+ },
26
+ {
27
+ "epoch": 0.7228915662650602,
28
+ "grad_norm": 60.80617141723633,
29
+ "learning_rate": 4.402985074626866e-05,
30
+ "loss": 3.0165132522583007,
31
+ "step": 60
32
+ },
33
+ {
34
+ "epoch": 0.963855421686747,
35
+ "grad_norm": 64.55865478515625,
36
+ "learning_rate": 4.9950171333287335e-05,
37
+ "loss": 2.4458030700683593,
38
+ "step": 80
39
+ },
40
+ {
41
+ "epoch": 1.0,
42
+ "eval_loss": 2.536519765853882,
43
+ "eval_runtime": 6.8652,
44
+ "eval_samples_per_second": 64.82,
45
+ "eval_steps_per_second": 2.039,
46
+ "eval_top1": 0.3325842696629214,
47
+ "eval_top3": 0.5438202247191011,
48
+ "step": 83
49
+ },
50
+ {
51
+ "epoch": 1.2048192771084336,
52
+ "grad_norm": 60.52080535888672,
53
+ "learning_rate": 4.964638184169378e-05,
54
+ "loss": 2.153371238708496,
55
+ "step": 100
56
+ },
57
+ {
58
+ "epoch": 1.4457831325301205,
59
+ "grad_norm": 70.68125915527344,
60
+ "learning_rate": 4.906984324751821e-05,
61
+ "loss": 1.828770637512207,
62
+ "step": 120
63
+ },
64
+ {
65
+ "epoch": 1.6867469879518073,
66
+ "grad_norm": 60.982425689697266,
67
+ "learning_rate": 4.822693581319326e-05,
68
+ "loss": 1.7083017349243164,
69
+ "step": 140
70
+ },
71
+ {
72
+ "epoch": 1.927710843373494,
73
+ "grad_norm": 58.39655303955078,
74
+ "learning_rate": 4.712698757103414e-05,
75
+ "loss": 1.712203025817871,
76
+ "step": 160
77
+ },
78
+ {
79
+ "epoch": 2.0,
80
+ "eval_loss": 1.7305916547775269,
81
+ "eval_runtime": 7.5482,
82
+ "eval_samples_per_second": 58.954,
83
+ "eval_steps_per_second": 1.855,
84
+ "eval_top1": 0.5415730337078651,
85
+ "eval_top3": 0.7146067415730337,
86
+ "step": 166
87
+ },
88
+ {
89
+ "epoch": 2.1686746987951806,
90
+ "grad_norm": 60.08979415893555,
91
+ "learning_rate": 4.5782171094600005e-05,
92
+ "loss": 1.3887232780456542,
93
+ "step": 180
94
+ },
95
+ {
96
+ "epoch": 2.4096385542168672,
97
+ "grad_norm": 64.29576873779297,
98
+ "learning_rate": 4.420736879094927e-05,
99
+ "loss": 1.3437091827392578,
100
+ "step": 200
101
+ },
102
+ {
103
+ "epoch": 2.6506024096385543,
104
+ "grad_norm": 62.950355529785156,
105
+ "learning_rate": 4.242000820453141e-05,
106
+ "loss": 1.139847469329834,
107
+ "step": 220
108
+ },
109
+ {
110
+ "epoch": 2.891566265060241,
111
+ "grad_norm": 43.11043167114258,
112
+ "learning_rate": 4.043986915532434e-05,
113
+ "loss": 1.2316542625427247,
114
+ "step": 240
115
+ },
116
+ {
117
+ "epoch": 3.0,
118
+ "eval_loss": 1.4789479970932007,
119
+ "eval_runtime": 7.5421,
120
+ "eval_samples_per_second": 59.002,
121
+ "eval_steps_per_second": 1.856,
122
+ "eval_top1": 0.6269662921348315,
123
+ "eval_top3": 0.7842696629213484,
124
+ "step": 249
125
+ },
126
+ {
127
+ "epoch": 3.1325301204819276,
128
+ "grad_norm": 66.58777618408203,
129
+ "learning_rate": 3.828886484552254e-05,
130
+ "loss": 1.033012580871582,
131
+ "step": 260
132
+ },
133
+ {
134
+ "epoch": 3.3734939759036147,
135
+ "grad_norm": 53.87052536010742,
136
+ "learning_rate": 3.5990799357157864e-05,
137
+ "loss": 0.8578171730041504,
138
+ "step": 280
139
+ },
140
+ {
141
+ "epoch": 3.6144578313253013,
142
+ "grad_norm": 72.20587921142578,
143
+ "learning_rate": 3.357110422430506e-05,
144
+ "loss": 0.8009697914123535,
145
+ "step": 300
146
+ },
147
+ {
148
+ "epoch": 3.855421686746988,
149
+ "grad_norm": 47.637420654296875,
150
+ "learning_rate": 3.105655699509458e-05,
151
+ "loss": 0.8424944877624512,
152
+ "step": 320
153
+ },
154
+ {
155
+ "epoch": 4.0,
156
+ "eval_loss": 1.3673882484436035,
157
+ "eval_runtime": 8.6387,
158
+ "eval_samples_per_second": 51.512,
159
+ "eval_steps_per_second": 1.621,
160
+ "eval_top1": 0.6202247191011236,
161
+ "eval_top3": 0.8112359550561797,
162
+ "step": 332
163
+ },
164
+ {
165
+ "epoch": 4.096385542168675,
166
+ "grad_norm": 44.70951461791992,
167
+ "learning_rate": 2.8474984898065406e-05,
168
+ "loss": 0.7181183815002441,
169
+ "step": 340
170
+ },
171
+ {
172
+ "epoch": 4.337349397590361,
173
+ "grad_norm": 40.632354736328125,
174
+ "learning_rate": 2.5854956892233006e-05,
175
+ "loss": 0.6570661544799805,
176
+ "step": 360
177
+ },
178
+ {
179
+ "epoch": 4.578313253012048,
180
+ "grad_norm": 41.45029067993164,
181
+ "learning_rate": 2.32254675087996e-05,
182
+ "loss": 0.5137750148773194,
183
+ "step": 380
184
+ },
185
+ {
186
+ "epoch": 4.8192771084337345,
187
+ "grad_norm": 53.68215560913086,
188
+ "learning_rate": 2.061561598327112e-05,
189
+ "loss": 0.5405148029327392,
190
+ "step": 400
191
+ },
192
+ {
193
+ "epoch": 5.0,
194
+ "eval_loss": 1.1706817150115967,
195
+ "eval_runtime": 8.8354,
196
+ "eval_samples_per_second": 50.365,
197
+ "eval_steps_per_second": 1.585,
198
+ "eval_top1": 0.6831460674157304,
199
+ "eval_top3": 0.849438202247191,
200
+ "step": 415
201
+ },
202
+ {
203
+ "epoch": 5.0602409638554215,
204
+ "grad_norm": 75.12175750732422,
205
+ "learning_rate": 1.8054284228864366e-05,
206
+ "loss": 0.49901180267333983,
207
+ "step": 420
208
+ },
209
+ {
210
+ "epoch": 5.301204819277109,
211
+ "grad_norm": 18.631591796875,
212
+ "learning_rate": 1.55698172149106e-05,
213
+ "loss": 0.29165282249450686,
214
+ "step": 440
215
+ },
216
+ {
217
+ "epoch": 5.542168674698795,
218
+ "grad_norm": 10.731932640075684,
219
+ "learning_rate": 1.3189709287346813e-05,
220
+ "loss": 0.3043174982070923,
221
+ "step": 460
222
+ },
223
+ {
224
+ "epoch": 5.783132530120482,
225
+ "grad_norm": 47.11884689331055,
226
+ "learning_rate": 1.0940299902627938e-05,
227
+ "loss": 0.41364297866821287,
228
+ "step": 480
229
+ },
230
+ {
231
+ "epoch": 6.0,
232
+ "eval_loss": 1.1097288131713867,
233
+ "eval_runtime": 8.2234,
234
+ "eval_samples_per_second": 54.114,
235
+ "eval_steps_per_second": 1.702,
236
+ "eval_top1": 0.7258426966292135,
237
+ "eval_top3": 0.8674157303370786,
238
+ "step": 498
239
+ },
240
+ {
241
+ "epoch": 6.024096385542169,
242
+ "grad_norm": 20.367740631103516,
243
+ "learning_rate": 8.846482142219752e-06,
244
+ "loss": 0.34232077598571775,
245
+ "step": 500
246
+ },
247
+ {
248
+ "epoch": 6.265060240963855,
249
+ "grad_norm": 29.076051712036133,
250
+ "learning_rate": 6.931427233395696e-06,
251
+ "loss": 0.18118011951446533,
252
+ "step": 520
253
+ },
254
+ {
255
+ "epoch": 6.506024096385542,
256
+ "grad_norm": 21.859106063842773,
257
+ "learning_rate": 5.21632812492738e-06,
258
+ "loss": 0.204935622215271,
259
+ "step": 540
260
+ },
261
+ {
262
+ "epoch": 6.746987951807229,
263
+ "grad_norm": 24.722841262817383,
264
+ "learning_rate": 3.7201649553876366e-06,
265
+ "loss": 0.21130716800689697,
266
+ "step": 560
267
+ },
268
+ {
269
+ "epoch": 6.9879518072289155,
270
+ "grad_norm": 27.248981475830078,
271
+ "learning_rate": 2.4594950095101513e-06,
272
+ "loss": 0.2202404260635376,
273
+ "step": 580
274
+ },
275
+ {
276
+ "epoch": 7.0,
277
+ "eval_loss": 1.105672001838684,
278
+ "eval_runtime": 8.1718,
279
+ "eval_samples_per_second": 54.455,
280
+ "eval_steps_per_second": 1.713,
281
+ "eval_top1": 0.7325842696629213,
282
+ "eval_top3": 0.8741573033707866,
283
+ "step": 581
284
+ },
285
+ {
286
+ "epoch": 7.228915662650603,
287
+ "grad_norm": 4.657148838043213,
288
+ "learning_rate": 1.4482694870531195e-06,
289
+ "loss": 0.11784229278564454,
290
+ "step": 600
291
+ },
292
+ {
293
+ "epoch": 7.469879518072289,
294
+ "grad_norm": 33.46561813354492,
295
+ "learning_rate": 6.976791118935761e-07,
296
+ "loss": 0.11900093555450439,
297
+ "step": 620
298
+ },
299
+ {
300
+ "epoch": 7.710843373493976,
301
+ "grad_norm": 28.289289474487305,
302
+ "learning_rate": 2.1603028991885321e-07,
303
+ "loss": 0.15290510654449463,
304
+ "step": 640
305
+ },
306
+ {
307
+ "epoch": 7.951807228915663,
308
+ "grad_norm": 22.30632972717285,
309
+ "learning_rate": 8.653186213511411e-09,
310
+ "loss": 0.14717140197753906,
311
+ "step": 660
312
+ },
313
+ {
314
+ "epoch": 8.0,
315
+ "eval_loss": 1.0861974954605103,
316
+ "eval_runtime": 27.6175,
317
+ "eval_samples_per_second": 16.113,
318
+ "eval_steps_per_second": 0.507,
319
+ "eval_top1": 0.7370786516853932,
320
+ "eval_top3": 0.8651685393258427,
321
+ "step": 664
322
+ }
323
+ ],
324
+ "logging_steps": 20,
325
+ "max_steps": 664,
326
+ "num_input_tokens_seen": 0,
327
+ "num_train_epochs": 8,
328
+ "save_steps": 500,
329
+ "stateful_callbacks": {
330
+ "TrainerControl": {
331
+ "args": {
332
+ "should_epoch_stop": false,
333
+ "should_evaluate": false,
334
+ "should_log": false,
335
+ "should_save": true,
336
+ "should_training_stop": true
337
+ },
338
+ "attributes": {}
339
+ }
340
+ },
341
+ "total_flos": 5.4924533903130624e+17,
342
+ "train_batch_size": 32,
343
+ "trial_name": null,
344
+ "trial_params": null
345
+ }
checkpoint-664/training_args.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6afabf8f636fefd143058269d2e6c5383477744d5a9e8c2dc666c57c59670119
3
+ size 5265
config.json ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "apply_layernorm": true,
3
+ "architectures": [
4
+ "Dinov2ForImageClassification"
5
+ ],
6
+ "attention_probs_dropout_prob": 0.0,
7
+ "drop_path_rate": 0.0,
8
+ "dtype": "float32",
9
+ "hidden_act": "gelu",
10
+ "hidden_dropout_prob": 0.0,
11
+ "hidden_size": 384,
12
+ "id2label": {
13
+ "0": "us_erdl",
14
+ "1": "us_m81_woodland",
15
+ "2": "us_dcu_chocolate_chip",
16
+ "3": "us_dcu_3color",
17
+ "4": "us_marpat_woodland",
18
+ "5": "us_marpat_desert",
19
+ "6": "us_ucp",
20
+ "7": "us_multicam",
21
+ "8": "us_ocp_scorpion",
22
+ "9": "us_aor1",
23
+ "10": "us_aor2",
24
+ "11": "us_tigerstripe",
25
+ "12": "uk_dpm_woodland",
26
+ "13": "uk_dpm_desert",
27
+ "14": "uk_mtp",
28
+ "15": "de_flecktarn",
29
+ "16": "de_tropentarn",
30
+ "17": "de_splittertarn",
31
+ "18": "ru_klmk",
32
+ "19": "ru_ttsko",
33
+ "20": "ru_vsr_93",
34
+ "21": "ru_emr_digital_flora",
35
+ "22": "ru_surpat",
36
+ "23": "ru_partizan",
37
+ "24": "ca_cadpat_tw",
38
+ "25": "ca_cadpat_ar",
39
+ "26": "fr_cce",
40
+ "27": "fr_daguet",
41
+ "28": "it_vegetata",
42
+ "29": "au_auscam",
43
+ "30": "au_amcu",
44
+ "31": "se_m90",
45
+ "32": "ch_taz_90",
46
+ "33": "no_m75",
47
+ "34": "cn_type07_universal",
48
+ "35": "cn_type07_desert",
49
+ "36": "kr_granite",
50
+ "37": "jp_jgsdf",
51
+ "38": "commercial_kryptek_mandrake",
52
+ "39": "commercial_atacs_au"
53
+ },
54
+ "image_size": 518,
55
+ "initializer_range": 0.02,
56
+ "label2id": {
57
+ "au_amcu": 30,
58
+ "au_auscam": 29,
59
+ "ca_cadpat_ar": 25,
60
+ "ca_cadpat_tw": 24,
61
+ "ch_taz_90": 32,
62
+ "cn_type07_desert": 35,
63
+ "cn_type07_universal": 34,
64
+ "commercial_atacs_au": 39,
65
+ "commercial_kryptek_mandrake": 38,
66
+ "de_flecktarn": 15,
67
+ "de_splittertarn": 17,
68
+ "de_tropentarn": 16,
69
+ "fr_cce": 26,
70
+ "fr_daguet": 27,
71
+ "it_vegetata": 28,
72
+ "jp_jgsdf": 37,
73
+ "kr_granite": 36,
74
+ "no_m75": 33,
75
+ "ru_emr_digital_flora": 21,
76
+ "ru_klmk": 18,
77
+ "ru_partizan": 23,
78
+ "ru_surpat": 22,
79
+ "ru_ttsko": 19,
80
+ "ru_vsr_93": 20,
81
+ "se_m90": 31,
82
+ "uk_dpm_desert": 13,
83
+ "uk_dpm_woodland": 12,
84
+ "uk_mtp": 14,
85
+ "us_aor1": 9,
86
+ "us_aor2": 10,
87
+ "us_dcu_3color": 3,
88
+ "us_dcu_chocolate_chip": 2,
89
+ "us_erdl": 0,
90
+ "us_m81_woodland": 1,
91
+ "us_marpat_desert": 5,
92
+ "us_marpat_woodland": 4,
93
+ "us_multicam": 7,
94
+ "us_ocp_scorpion": 8,
95
+ "us_tigerstripe": 11,
96
+ "us_ucp": 6
97
+ },
98
+ "layer_norm_eps": 1e-06,
99
+ "layerscale_value": 1.0,
100
+ "mlp_ratio": 4,
101
+ "model_type": "dinov2",
102
+ "num_attention_heads": 6,
103
+ "num_channels": 3,
104
+ "num_hidden_layers": 12,
105
+ "out_features": [
106
+ "stage12"
107
+ ],
108
+ "out_indices": [
109
+ 12
110
+ ],
111
+ "patch_size": 14,
112
+ "problem_type": "single_label_classification",
113
+ "qkv_bias": true,
114
+ "reshape_hidden_states": true,
115
+ "stage_names": [
116
+ "stem",
117
+ "stage1",
118
+ "stage2",
119
+ "stage3",
120
+ "stage4",
121
+ "stage5",
122
+ "stage6",
123
+ "stage7",
124
+ "stage8",
125
+ "stage9",
126
+ "stage10",
127
+ "stage11",
128
+ "stage12"
129
+ ],
130
+ "transformers_version": "5.7.0",
131
+ "use_cache": false,
132
+ "use_mask_token": true,
133
+ "use_swiglu_ffn": false
134
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f031d15334bc1698fb596012bd81714f63fd681fd59d5449676adf48a646df9c
3
+ size 88374736
preprocessor_config.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "crop_size": {
3
+ "height": 224,
4
+ "width": 224
5
+ },
6
+ "do_center_crop": true,
7
+ "do_convert_rgb": true,
8
+ "do_normalize": true,
9
+ "do_rescale": true,
10
+ "do_resize": true,
11
+ "image_mean": [
12
+ 0.485,
13
+ 0.456,
14
+ 0.406
15
+ ],
16
+ "image_processor_type": "BitImageProcessor",
17
+ "image_std": [
18
+ 0.229,
19
+ 0.224,
20
+ 0.225
21
+ ],
22
+ "resample": 3,
23
+ "rescale_factor": 0.00392156862745098,
24
+ "size": {
25
+ "shortest_edge": 256
26
+ }
27
+ }
taxonomy.py ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ CamoNet pattern taxonomy.
3
+
4
+ Each pattern has:
5
+ - id: short slug used as the class label (stable, snake_case)
6
+ - name: human-readable display name
7
+ - origin: country / military of origin
8
+ - era: rough date range of issue
9
+ - family: visual family (woodland / desert / arid / digital / brushstroke / blob / multi-terrain)
10
+ - notes: short blurb for the model card
11
+
12
+ Keep this list curated, not exhaustive. ~40 patterns is the sweet spot:
13
+ big enough to be impressive, small enough to actually train with limited data.
14
+ """
15
+
16
+ from dataclasses import dataclass
17
+ from typing import Literal
18
+
19
+ Family = Literal[
20
+ "woodland", "desert", "arid", "digital", "brushstroke",
21
+ "blob", "multi-terrain", "winter", "urban", "naval"
22
+ ]
23
+
24
+
25
+ @dataclass(frozen=True)
26
+ class Pattern:
27
+ id: str
28
+ name: str
29
+ origin: str
30
+ era: str
31
+ family: Family
32
+ notes: str
33
+
34
+
35
+ PATTERNS: list[Pattern] = [
36
+ # --- United States ---
37
+ Pattern("us_erdl", "ERDL", "United States", "1948-1980s", "woodland",
38
+ "Early US 4-color woodland pattern, used in Vietnam."),
39
+ Pattern("us_m81_woodland", "M81 Woodland", "United States", "1981-2006", "woodland",
40
+ "Iconic 4-color US woodland; the BDU pattern."),
41
+ Pattern("us_dcu_chocolate_chip", "Chocolate Chip (DBDU)", "United States", "1981-1991", "desert",
42
+ "6-color desert with pebble-like spots; Gulf War era."),
43
+ Pattern("us_dcu_3color", "3-Color Desert (DCU)", "United States", "1990-2000s", "desert",
44
+ "Coffee-stain pattern that replaced Chocolate Chip."),
45
+ Pattern("us_marpat_woodland", "MARPAT Woodland", "USMC", "2002-present", "digital",
46
+ "USMC digital woodland; first widely-issued pixelated camo."),
47
+ Pattern("us_marpat_desert", "MARPAT Desert", "USMC", "2002-present", "digital",
48
+ "USMC digital desert variant of MARPAT."),
49
+ Pattern("us_ucp", "UCP (ACU)", "US Army", "2004-2019", "digital",
50
+ "Universal Camo Pattern; grey-green digital, controversially ineffective."),
51
+ Pattern("us_multicam", "MultiCam", "United States (Crye)", "2010-present", "multi-terrain",
52
+ "Crye Precision blended multi-environment pattern; OEF-CP, OCP."),
53
+ Pattern("us_ocp_scorpion", "OCP Scorpion W2", "US Army", "2015-present", "multi-terrain",
54
+ "Army's MultiCam-derivative replacement for UCP."),
55
+ Pattern("us_aor1", "AOR1", "US Navy/NSW", "2010-present", "desert",
56
+ "NSW desert digital, MARPAT-derived."),
57
+ Pattern("us_aor2", "AOR2", "US Navy/NSW", "2010-present", "digital",
58
+ "NSW woodland digital, MARPAT-derived."),
59
+ Pattern("us_tigerstripe", "Tiger Stripe", "South Vietnam / US SF", "1962-1975", "brushstroke",
60
+ "Asymmetric horizontal-stripe pattern; many regional variants."),
61
+
62
+ # --- United Kingdom ---
63
+ Pattern("uk_dpm_woodland", "DPM Woodland", "United Kingdom", "1968-2011", "brushstroke",
64
+ "British Disruptive Pattern Material; brush-stroke 4-color."),
65
+ Pattern("uk_dpm_desert", "DPM Desert", "United Kingdom", "1990-2011", "desert",
66
+ "2-color desert DPM."),
67
+ Pattern("uk_mtp", "MTP (Multi-Terrain Pattern)", "United Kingdom", "2010-present", "multi-terrain",
68
+ "British MultiCam-derivative with DPM brush-stroke shapes."),
69
+
70
+ # --- Germany ---
71
+ Pattern("de_flecktarn", "Flecktarn", "Germany (Bundeswehr)", "1990-present", "blob",
72
+ "5-color blob pattern; one of the most effective in temperate forest."),
73
+ Pattern("de_tropentarn", "Tropentarn", "Germany (Bundeswehr)", "1990s-present", "desert",
74
+ "3-color arid Flecktarn variant."),
75
+ Pattern("de_splittertarn", "Splittertarn", "Germany (Wehrmacht)", "1931-1945", "blob",
76
+ "WW2-era angular splinter pattern."),
77
+
78
+ # --- USSR / Russia ---
79
+ Pattern("ru_klmk", "KLMK", "USSR", "1968-1990s", "brushstroke",
80
+ "Soviet 'silver leaf' sun-ray 2-color oversuit pattern."),
81
+ Pattern("ru_ttsko", "TTsKO (Butan)", "USSR", "1984-2000s", "blob",
82
+ "Three-color Soviet computer-generated pattern."),
83
+ Pattern("ru_vsr_93", "VSR-93 (Flora)", "Russia", "1993-2000s", "brushstroke",
84
+ "Vertical brush-stroke 'Flora' pattern."),
85
+ Pattern("ru_emr_digital_flora", "EMR (Digital Flora)", "Russia", "2008-present", "digital",
86
+ "Russian Armed Forces digital pattern; pixelated greens."),
87
+ Pattern("ru_surpat", "SURPAT", "Russia (Survival Corps)", "2010s-present", "digital",
88
+ "Commercial Russian multi-terrain digital."),
89
+ Pattern("ru_partizan", "Partizan / Spectre", "Russia (SSO)", "2000s-present", "multi-terrain",
90
+ "SSO Tactical 'leaf' pattern; layered foliage shapes."),
91
+
92
+ # --- Other NATO / Western ---
93
+ Pattern("ca_cadpat_tw", "CADPAT TW", "Canada", "1997-present", "digital",
94
+ "Canadian Disruptive Pattern; first issued digital camo (predates MARPAT)."),
95
+ Pattern("ca_cadpat_ar", "CADPAT AR", "Canada", "2000s-present", "desert",
96
+ "Arid CADPAT variant."),
97
+ Pattern("fr_cce", "CCE F1", "France", "1991-2010s", "woodland",
98
+ "Centre Europe; French M81-style woodland."),
99
+ Pattern("fr_daguet", "Daguet", "France", "1991-2010s", "desert",
100
+ "French desert pattern, Gulf War era."),
101
+ Pattern("it_vegetata", "Vegetata", "Italy", "2004-present", "woodland",
102
+ "Italian 4-color fractal-style woodland."),
103
+ Pattern("au_auscam", "AUSCAM (DPCU)", "Australia", "1982-2014", "blob",
104
+ "Australian 'hearts and bunnies' 5-color blob pattern."),
105
+ Pattern("au_amcu", "AMCU", "Australia", "2014-present", "multi-terrain",
106
+ "Australian MultiCam-derivative replacement for DPCU."),
107
+ Pattern("se_m90", "M90", "Sweden", "1990-present", "blob",
108
+ "Swedish angular 4-color splinter; very distinctive."),
109
+ Pattern("ch_taz_90", "TAZ 90", "Switzerland", "1990-present", "blob",
110
+ "Swiss 5-color leaf/blob pattern."),
111
+ Pattern("no_m75", "M75", "Norway", "1975-2000s", "blob",
112
+ "Norwegian 3-color blob pattern."),
113
+
114
+ # --- Asia ---
115
+ Pattern("cn_type07_universal", "Type 07 Universal", "China (PLA)", "2007-present", "digital",
116
+ "Chinese Type 07 woodland-leaning digital."),
117
+ Pattern("cn_type07_desert", "Type 07 Desert", "China (PLA)", "2007-present", "digital",
118
+ "Type 07 arid variant."),
119
+ Pattern("kr_granite", "ROK Granite", "South Korea", "2014-present", "digital",
120
+ "Korean digital pattern with granite-like color blocks."),
121
+ Pattern("jp_jgsdf", "JGSDF Type II", "Japan", "1991-present", "blob",
122
+ "Japan Ground SDF pinkish-brown tinted blob pattern."),
123
+
124
+ # --- Commercial / specialty ---
125
+ Pattern("commercial_kryptek_mandrake", "Kryptek Mandrake", "United States (commercial)", "2012-present", "multi-terrain",
126
+ "Commercial layered reptilian-scale pattern."),
127
+ Pattern("commercial_atacs_au", "A-TACS AU", "United States (commercial)", "2009-present", "arid",
128
+ "Commercial arid-urban 'pixelated organic' pattern."),
129
+ ]
130
+
131
+
132
+ PATTERN_BY_ID: dict[str, Pattern] = {p.id: p for p in PATTERNS}
133
+ LABELS: list[str] = [p.id for p in PATTERNS]
134
+ LABEL2ID: dict[str, int] = {label: i for i, label in enumerate(LABELS)}
135
+ ID2LABEL: dict[int, str] = {i: label for i, label in enumerate(LABELS)}
136
+ NUM_LABELS: int = len(LABELS)
137
+
138
+
139
+ if __name__ == "__main__":
140
+ print(f"CamoNet taxonomy: {NUM_LABELS} patterns across {len(set(p.family for p in PATTERNS))} families")
141
+ for fam in sorted(set(p.family for p in PATTERNS)):
142
+ members = [p for p in PATTERNS if p.family == fam]
143
+ print(f" {fam:15s} ({len(members):2d}): {', '.join(m.id for m in members)}")
training_args.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6afabf8f636fefd143058269d2e6c5383477744d5a9e8c2dc666c57c59670119
3
+ size 5265