File size: 5,239 Bytes
5425c34
 
13d78f0
5425c34
 
13d78f0
 
 
 
 
5425c34
 
 
13d78f0
 
5425c34
13d78f0
 
 
 
5425c34
13d78f0
 
5425c34
13d78f0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5425c34
 
13d78f0
5425c34
 
5490cce
 
 
 
 
 
 
 
5425c34
 
 
 
 
 
 
 
 
 
 
 
13d78f0
5425c34
 
 
 
 
13d78f0
5425c34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13d78f0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
---
license: cc-by-nc-4.0
library_name: open_clip
pipeline_tag: image-classification
base_model: HopitAI/moda-fashion-distilled
language:
  - en
metrics:
  - f1
  - accuracy
tags:
  - fashion
  - attribute-extraction
  - product-attributes
  - catalog-enrichment
  - e-commerce
  - computer-vision
  - image-classification
  - multi-label-classification
  - siglip
  - moda-ner
  - benchmark
  - reproducibility
  - non-commercial
  - applicability
model-index:
  - name: MODA_NER(V) Full-body
    results:
      - task:
          type: image-classification
          name: Fashion attribute extraction
        dataset:
          type: moda-general-attribute-suite
          name: MODA General Attribute Suite (fullbody track)
        metrics:
          - type: f1
            value: 0.6917
            name: Tier-1 macro-F1
          - type: f1
            value: 0.6637
            name: Tier-2 N/A-F1
          - type: f1
            value: 0.5785
            name: Tier-3 visible macro-F1
---


# MODA_NER(V) - Full-body

> **Fix, 2026-09-19. If you ran this model before this date, re-run it.** The repository's
> `models/inference.py` ran the full-body route with the wrong image preprocessing: OpenAI-CLIP
> normalisation and a centre crop, instead of the mean/std 0.5 squash this checkpoint was trained
> with. Its outputs did not match the published benchmark predictions, matching on none of 64
> held-out images. The weights in this repository are unchanged and correct. Pull the latest
> [Moda_ner](https://github.com/hopit-ai/Moda_ner) code and the Usage command below produces the
> published predictions. The benchmark numbers on this card were produced correctly.

*Tier `*` - open code, open weights. Licence: CC BY-NC 4.0.*

**Tier `*`** — open code, open weights. **Weights: CC BY-NC 4.0.**

Eighteen class-balanced heads with an explicit N/A class, on our own frozen encoder (see Provenance below).

**Input contract:** one full-body fashion photograph.
**Output:** upper, lower and outer fabric; upper, lower and outer pattern; neckline; sleeve
length; lower-garment length; cardigan; navel coverage; hat; glasses; neckwear; waist
accessories; wrist accessories; ring; socks or leggings. Every field can return N/A, and N/A
is scored as a real class rather than treated as a negative.

| Measure (fullbody track) | Published | Strongest external open baseline | Paired 95% CI |
|---|---:|---:|---:|
| Tier-1 macro-F1 | 0.6917 | 0.5943 | [+0.0891, +0.1053] |
| Tier-2 N/A-F1 | 0.6637 | 0.6088 | [+0.0433, +0.0657] |
| Tier-3 visible macro-F1 | 0.5785 | 0.4969 | [+0.0723, +0.0905] |

**These are the weights that produced the published numbers above** (run `...linear-probe-v7-20260810`, recorded in `training_commitment.json`). Evaluated on a fresh product-group-disjoint
split: 5,000 images, 1,751 groups, zero overlap with any prior experiment. Per-field range is
wide (0.3287 to 0.9187) — read the per-field table before relying on a single field.

**Why non-commercial.** Same as the catalog route: the evaluation corpus is research-only and
its terms extend to derived data. These weights are not in Hopit's hosted product. Commercial
deployments are fine-tuned on customer data instead.

## Provenance

The encoder these heads run on is ours: [`HopitAI/moda-fashion-distilled`](https://huggingface.co/HopitAI/moda-fashion-distilled), MIT, already public. Nothing from another vendor is loaded at inference time. (Recorded in the programme documentation; we re-confirm it against this track's frozen artifacts before release.)

That is worth stating plainly, because the comparator on this track is a FashionSigLIP-based system and it would be easy to assume this model is that system with heads attached. It is not. FashionSigLIP appears in two other roles:

- **As the distillation teacher.** An earlier ladder of checkpoints put conditional heads on frozen Marqo-FashionSigLIP. We distilled that system into our own encoder; the teacher is used during training and is not needed to serve.
- **As the baseline we measure against.** The comparator figure quoted above is that same FashionSigLIP-based system.

Lineage, stated once rather than implied: `moda-fashion-distilled` is itself a distilled student built on ViT-B/16-SigLIP, from a teacher ensemble that included our own DeepFashion2 fine-tune. Marqo-FashionSigLIP is Apache-2.0. The DeepFashion2 corpus is research-only, so we do not describe this pipeline as provenance-clean end to end.

**Credit for this model.** CC BY-NC requires attribution. Cite the MODA General Attribute
Suite (`CITATION.cff`).

## Links

- Benchmark tables and protocol: <https://hopit-ai.github.io/Moda_ner/>
- Code, scorers and prediction files: <https://github.com/hopit-ai/Moda_ner>
- All Hopit AI benchmarks: <https://hopit-ai.github.io/>

## Usage

The heads are not a `transformers` architecture, so load them through the suite
repository rather than `AutoModel`:

```bash
git clone https://github.com/hopit-ai/Moda_ner && cd Moda_ner
pip install -r requirements-inference.txt
huggingface-cli download HopitAI/moda-ner-v-fullbody --local-dir ./moda-ner-v-fullbody
python models/inference.py --route fullbody --model-dir ./moda-ner-v-fullbody --images photo.jpg
```