Downloads · 30 days
0
aaroncool9/laya-vision-smolvlm-256m
laya-vision-smolvlm-256m is a visual question answering model from aaroncool9. Use it for the visual question answering task on the model card, and read the license before you ship it in a product. It is set up for laya. The card lists the license as cc-by-nc-sa-4.0.
This model makes calibrated, typed decisions about an image plus optional text. It answers choice, score and noul (yes/no probability) questions in one forward pass, with no text generation.
Downloads · 30 days
0
Access
Public
Updated Sep 20, 2026
Parameters
237M
946 MB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors946 MB · 100%
From the Hugging Face model README
This model makes calibrated, typed decisions about an image plus optional text. It answers choice, score and noul (yes/no probability) questions in one forward pass, with no text generation.
It adds image input to Laya by replacing Laya's ModernBERT encoder with SmolVLM-256M-Instruct. Laya's predict(state, questions) API, proper-scoring-rule training and temperature calibration are unchanged.
git clone https://github.com/r33drichards/laya-vision && pip install -e ./laya-vision torchvision
import laya
from PIL import Image
agent = laya.load_vlm("thaitea/laya-vision-smolvlm-256m")
result = agent.predict(
{"image": Image.open("photo.jpg"), "note": "customer says it arrived broken"},
{
"damaged": {"type": "noul", "instructions": "Does the item in the photo look damaged?"},
"category": {"type": "choice", "instructions": "What kind of item is this?",
"criteria": ["electronics", "clothing", "furniture", "food", "other"]},
},
)
result["answers"]["damaged"]["noul"] # calibrated P(true)
result["answers"]["category"]["choice"] # top option; see ["probabilities"], ["confidence"]
Scores are on the full validation splits. "Calibrated" uses the per-type temperatures stored in vlm_agent_config.json, which are applied automatically.
| Dataset | Question type | Chance | Accuracy | ECE raw | ECE calibrated |
|---|---|---|---|---|---|
| A-OKVQA (n=1,138) | 4-way choice | 25% | 63.1% | 0.266 | 0.094 |
| ScienceQA, image subset (n=2,097) | 2–5-way choice | ~36% | 89.0% | 0.080 | 0.034 |
| VQAv2 yes/no (n=5,000)* | noul | 50% | 73.2% | 0.085 | 0.042 |
| All (n=8,235) | 75.9% | 0.108 | 0.035 |
* The VQAv2 train/val split is a re-split of the official VQAv2 validation set by image (the only official split with answers), so these numbers are not comparable to published VQAv2 results.
predict call and shared by every question.n_permutations=4) doesn't help.choicechoicenoultraining_metrics.json has every evaluation from the run.score questions are untrained. There was no ordinal image data, so their outputs are meaningless.action field is not trained. Every answer carries result["answers"][qid]["action"]["act_probability"] from the act/escalate head. That head enters the loss only as 0.0 * act.sum(), so it receives exactly zero gradient and reports its random initialisation. The value still varies with the input — the confidence features feeding it are real, the weights reading them are not — so it looks like a calibrated gate and is not one. Ignore it; do not gate on it.The weights are released under CC BY-NC-SA 4.0, because they were trained partly on ScienceQA, which uses that license. The base model, SmolVLM, is Apache 2.0. A-OKVQA is Apache 2.0. VQAv2 annotations are CC BY 4.0, and its COCO images carry Flickr terms. The code is Apache 2.0.