跟一张照片走完OpenGlass全流程:不到25美元的AI智能眼镜是如何炼成的
跟一张照片走完OpenGlass全流程:不到25美元的AI智能眼镜是如何炼成的
【免费下载链接】OpenGlassTurn any glasses into AI-powered smart glasses项目地址: https://gitcode.com/GitHub_Trending/op/OpenGlass
设想一个常见场景:你在活动上认识了一位新朋友,聊得投机,互换了微信。三分钟后你走回人群,却发现自己完全想不起他叫什么。这时候,如果眼镜能帮你把这张脸"记住",顺便在耳边轻轻补一句"他叫李雷,是做硬件的",你会不会觉得这才是智能眼镜该有的样子?
OpenGlass 就是为此而生的开源项目:用不到 25 美元的现成零件,把任何一副普通眼镜改造成可破解的 AI 智能眼镜。它能记录你的生活、记住你见过的人、识别物体、翻译眼前的文字,而且——整套代码、固件、图纸全部开源。你不需要相信厂商的营销话术,因为你可以亲手拆开它、读懂它、改造它。
25 美元,大概是一杯咖啡加一个汉堡的钱。而科技巨头们的同类产品,标价往往是它的百倍。它凭什么敢这么干?与其听我转述,不如跟着一张照片,把整个系统走一遍。
一张照片的完整旅程:从按下快门到开口说话
在 OpenGlass 里,"看见"不是一个瞬间,而是一条清晰的流水线。我们以一次拍照为例,看看数据是如何流动的。
第一站:镜腿上的快门
眼镜上的 ESP32 S3 微控制器(一个约 15 元的国产芯片,双核 240MHz,自带 Wi-Fi 和蓝牙)驱动着一颗 OV2640 摄像头。这颗摄像头的分辨率只有 30 万像素——没错,比你家十年前的老手机还低。
按下快门后,固件调用esp_camera_fb_get()抓取一帧 JPEG 图片,然后开始处理一个棘手的问题:怎么把这张图送到手机上去?
第二站:200 字节一次的"蓝牙快递"
眼镜和手机之间没有 Wi-Fi 直连,传输走的是低功耗蓝牙(BLE)。但 BLE 单次能携带的数据量极其有限,一张 JPEG 图动辄几十 KB,根本塞不进一个数据包。
打开firmware/firmware.ino,你会看到项目给出的朴素解法:把图片切成小块,每次只发 200 字节,末尾用两个0xFF标记"传输结束":
// 每次只拷贝 200 字节,通过 BLE 分块推送给手机 size_t bytes_to_copy = remaining; if (bytes_to_copy > 200) { bytes_to_copy = 200; } memcpy(&s_compressed_frame_2[2], &fb->buf[sent_photo_bytes], bytes_to_copy); // 推送到 BLE 特征值,手机端监听并重组 photoDataCharacteristic->setValue(s_compressed_frame_2, bytes_to_copy + 2); photoDataCharacteristic->notify();🔧技术洞察:作者没有为"大文件传输"引入任何复杂协议,就用一个简单的分块+标志位方案搞定。这背后是典型的嵌入式务实哲学——在资源受限的硬件上,最好的协议就是够用的协议。30 万像素的 JPEG 经过压缩后通常只有 20~40KB,按 200 字节/包计算,几秒内就能传完,完全够用。
第三站:手机上的"看图说话"
照片到达手机后,Expo 应用(React Native 技术栈)把图片交给一个本地运行的轻量级视觉模型——默认是 Moondream(1.8B 参数,通过 Ollama 在本地跑)。看sources/agent/imageDescription.ts里的核心调用:
// 用本地小模型生成图片的文字描述,模型可以自由替换 export async function imageDescription( src: Uint8Array, model: KnownModel = 'moondream:1.8b-v2-fp16' ): Promise<string> { return ollamaInference({ model: model, messages: [{ role: 'system', content: 'You are a very advanced model and your task is to describe the image as precisely as possible. Transcribe any text you see.' }, { role: 'user', content: 'Describe the scene', images: [src], }] }); }注意这个细节:系统提示词里特意加了一句"Transcribe any text you see"(把你看到的任何文字都转写出来)。因为对智能眼镜来说,识别招牌、路牌、菜单上的文字,往往比识别物体更有用。这不只是一行 prompt,而是项目对"眼镜到底该帮人看什么"这个问题的回答。
第四站:云端大模型当"记忆检索员"
现在,照片变成了一段文字描述。但这还不够——你真正想问的是"我面前这人是谁",而不是"请描述一下场景"。
再看sources/agent/Agent.ts里的逻辑:OpenGlass 会把过去拍下的所有照片描述拼接成一份"文字档案",然后交给一个更强的问答模型(比如 Groq 上的 Llama 3)来回答你的问题:
// 把历史照片的描述拼成文本,交给大模型回答用户问题 let combined = ''; for (let p of this.#photos) { combined += '\n\nImage #' + i + '\n\n' + p.description; } let answer = await llamaFind(question, combined);🔧技术洞察:这是整套架构最巧妙的一步——用"描述文本"代替"图像本身"作为大模型输入。图像识别(重活)交给本地小模型免费干,理解与推理(巧活)交给云端大模型干。好处显而易见:云端大模型不需要处理图像,成本和延迟都大幅下降;同时你的原始照片也无需上传,隐私得到保护。
三个反直觉的设计决策,藏着作者的真实权衡
看完数据流,你可能和我一样冒出几个疑问。这些疑问,恰好就是项目设计哲学的最好注脚。
疑问一:为什么不用高分辨率摄像头?
因为眼镜不是相机。30 万像素足够 AI 识别物体和文字,而更高分辨率只会让 BLE 传输变慢、功耗上升、续航缩短。这是"够用就好"对"参数至上"的一次胜利。
| 组件 | 成本(约) | 为什么选它 |
|---|---|---|
| ESP32 S3 微控制器 | 15 元 | 双核 240MHz、自带 Wi-Fi/BLE、内置 PSRAM,资料全、社区大 |
| OV2640 摄像头 | 5 元 | 30 万像素足够 AI 识别,低功耗,驱动成熟 |
| 3.7V 250mAh 锂电池 | 3 元 | 体积小、可更换,配合动态功耗控制撑起全天使用 |
| 3D 打印镜架外壳 | 2 元 | 图纸开源,可自行调整尺寸适配各种镜框 |
疑问二:为什么 AI 推理不在眼镜上跑?
25 元的硬件根本跑不动大模型,硬塞进去只会得到一个又烫又卡的结果。OpenGlass 的选择是:眼镜只负责采集(拍照、收音),手机负责处理,云端负责思考。这是目前成本约束下最合理的分工。
疑问三:为什么要留三种音频编码?
打开firmware/firmware.ino顶部,你会看到一排被注释掉的宏定义:
// 三种音频编码:按使用场景切换 // #define CODEC_OPUS // 高质量语音编码,开发中 // #define CODEC_MULAW // Web 应用使用,带宽占用小 #define CODEC_PCM // 原生应用使用,简单直接作者没有把方案焊死,而是把选择权留给使用者:追求音质选 Opus,Web 端要低带宽选 Mu-law,原生应用图省事选 PCM。这折射出整个项目的性格:不替你决定,而是让你自己权衡。
60 张照片的"验收报告":开源项目怎么证明自己靠谱
很多项目嘴上说自己能"识别万物",但你找不到任何证据。OpenGlass 的做法很硬核:仓库里躺着一个prompts/series_1目录,里面是60 张真实拍摄的测试照片,每张都配了 4 个不同 AI 模型的完整描述输出。
打开任何一张.md文件,你都能看到同一场景的四种"说法":
- 默认模型(Moondream):平铺直叙,像个老实人——"画面中有人坐在前景,正在使用手机……"
- LLaVA-Llama3:绘声绘色,像个写手——"在喧嚣的房间中心,一位金发卷发的年轻人正专注于他的黑色手机……"
- LLaVA:34b-v1.6:理性分析,像个侦探——"根据建筑特征和来往行人判断,这很可能是一个火车站……"
这份"验收报告"是花真金白银(算力)和时间跑出来的,prompts/generate.ts里的脚本就是当时的"考试机器"——批量读取图片、依次调用各模型、把结果写进 markdown。对新手来说,这 60 组对比就是免费的模型选型指南:想要快选 Moondream,想要详细选 LLaVA 大模型,一目了然。
从一副眼镜到一个平台:你可以在上面长出什么
MIT 许可证意味着这套代码你可以随意改、随意用、随意分发。社区里已经有人把它往各个方向"长":
- 健康监测版:加心率血氧传感器,变成可穿戴健康助手
- 工业巡检版:集成二维码扫描和 AR 标注,辅助设备维护
- 学习翻译版:实时翻译菜单、公式识别,外语学习好帮手
- 户外运动版:接 GPS 和运动传感器,记录骑行轨迹
想加新 AI 服务?sources/modules/目录下已经躺着 Groq、Ollama、OpenAI 三个集成,照葫芦画瓢新建一个文件即可。整个架构按职责切分得很干净:agent/是 AI 代理层、modules/是服务集成、utils/是工具函数、app/是界面。项目不是让你用一个成品,而是给了你一套可以自由组合的积木。
四步,把它变成你自己的眼镜
如果读到这儿你已经心动了,上手只需要四步:
# 第一步:克隆仓库并安装依赖 git clone https://gitcode.com/GitHub_Trending/op/OpenGlass cd OpenGlass npm install # 第二步:配置 AI 服务密钥 # 编辑 sources/keys.ts,填入 Groq / OpenAI 的 API Key # 本地跑 Ollama:ollama pull moondream:1.8b-v2-fp16 # 第三步:烧录固件 # 用 Arduino IDE 打开 firmware/firmware.ino,选择 XIAO_ESP32S3 开发板 # 记得在工具菜单里把 PSRAM 设为 "OPI PSRAM" # 第四步:启动应用 npm start硬件方面,照着 README 备齐 ESP32 S3、OV2640 摄像头、电池,3D 打印一个镜架外壳,25 美元以内就能凑齐。
智能穿戴设备的未来,不该只属于那些贴着天价标签、内部却是一团黑盒的封闭产品。OpenGlass 的价值,恰恰在于它把"智能眼镜"这个听起来很高端的东西,拆成了你桌上的零件、屏幕里的代码、和一次可以亲手完成的组装。它证明了一件事:AI 眼镜不是买来的奢侈品,而是可以做出来的日用品。
现在,去打开那个仓库,把第一张属于你视角的照片,交给你的第一副 AI 眼镜吧。
【免费下载链接】OpenGlassTurn any glasses into AI-powered smart glasses项目地址: https://gitcode.com/GitHub_Trending/op/OpenGlass
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
