- 人工智能
- AI 应用
- 智能硬件
- 本地部署
- 可穿戴
- AI Agent
【免费下载链接】OpenGlass
Turn any glasses into AI-powered smart glasses
OpenGlass 的核心能力之一,是把智能眼镜拍摄的画面交给本地视觉语言模型(VLM)转成文字描述,为后续"记忆人、识别物体、回答提问"等 Agent 功能提供输入。prompts/series_1/img_54.md正是这一能力在真实图片(img_54.jpeg)上的一次多模型对比评测输出:同一张照片分别交给默认模型与两个 llava 系列模型,得到了风格迥异的三种描述。本文将完整呈现这份评测结果,结合仓库源码剖析图像描述管道的实现原理、模型切换机制与配置方法,帮助你理解 OpenGlass 是如何"看图说话"的,以及如何复现并扩展这套评测。
这份评测文档是什么
prompts/series_1/img_54.md是 OpenGlass 仓库中prompts目录下 57 张测试图片之一的评测输出文件。它由批处理脚本 prompts/generate.ts 自动生成:脚本遍历prompts/series_1目录下的所有.jpeg图片,对每张图片依次调用四种图像描述策略,并把结果以####标题####分节的形式写入对应的.md文件。
以 img_54 为例,文档包含四个分节:
| 分节标题 | 对应的调用方式(见 prompts/generate.ts) |
|---|---|
####Description#### | 使用imageDescription(img)默认调用(默认模型为moondream:1.8b-v2-fp16) |
####Description (llava-llama3)#### | imageDescription(img, 'llava-llama3') |
####Description (llava:34b-v1.6)#### | imageDescription(img, 'llava:34b-v1.6') |
####Description (moondream:1.8b-v2-fp16)#### | imageDescription(img, 'moondream:1.8b-v2-fp16') |
可以看到,最后一次"显式指定默认模型"的输出为空,这是一个值得分析的异常现象,后文会专门讨论。
被评测的图片内容:三个模型的三种视角
根据文档中三个模型的输出,img_54.jpeg 描绘的是一位男子仰头对着镜头自拍的室内场景。有意思的是,三个模型对同一张图的"理解"差异极大,从不同侧面还原了画面:
- 默认调用(moondream 系,即
####Description####):侧重构图与透视,指出男子头部上扬、俯视镜头、从下往上拍摄的视角,并强调这种角度"为照片增加了纵深感"。 - llava-llama3:描述最"丰满",补充了大量画面细节——高天花板、带白色窗帘的大窗户、柔和光线、男子脖子上的白色小珠子项链、发红的鼻子,并把场景定性为"宁静惬意的卧室氛围"。
- llava:34b-v1.6:走"极简路线",只说这是人物面部的极端特写,表情中性平静,背景是模糊的室内环境,且明确指出"图像分辨率较低,难以分辨更精细的细节"。
这份对比本身就反映了不同 VLM 在提示词遵循、细节捕捉、语言风格上的显著差异:小模型更可能忠实于"Describe the scene"的字面要求输出构图信息,而参数量更大的 llava 系列倾向于补全叙事性细节。注意:llava-llama3 对"项链""红鼻子"等细节的描述属于模型生成内容,在真实世界画面中是否存在无法仅凭文本确认——这正是评测输出需要结合原图人工核验的原因。
文档背后的调用链:一张图片如何变成一段文字
img_54.md中的每一段描述,都经过同一条管道:
- prompts/generate.ts 的
runTest函数把图片的Uint8Array字节传给imageDescription; - sources/agent/imageDescription.ts 构造系统提示词与用户消息,调用
ollamaInference; - sources/modules/ollama.ts 将图片字节转 base64 后,通过
axios.post发送到本地 Ollama 的/api/chat接口; - 响应中的
message.content经trimIdent清理后返回,写入.md文件。
关键的系统提示词定义在 imageDescription.ts:
system: "You are a very advanced model and your task is to describe the image as precisely as possible. Transcribe any text you see."user: "Describe the scene"
这套提示词同时要求模型"尽可能精确描述"并"转录画面中的任何文字",与"记录生活、识别物体、翻译文字"的产品定位(见 README.md)一致。generate.ts中被注释掉的Blurry测试(prompts/generate.ts)则展示了另一项能力:用 sources/agent/imageBlurry.ts 让模型以 YES/NO 判断图片是否模糊或损坏,可作为图像质量过滤的前置环节。
图片编码与请求体构造
在 ollama.ts 中,Uint8Array图片通过 sources/utils/base64.ts 转成 base64 字符串,请求体为:
{ stream: false, model: <模型名>, messages: [<转换后的消息>] }其中图片被放入消息的images字段。所有请求都包裹在backoff重试机制中(sources/utils/time.ts):默认最小延迟 250ms、最大延迟 1000ms、最多重试 50 次,失败时打印警告——这保证了在本地模型推理较慢或 Ollama 偶发超时的情况下,批量评测仍能完成。
支持哪些视觉模型:KnownModel 类型与模型切换
imageDescription的第二个参数model的类型KnownModel定义在 sources/modules/ollama.ts,它约束了可用的模型名:
| 模型标识 | 定位 |
|---|---|
moondream:1.8b-v2-fp16 | 默认视觉模型,1.8B 参数,适合在本地快速推理 |
moondream:1.8b-v2-moondream2-text-model-f16 | 用于模糊/质量判断(见 imageBlurry.ts) |
llava-llama3 | 基于 Llama 3 的视觉语言模型 |
llava:34b-v1.6 | 34B 参数的大规模视觉模型,质量更高、速度更慢 |
llama3/llama3-gradient/llama3:8b-instruct-fp16 | 非视觉文本模型,可用于纯文本问答 |
调用时只需传入模型名即可切换,例如imageDescription(img, 'llava:34b-v1.6')。这也解释了文档中四次调用的结构——前三次分别使用了默认模型、llava-llama3、llava:34b-v1.6,第四次显式传回默认模型。
关于第四次调用输出为空的排查思路
####Description (moondream:1.8b-v2-fp16)####分节为空,说明该次ollamaInference返回了空字符串。结合源码可以推断几种可能原因,但仓库中无法确证具体是哪一种:
- 本地未拉取该模型:README 明确要求先执行
ollama pull moondream:1.8b-v2-fp16(README.md);若运行环境缺少模型,Ollama 会返回错误。 - API 配置为空:Ollama 地址从 sources/keys.ts 读取
EXPO_PUBLIC_OLLAMA_API_URL环境变量,若未配置则axios.post('', ...)请求必然失败。 - 重试耗尽或推理超时:
backoff最多重试 50 次,但每次延迟上限仅 1000ms;大模型冷启动或并发推理可能反复触发重试,最终返回''。 message.content为空:ollamaInference只取response.message?.content,若模型返回空内容(如图片解析失败),结果即为空串。
注意:以上均为从源码结构推出的可能性,并非仓库记录的事实。若要在自己的环境复现,应优先检查ollama pull状态与keys.ts的环境变量配置。
如何复现这套评测实验
img_54.md不是手工撰写的,而是可完整复现的自动化产物。复现步骤如下:
- 安装依赖:在仓库根目录执行
npm install(或yarn install),见 README.md。 - 配置本地 Ollama:在 sources/keys.ts 中设置
EXPO_PUBLIC_OLLAMA_API_URL为本地 Ollama 地址,例如http://localhost:11434/api/chat;如使用 Groq / OpenAI 的 Agent 问答能力,还需配置对应的 API Key(EXPO_PUBLIC_GROQ_API_KEY、EXPO_PUBLIC_OPENAI_API_KEY)。 - 拉取模型:执行
ollama pull moondream:1.8b-v2-fp16,并按需拉取llava-llama3、llava:34b-v1.6。 - 运行评测:用支持 TypeScript 的方式执行 prompts/generate.ts(例如
npx ts-node prompts/generate.ts),脚本会自动遍历prompts下各 series 目录的所有.jpeg,把四种描述结果写回对应的.md文件。
由于该脚本会覆盖写入prompts/series_1/*.md,复现时建议先备份原文件或复制目录后再运行,避免原始评测结果丢失。
从评测到 Agent:描述文本的下一步去向
img_54.md这类描述文本并非终点。在 OpenGlass 的应用层,sources/agent/Agent.ts 的addPhoto方法会实时调用imageDescription生成描述并暂存在内存中;当用户提问时,answer方法把所有照片的描述拼接起来(Agent.ts),交给 sources/agent/imageDescription.ts 中的llamaFind,经由 Groq 的llama3-70b-8192(见 sources/modules/groq-llama3.ts)做"基于描述回答问题"的推理。也就是说,评测文档中每一段描述的稳定性与准确性,直接决定了眼镜端问答体验的上限——这正是对多个 VLM 做系统性对比评测的价值所在。
小结
通过prompts/series_1/img_54.md,我们可以完整观察到 OpenGlass 图像描述管道的一次真实运行:generate.ts批量驱动 →imageDescription构造提示词 →ollamaInference编码图片并请求本地 Ollama → 描述文本落盘。文档同时展示了同一场景下三个视觉模型截然不同的输出风格,以及默认模型一次失败的调用(空输出)。结合 sources/modules/ollama.ts、sources/agent/imageDescription.ts 等源码,开发者可以快速理解模型切换机制、提示词设计与重试策略,并据此在本地复现、扩展或改进这套多模型图像描述评测。
- 人工智能
- AI 应用
- 智能硬件
- 本地部署
- 可穿戴
- AI Agent
【免费下载链接】OpenGlass
Turn any glasses into AI-powered smart glasses
相关推荐
Zcash 2.0.5-2 版本详解:Sprout→Sapling 迁移工具、turnstile 共识规则与 ARMv8 支持
Zcash 2.0.5 2 版本详解:Sprout→Sapling 迁移工具、turnstile 共识规则与 ARMv8 支持 Zcash 2.0.5 2 是继
人工智能AI 应用智能硬件本地部署可穿戴AI AgentOpenGlass 视觉模型批量评测:基于 moondream / llava 的多模态图片描述生成与输出对比
OpenGlass 视觉模型批量评测:基于 moondream / llava 的多模态图片描述生成与输出对比 OpenGlass 是一个把任意普通眼镜改造成
人工智能AI 应用智能硬件本地部署可穿戴AI AgentOpenGlass 视觉模型描述对比实战:以 img_10 为样本拆解 llava、moondream 等多模型输出差异
OpenGlass 视觉模型描述对比实战:以 img_10 为样本拆解 llava、moondream 等多模型输出差异 导读 OpenGlass 是一个把普通
人工智能AI 应用智能硬件本地部署可穿戴AI Agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考