Downloads · 30 days
10
6% of all-time downloads
davanstrien/qwen35-9b-iconclass-sft-brillfull
qwen35-9b-iconclass-sft-brillfull is a image-text-to-text model from davanstrien. Use it for the image-text-to-text task on the model card, and read the license before you ship it in a product. It is set up for transformers. The card lists the license as apache-2.0.
A vision–language model that labels artwork images with ICONCLASS iconographic codes (e.g. 11D35 Crucifixion, 25F23 roses, 61B:31D14 portrait of a man). Fine-tuned from unsloth/Qwen3.5-9B-Base (multimodal, arch qwen35…
Downloads · 30 days
10
6% of all-time downloads
All-time downloads
159
Public
Parameters
9.4B
18.8 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors18.8 GB · 100%
From the Hugging Face model README
A vision–language model that labels artwork images with ICONCLASS iconographic
codes (e.g. 11D35 Crucifixion, 25F23 roses, 61B:31D14 portrait of a man). Fine-tuned from
unsloth/Qwen3.5-9B-Base (multimodal, arch qwen3_5) on davanstrien/iconclass-vlm-brillfull.
Input: one artwork image. Output: a JSON object {"iconclass-codes": ["...", ...]}.
This 9B is the result that broke the recall ceiling a 4B version of the same pipeline could not. On a clean, contamination-free 788-image test (full human labels):
| system | Hierarchical F1 | code-recall | code-prec | notes |
|---|---|---|---|---|
| this 9B (single-shot) | 53.0 | 32.9 | 29.7 | best single system |
4B SFT (…-sft-brillfull) | 45.2 | 25.6 | 23.7 | predecessor; capability-bound at ~25% recall |
| anchored fusion (4B + retrieval + judge) | 48.5 | — | — | prior best pipeline (no training) |
| 9B + retrieval fusion | 51.7 | 36.3 | 18.4 | fusion now redundant — see below |
max_new_tokens=384 (~14% of outputs are malformed/truncated) — so 53.0 is a
conservative floor; a constrained-decoding / cleanup pass would recover a little more.import json, torch
from transformers import AutoModelForImageTextToText, AutoProcessor
from PIL import Image
model_id = "davanstrien/qwen35-9b-iconclass-sft-brillfull"
model = AutoModelForImageTextToText.from_pretrained(model_id, torch_dtype=torch.bfloat16, device_map="auto")
processor = AutoProcessor.from_pretrained(model_id)
INSTRUCTION = ("Classify this image using Iconclass codes. "
"Return a JSON object with key 'iconclass-codes' containing a list of codes.")
image = Image.open("artwork.jpg").convert("RGB")
messages = [{"role": "user", "content": [{"type": "image"}, {"type": "text", "text": INSTRUCTION}]}]
text = processor.apply_chat_template(messages, add_generation_prompt=True, tokenize=False,
enable_thinking=False) # this model does NOT use <think>
inputs = processor(text=text, images=[image], return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=384, do_sample=False)
resp = processor.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)
codes = json.loads(resp)["iconclass-codes"] # e.g. ["11D35", "25G3", ...]
unsloth/Qwen3.5-9B-Base (chat template cloned from Qwen/Qwen3.5-4B, <think> stripped).davanstrien/iconclass-vlm-brillfull, config sft (~82k train; full, cleaned labels; the test
split is a contamination-safe held-out 788 used below).train_sft_brill.py --base-model unsloth/Qwen3.5-9B-Base (a drop-in over the 4B recipe).a100-large (1× A100-80GB), transformers==5.2.0 (only version with qwen3_5), unsloth<2026.6, causal-conv1d (pinned
wheel), flash-linear-attention — Qwen3.5's hybrid attention needs these.Ruler: davanstrien/iconclass-vlm-brillfull test (788 images, full human labels, contamination-safe split
by filename hash), hierarchical-F1 with partial credit (eval_sft.py:_calculate_hierarchical_f1 — ancestor
matches earn graded credit). Greedy decoding, enable_thinking=False. See the results table above. Note: raw
H-F1 understates true performance because the ground truth is ~20–40% incomplete (many predicted codes are
genuinely depicted but unlabeled) — a judge-corrected ruler (eval_corrected.py) credits these.
This model is one step in an investigation (full logs in the model-training/iconclass-qwen35 repo —
RESEARCH_LOG.md, WEAK_LABELING.md, CLAUDE.md):
fuse_rank.py) was the prior deployable win (48.5).weak_label_quality.py, review_set.py,
calibrate_review.py) — validated as a data engine for unlabeled images (235B-VL via the HF router, no setup).biglam/european_art) with the agent + abstain-reviewer
→ SFT this 9B on brillfull-GT ∪ high-confidence weak-labels → eval clean-788 vs 53.0. Tests whether
clean NEW-image data pushes past capacity, or the 9B is at the learnable-visual ceiling.davanstrien/iconclass-retriever-bge-ft) + agent stack remain useful for recall-priority
cataloguing even though fusion is H-F1-redundant on this 9B.davanstrien/qwen35-4b-iconclass-sft-brillfull (4B, 45.2 H-F1).davanstrien/iconclass-vlm-brillfull (full-label, contamination-safe).davanstrien/iconclass-retriever-bge-ft.