我训练了一个500M参数的VLM,能够回答关于图像的输入问题(选择/评分/是与否),并提供校准的概率。在M1 Pro上约400毫秒,无文本生成 [P]
摘要
一个小型视觉语言模型,能够回答关于图像的输入问题并提供校准的概率,针对消费级硬件的快速推理进行了优化。
查看缓存全文
缓存时间: 2026/09/28 19:58
bykof/peekaboolean
源码: https://github.com/bykof/peekaboolean
peekaboolean
窥视图像,获取布尔值(以及选项与评分)。
一个轻量级视觉语言模型,能够快速回答关于图像的键入问题,足以在笔记本电脑上流畅运行。你发送一张图像、一个 state(上下文)以及任意数量的命名问题。每个问题属于以下三种类型之一:
- choice:从你提供的选项中选择一项,每个选项都有自己的描述
- score:将图像放置在你提供的序数标尺上(任意级别数)
- noul:是/否,以概率形式返回
模型从不生成文本。它仅对调用者编写的选项进行评分,因此只返回你询问的答案,概率经过校准,并且训练中从未见过的标尺也能像熟悉的标尺一样有效工作。
- 骨干网络:SmolVLM-500M-Instruct (https://huggingface.co/HuggingFaceTB/SmolVLM-500M-Instruct),对语言模型应用 LoRA,视觉塔保持冻结
- 输出头:骨干网络自身的
logit(是) − logit(否)用于判断“此提议答案是否正确?” - 训练:从 Qwen3-VL-30B-A3B(一个本地教师模型,负责编写并标注请求)蒸馏得到,并结合公开的 VQA 数据
- 延迟:在 M1 Pro 上处理包含六个问题(28 个选项)的请求,约 400 毫秒 p95(MPS,512 像素);桌面 GPU 上约 60 毫秒
- 权重:GitHub 发布 v0.1.0 (https://github.com/bykof/peekaboolean/releases/tag/v0.1.0)(CC BY-NC 4.0 许可证,详见 Licence)
构建过程以及哪些方法有效、哪些无效:docs/REPORT.md。
快速开始
git clone https://github.com/bykof/peekaboolean && cd peekaboolean
uv sync --python 3.13
curl -L https://github.com/bykof/peekaboolean/releases/download/v0.1.0/peekaboolean-500m.tar.gz | tar xz
uv run python -m peekaboolean.serve --adapter peekaboolean-500m \
--image photo.jpg --request requests/general.json --max-edge 512
--adapter 接受本地检查点目录或 Hugging Face 仓库 ID。基础模型会在首次使用时下载。--device 选择 cuda、mps 或 cpu(默认:自动)。
一个请求(requests/general.json):
{
"state": "仅根据图像中可见内容作答。",
"questions": {
"kind": {
"type": "choice",
"instructions": "这是什么类型的图像?",
"criteria": {
"photo": "真实场景的照片",
"screenshot": "应用程序或网站截图",
"document": "扫描或拍摄的文档页面",
"chart": "图表、图形或示意图"
}
},
"sharpness": {
"type": "score",
"instructions": "图像清晰度如何?",
"criteria": [
"非常模糊",
"有些模糊",
"可接受",
"清晰"
]
},
"person_visible": {
"type": "noul",
"instructions": "图像中是否可见人物?"
}
}
}
一张图表图像的答案示例:
{
"answers": {
"kind": {"type": "choice", "choice": "chart", "confidence": 0.755, "probabilities": {"photo": 0.0002, "screenshot": 0.180, "document": 0.004, "chart": 0.817}},
"sharpness": {"type": "score", "score": 1.96, "confidence": 0.151, "probabilities": {"0": 0.114, "1": 0.176, "2": 0.346, "3": 0.363}, "legend": {"0": "非常模糊", "1": "有些模糊", "2": "可接受", "3": "清晰"}},
"person_visible": {"type": "noul", "noul": 0.047}
}
}
score 是预期的级别索引(0 = 第一级别)。noul 是 P(是)。
在 Python 中,可加载一次并重复使用:
from peekaboolean.serve import load, evaluate
model, processor, calibration = load("peekaboolean-500m", device="mps", merge=True)
result = evaluate(model, processor, state, questions, "photo.jpg", calibration, max_edge=512)
state、instructions 和每个选项可以是字符串、对象或列表。noul 类型问题可以有自己的措辞:"criteria": {"true": "...", "false": "..."}。每个问题独立评分,因此答案不依赖于选项顺序或请求中的其他问题。
本地界面
uv run python -m peekaboolean.ui --adapter peekaboolean-500m
在 http://127.0.0.1:8765 上打开页面。拖放文件夹或图像(或选择、粘贴),编写问题,点击排序(⌘↵)。每张图像落入其答案对应的箱中;清单列出每个答案及其概率,导出 JSON 保存 {request, results, errors}。choice 选项每行一个,格式为 key: description,score 级别每行一个从最低开始,yes/no 措辞可选,格式为 yes: ... / no: ...。JSON 视图以上述格式编辑相同的请求。图像保留在本机上。
界面实时排序 42 张 Wikimedia Commons 图像
在 M1 Max(MPS,512 像素)上实时处理:来自 Wikimedia Commons 的 42 张图像使用 requests/general.json 中的三个问题(页面默认)在 8.9 秒内完成排序,模型处理时间每张 206 毫秒。相同的图像、作者和许可证列于 docs/demo-images.tsv;获取它们并拖放 data/demo 到页面:
mkdir -p data/demo && tail -n +2 docs/demo-images.tsv | while IFS=$'\t' read -r file url _; do curl -sSfL -A "peekaboolean-demo (https://github.com/bykof/peekaboolean)" -o "data/demo/$file" "$url"; done
服务模式
--mode(默认 auto);所有模式在 fp32 下返回相同答案:
shared:编码一次图像和状态,然后使用 KV 缓存对每个选项作为后缀进行评分single:所有内容在一次前向传递中完成;对于 MPS 上的小型请求更快auto:最多 8 个选项时使用single,超过则使用sharednaive:每个问题一次前向传递;参考路径serve --check断言三者一致。
python -m peekaboolean.benchmark 测量每种图像尺寸和请求形状的热延迟(--breakdown 获取各阶段时间)。校准温度分别针对 256、384 和 512 像素拟合。除非延迟要求使用更小尺寸,否则以 512 像素提供服务。
结果
留出测试集,512 像素。图像分割基于内容哈希,因此测试图像在训练中未被见过。“教师”组是由教师模型编写的请求,衡量与教师的对齐程度,而非与真实情况的对齐。
| 组别 | 未训练 500M(是/否头) | v6(256M,标量头) | v8b(本次发布) |
|---|---|---|---|
| 教师 choice,准确率 | 0.51 | 0.77 | 0.78 |
| 教师 noul,平衡准确率 | 0.65 | 0.87 | 0.94 |
| 教师 score,斯皮尔曼相关 | 0.37 | 0.71 | 0.73 |
| VQAv2 choice / noul | 0.73 / 0.83 | 0.91 / 0.79 | 0.91 / 0.79 |
| DocVQA / ChartQA / TextVQA choice | 0.69 / 0.60 / 0.85 | 0.85 / 0.86 / 0.96 | 0.87 / 0.87 / 0.96 |
| AI2D / CLEVR choice | 0.76 / 0.48 | 0.79 / 0.74 | 0.90 / 0.80 |
| 计数标尺 VQAv2 / CLEVR,斯皮尔曼相关 | 0.44 / 0.47 | 0.79 / 0.70 | 0.79 / 0.79 |
| FairFace 年龄(10 个区间),斯皮尔曼相关 | – | – | 0.81 |
| FairFace “是否是儿童” / 性别,平衡准确率 | – | – | 0.97 / 0.96 |
未训练列来自 4000 行验证样本。v6 在其自身(v6)测试集上测量,v8b 在完整 v7/v8 测试集(21k 问题)上测量;两者使用相同的图像分割。每组 JSON 报告附在 GitHub 发布中。
Mac 延迟(M1 Pro,MPS,fp32,--mode auto,512 像素):包含六个问题、28 个选项的请求,500M 骨干网络的 p95 延迟约为 380–400 毫秒。256M v6 模型:单个 noul 116 毫秒,六个问题的请求 230 毫秒。
局限性
- 与教师模型的准确率不等于与人类的准确率。目前尚无公开的、人类标注的、针对请求形状问题的接受集。
- v7 训练中移除了图像美学内容;模型的美学评分与纯文本先验相比并无优势。
- 模型从人脸估计年龄、性别以及“儿童或成人”(FairFace 训练数据)。这些估计携带了数据的偏见,并且对于个体而言错误率足够高,绝不能用于决定关于某个人的任何事情。它也会回答关于绘画和卡通角色的此类问题。
- 选项独立评分,因此模型无法比较仅因对比度不同而异的选项(“较大的那个”)。
训练你自己的模型
生成此检查点的所有内容都在 src/peekaboolean 中。流程如下:
prepare_general.py:来自 The Cauldron (https://huggingface.co/datasets/HuggingFaceM4/the_cauldron) 的类型化问题(VQAv2、CLEVR、TextVQA、DocVQA、ChartQA、Screen2Words、AI2D),仅训练分区prepare_teacher.py:本地 Qwen3-VL-30B-A3B(vLLM)为每张图像编写一个请求并标注(参见模块文档字符串;在其自身的 vLLM 环境中运行)prepare_v6.py:混合公开和教师行,添加计数标尺,针对已知答案行调整教师的概率prepare_age.py:FairFace 年龄、性别和儿童/成人问题pipeline.py:train_general.py→ 每尺寸校准和测试报告(postprocess.py)→ 延迟基准测试,作为分离的后台任务full_test.py:在测试集的每一行上评估检查点
每个版本的确切设置见 docs/REPORT.md。所有运行均使用一块 RTX PRO 6000(96 GB)。docs/legacy-qwen-v1-v2.md 描述了早期的 Qwen3-VL-4B 美学实验(train.py、prepare_ava.py、prepare_aadb.py 等)。
许可证
- 代码:Apache-2.0(LICENSE)
- 权重:CC BY-NC 4.0。基础模型和教师模型为 Apache-2.0,但部分训练数据仅允许研究用途(DocVQA;AVA 和 AADB 图像,教师模型曾为其编写问题)或携带 GPL-3.0(ChartQA)。因此权重仅发布用于研究和非商业用途。详情见模型卡片。
引用
参见 CITATION.cff。
相似文章
@andimarafioti:没有视觉编码器,VLM也能‘看见’吗?我们受Gemma 4 12B启发,花100美元训练了一个。在M3 Pro MacBook上的延迟:…
研究人员受Gemma 4 12B启发,仅花费100美元训练了一个无需视觉编码器的视觉语言模型,在M3 Pro MacBook上实现了端到端延迟降低30%。
小型视觉语言模型在多语言视觉多选题上的测试时扩展
本文研究了在面向多语言视觉多选题基准EXAMS-V上,针对小规模开放视觉语言模型(参数量≤7B)的测试时扩展技术。研究发现,推理预算和可解析性比复杂的搜索或验证方法更为重要。最佳配置在ImageCLEF 2026测试集上达到84.1%的准确率,在排行榜上排名第一。
仅用64个视觉token,460M VLM在iPhone上首token延迟降至0.3秒
VisionPsy-Nano-460M-Flash 是一款全新的460M视觉语言模型,每张图像仅使用64个视觉token,在iPhone上首token延迟降至0.3秒,同时保留了完整模型约99%的基准分数。这种优化牺牲了部分OCR和精细细节质量。
基于视觉基础模型引导的注意力一致性纵向医学视觉问答
提出了一种用于纵向医学视觉问答的注意力引导编码器-解码器,使用冻结的基于DINO的掩码生成器和辅助损失函数来提高一致性和可解释性,在Medical-Diff-VQA基准上取得了强劲的结果。
1/100 → 44/100:在50K浏览器截图上微调450M VLM
本文描述了使用50,000张浏览器截图微调450M VLM的过程,展示了从初始阶段到当前阶段的进展。