dev.to #ai短讯
WildLens:一款离线野外笔记本,能识别你刚发现的动植物
WildLens 是一款运行在手机浏览器中的开源应用,利用端侧 AI 模型实时识别植物、鸟类、动物或昆虫。该应用完全在本地运行,不上传照片,且模型下载后可在无网络环境下使用。这是为 Hacktoberfest 开源 AI 挑战赛提交的作品。
这是 Hacktoberfest 开源 AI 挑战周第 1 周“Touch Grass”活动的参赛作品。
我构建了什么
WildLens 是一个小巧的野外笔记本,运行在手机浏览器中。将摄像头对准植物、鸟类、动物或昆虫,它会告诉你它认为你正在看的是什么。识别过程完全在您的设备上运行,因此您的照片永远不会被上传,并且一旦模型下载完成,即使没有信号,应用也能继续工作。
我是一名开发者,所以我很清楚开发一款让人们远离屏幕的应用程序是多么具有讽刺意味。这就是为什么我希望屏幕成为体验中最短暂的部分:你在散步时发现了一些东西,拍张照片,几秒钟内获得名称,然后把手机放回口袋。每个结果还附带一个简短的“仔细观察”提示,这是一个小型的观察任务,将照片转化为继续观察真实事物的理由。
我也不希望它胡编乱造。当 WildLens 不确定时,它会明确说明。它显示前三位猜测而不是一个听起来自信的答案,如果它在照片中找不到活体对象,它会告诉你这一点。任何危险的东西都会有安全提示,而每种植物都有一个固定规则:永远不要根据照片食用任何东西。
你可以将发现的内容保存到本地野外笔记中,并附上你自己的笔记,如果选择的话,还可以添加大致位置。它保留在你的设备上,你可以随时导出或清除它。
我故意让它看起来安静:羊皮纸背景、柔和的绿色、用于科学名称的衬线字体、没有渐变效果。它应该感觉像一本笔记本,而不是另一个乞求关注的应用程序。
它是为那些站在小径或花园里 wondering “那是什么?”的人准备的。
演示
实时应用:https://wildlens-57g9.onrender.com/
它在手机上效果最好。打开它,允许访问相机,并在首次启动时通过 Wi-Fi 让模型下载(约 330 MB)。这是一次性下载,之后模型会保留在浏览器的缓存中。
户外测试情况:我尝试识别花园里的植物和一只总是来到我家花园的可爱小猫。然后,当我去外面时,我尝试识别我看到的花朵并将它们保存在我的日记中,效果相当不错,令人惊叹。
代码
Esu05 / WildLens
一个移动优先、离线优先的 PWA,拥有平静的野外笔记本外观,带你走出家门,识别植物、鸟类、动物或昆虫。
将手机对准植物、鸟类、动物或昆虫,找出它是什么。一个开放权重的视觉模型在浏览器内运行,因此你的照片永远不会离开你的设备。
WildLens 是一个移动优先、离线优先的 PWA,拥有平静的“野外笔记本”外观。它是为 DEV “Touch Grass”挑战而构建的:一个借口让你走出去,仔细观察周围的生活,并做笔记。
功能
- 设备端识别。模型在浏览器中使用 WebAssembly 运行。没有任何内容被上传。
- 诚实的不确定性。结果可能是自信的、不确定的(前三名候选者加上对类别的最佳猜测,例如猫科)或“未找到主体”。该应用从不强制猜测。
- 安全提示。针对任何危险物品显示。植物始终带有“切勿根据照片食用”的提示。
- 仔细观察。每个类别都有一个简短的观察提示,让你注意细节,而不仅仅是点击结果。
- 野外笔记。观察记录……
我是如何构建它的
WildLens 是一个基于 React、TypeScript、Vite 和 Tailwind 的应用程序,可安装为 PWA,笔记存储在 IndexedDB 中。
其核心的 AI 是 BioCLIP,一个来自 Imageomics 研究所(MIT 许可)的开放权重视觉模型,它在生命之树上的生物多样性图像上进行了训练。我在 Google Colab 中将它的图像编码器导出为 ONNX 格式一次,该应用在浏览器中使用 ONNX Runtime Web (WebAssembly) 运行它。没有服务器,也没有 API 密钥。
识别流程如下:照片经过中心裁剪和归一化处理后,编码器将其转换为向量,随后将该向量与为每个物种预先计算的向量进行比对。BioCLIP 对完整的分类学名称响应最佳,因此一个小型构建脚本会查询 GBIF 上的所有物种,并将“一张……的照片”加上分类学字符串嵌入其中。这些文本嵌入文件很小,因此手机只需运行模型中处理图像的部分。Softmax 将相似度转化为概率,而一组“非自然”提示则用于拦截不应被识别为物种的照片(例如,客厅绝不应被报告为壁虎)。当没有单一物种能明显胜出时,评分系统会按属、科、目和纲累加概率,从而倾向于判断“可能是这个科”,而不是给出错误的物种名称。
模型文件太大,无法上传至 GitHub,因此托管在 Hugging Face 的模型仓库中。应用仅下载一次,并将其保存在浏览器缓存中。应用本身是一个部署在 Render 上的静态网站。
第一个版本效果不佳。我最初通过 Transformers.js 使用 OpenAI 的 CLIP(ViT-B/32,8位量化),结果几乎每次都出错。我扩充了标签列表,重写了提示词,并尝试提示词集成以区分猫和猎豹。每次调整都带来了一些改善,但都没有解决根本问题:CLIP 是一个通用模型,而 BioCLIP 真正懂生物学。
救了我的是将整个 UI 封装在一个小型的 NatureIdentifier 接口背后。切换模型只需添加一个新的标识符类并更新评分逻辑,无需更改任何屏幕界面。替换之后,答案终于开始合理起来。
它诚实地面对自身的局限。它只认识几百个物种,而非地球上的每一种生物。相似物种(如小型棕色鸟类、青蛙、草类)对任何模型来说都很难识别。而且它是一个笔记本伴侣,而非安全工具。
致谢:BioCLIP(Imageomics Institute)、OpenCLIP、ONNX Runtime Web、提供分类学的 GBIF,以及提供模型文件托管的 Hugging Face。
为什么开放创新很重要?
我从徒步小径出发。如果你在没有信号的野外徒步,云端视觉 API 只是一个加载转圈。因为模型权重是开放的,我可以将模型直接放在手机上:无需连接,无单次照片成本,无 API 密钥泄露风险,也无速率限制困扰。
隐私同样重要。野生动物照片包含时间,往往还包含地点,这正是我不想让它存储在我无法控制的服务器上的数据。使用本地模型,照片永远不会离开设备。
开放性还意味着当我首选方案行不通时,我不会被锁定。对于封闭 API,“这个模型不擅长生物学”只是一张支持工单;而对于开放权重,这是我能够自行修改的事情。物种只是文本而已,所以添加一种鸟类只需增加一行代码,无需重新训练任何东西。
WildLens 主要是他人开放工作的成果,经过精心整合:BioCLIP、ONNX Runtime、GBIF 的分类学数据、Hugging Face 的托管服务。封闭 API 会给我一个需要互联网连接的黑色盒子。开放创新给了我一个能在小径边缘正常工作的笔记本。
我的 Agent 会话
我全程使用了 AI 编程助手,用于搭建脚手架、调试浏览器内的 WebAssembly 环境,以及执行一次性模型导出。关于构建什么、保留什么的决策由我做出,并且我自己测试了结果。
奖项类别
Render 最佳使用案例:WildLens 作为静态站点部署在 Render 上,用于提供 PWA 前端。模型本身在用户设备上运行。
感谢阅读。如果你尝试使用它,我很乐意听听你发现了什么。现在,出门去吧。
译文已达到本站中文翻译的字数上限,剩余内容请查看原文。