| --- |
| base_model: google/siglip-so400m-patch14-384 |
| pipeline_tag: image-feature-extraction |
| tags: |
| - reward-model |
| - brand-fidelity |
| - judgecliff |
| --- |
| |
| # judgecliff SigLIP brand judge v1 |
|
|
| Part of [judgecliff](https://github.com/amargupta0428/judgecliff): *which image-QC judges survive optimization pressure?* |
| A brand-fidelity judge for **rhode** (beauty brand). A judge = these SigLIP weights |
| + `calibration.json` (rhode train-split centroid + Platt scaling params) in this repo. |
|
|
| **Base:** `google/siglip-so400m-patch14-384` (full `SiglipModel`, contrastively fine-tuned). |
|
|
| **Training:** SupCon contrastive fine-tune, rhode positives vs competitor-brand negatives (Glossier, ILIA and others), judgecliff train split. No violation negatives. |
|
|
| **Report card (judgecliff Phase 1, 2,622-item test set):** brand AUC **0.99**, logo-masking delta **0.00** (style reader, not a wordmark reader), brand-dial Spearman 0.24, near-zero violation detection. |
|
|
| v1 learned the brand's *center*, not its *boundaries*: it is violation-blind, and under SRPO gradient pressure it was fully exploited (hacked images scored 0.84). See v2 (+violation negatives) and v3 (hardened) for the ablations. |
|
|
| ## Scoring |
|
|
| Score = Platt-calibrated cosine similarity between the image embedding and the rhode centroid: |
|
|
| ```python |
| import json, numpy as np, torch |
| from PIL import Image |
| from transformers import SiglipModel, SiglipImageProcessor |
| from huggingface_hub import hf_hub_download |
| |
| repo = "Gupta28/judgebench-siglip-judge-v1" |
| model = SiglipModel.from_pretrained(repo) |
| proc = SiglipImageProcessor.from_pretrained(repo) |
| params = json.load(open(hf_hub_download(repo, "calibration.json"))) |
| centroid = np.array(params["centroid"]) # L2-normalized rhode train centroid |
| |
| img = Image.open("image.jpg") |
| with torch.no_grad(): |
| emb = model.get_image_features(**proc(images=img, return_tensors="pt")) |
| v = emb[0].numpy(); v /= np.linalg.norm(v) |
| cos = float(v @ centroid) |
| score = 1 / (1 + np.exp(-(params["platt_a"] * cos + params["platt_b"]))) # calibrated on-brand prob |
| ``` |
|
|
| Full evaluation protocol, test-set construction, and findings: [https://github.com/amargupta0428/judgecliff](https://github.com/amargupta0428/judgecliff). |
|
|