CoolFace
Modelpublic

DotCheck/vermeer-image-v14_2

sourceHugging Faceapache-2.0updated 16d agoView on Hugging Face
1likes
Model Card

DotCheck/vermeer-image-v14_2

`Vermeer@14.2` (inhouse@14) is a still-image detector. It maps one photograph to an estimate \(p \in [0,1]\) of \(P(\mathrm{AI})\) at decision threshold \(0.5\).

The model is a pair stack of Niepce + Janssen: two views of the same raster, two frozen SigLIP 2 towers (the ancestor backbone), two linear heads, and a two-logit logistic combiner. It is not a single-view linear head. The previous public still repository `vermeer-image-v12` remains an archive and is not overwritten by this release.

Reported numbers are class-conditional means and balanced accuracy on a fixed Layer A holdout. They are not a posterior over all generators, and they are not proof of authorship.

FieldValue
Hub idDotCheck/vermeer-image-v14_2
Wire idinhouse@14
Public tokenVermeer@14.2
Combiner artifactsiglip2_base_patch16_224_linear_head_v14_2.npz
Transport headsiglip2_base_patch16_224_linear_head_v13_14.npz (Niepce 13.14)
Center headsiglip2_base_patch16_224_linear_head_v6_6.npz (Janssen 6.6)
Transport spinesiglip2_base_patch16_224_lora_v13_12.safetensors
Center spinesiglip2_base_patch16_224_lora_v6_6_vision.safetensors
Backbone`google/siglip2-base-patch16-224` (Apache-2.0)
Output\(p \in [0,1]\) — estimated \(P(\mathrm{AI})\)
ServeCPU FastAPI POST /v1/analyze-pair kind=still

The two spines are shared with Muybridge@4.4. The still heads and the 14.2 combiner are specific to this repository.

Model description

Each still is encoded as two JPEG views (train = serve):

  1. 1.Transport view. If \(\max(W,H) > 256\), downscale with Lanczos3 so the longer side is 256 pixels and aspect ratio is preserved. If \(\max(W,H) \le 256\), keep the native size (no upscale). No letterbox or pillarbox to a square. JPEG quality 70. Forward: LoRA spine 13.12 → linear head v13.14 (Niepce) → logit \(z_N\).
  2. 2.Center view. Extract a \(224 \times 224\) crop from the geometric center of the original raster (the crop window is not resized). JPEG quality 85. Forward: LoRA spine 6.6 → linear head v6.6 (Janssen) → logit \(z_J\).

Images with \(\min(W,H) < 224\) are rejected; no center crop is invented.

The combiner is a logistic on the two logits (no extra hidden layer, no coef vector):

\[ p = \sigma(wN zN + wJ zJ + b) \]

Locked 14.2 weights: \(w = (0.7423,\ 0.5920)\) (transport, center), \(b = -0.25\).

In this repo: README.md, `LICENSE`, `NOTICE`, `CITATION.cff`, the 14.2 combiner .npz, both still heads, and both spine safetensors.

Architecture

text
raster
  reject if min(W, H) < 224
  transport:
    if max(W, H) > 256: downscale, max side = 256, aspect kept, Lanczos3
    else: native size (no upscale)
    JPEG q70, no square pad
    → SigLIP 2 + LoRA 13.12 → head v13.14 (Niepce) → z_N
  center:
    224×224 crop at original-image center
    JPEG q85
    → SigLIP 2 + LoRA 6.6 → head v6.6 (Janssen) → z_J
  p = σ(0.7423 z_N + 0.5920 z_J − 0.25)

Inference

Each still is two frozen SigLIP 2 forwards (transport LoRA 13.12 and center LoRA 6.6), then the 14.2 logistic on the two logits. That is the pair stack, not a second opinion.

Open weights: the combiner .npz, still heads, and spines in this repository (Apache-2.0), used with the frozen SigLIP 2 backbone named above. This is not a transformers AutoModel package.

Product scoring: Check or Pro API. Hub storefront: `see-whats-real`.

Training data

Fit uses commercial-clean self-generated AI stills and a diversified mix of real photographs, with ordinary JPEG and resize stress. No non-commercial (NC) datasets.

The public evaluation set (Layer A) is disjoint from that fit:

ClassSourcen
RealWikimedia Commons photographs197
AIheld-out generators200

Protocol notes: eval/PAIR.md. Artifact names: PAIR_CARD_SCORES_v14_2.json, RULER_vermeer_v14_2.json.

Evaluation

Binary classification at threshold \(0.5\). Public claim = Layer A class-conditional mean \(P(\mathrm{AI})\) and balanced accuracy.

MetricnMeasured
mean \(P(\mathrm{AI})\) \real1970.025
mean \(P(\mathrm{AI})\) \AI2000.983
balanced accuracy0.9924

Internal diagnostic panels (25-family gold, 164 images per family; fal subset n=8) are below the public reporting floor and are not claimed here.

Intended use

  • Reproduce the pair stack and the Layer A table.
  • Research on still-image synthetic-media detection under this encoding.

Out of scope: generator attribution, authorship or legal determinations, and transformers AutoModel loading.

Limitations

  • Layer A is one holdout (Wikimedia reals vs held-out AI, threshold 0.5). It is not a calibrated posterior over generators, cameras, or post-processes.
  • Unseen generators, heavy JPEG, and social-platform re-encodes can shift scores relative to Layer A.
  • The center view is a 224×224 crop of the original raster. Small or off-center subjects can be weakly represented there.
  • The encoding is undefined for \(\min(W,H) < 224\); those stills have no score.

License

`LICENSE` — Apache License 2.0 for DotCheck heads and spines in this repository. Upstream backbone: `NOTICE`.

Citation

`CITATION.cff` · Vermeer@14.2 · wire inhouse@14 · https://dotcheck.ai/docs