tidy
在 Android 手机上离线运行 CLIP 多模态搜索,用自然语言找回相册照片
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
在 Android 手机上离线运行 CLIP 多模态搜索,用自然语言找回相册照片
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你有没有过这种经历——翻遍手机相册找一张截图,却只记得大概的描述,比如「上次看到的那个猫咪表情包」。按文件名、按日期、按相册都找不到,因为那张照片根本没有标签。TIDY 就是来解决这个问题的:它让你用自然语言搜索手机里的照片。
输入「穿着红色衣服的人在海边」,它就能把相关照片找出来——不需要任何标签,不需要网络连接,完全离线运行。这就是 TIDY 的核心价值:把 CLIP 多模态语义搜索能力,塞进一个 200MB 的 Android 应用里。
TIDY 由独立开发者 Viacheslav Barkov 开发,项目托管于 GitHub。CLIP 是 OpenAI 在 2021 年开源的多模态预训练模型,能够理解图像和文本之间的语义关联。CLIP 通过对比学习(Contrastive Learning)在 4 亿个图文对上训练,因此具备极强的零样本(Zero-shot)图像分类和检索能力。
图1:CLIP 模型架构——利用图文对比学习实现跨模态理解
然而,大多数 CLIP 应用都运行在云端或高性能 GPU 服务器上。TIDY 的创新之处在于:它将量化的 CLIP 模型与 ONNX Runtime 结合,让这一切在普通 Android 手机上实时运行。这意味着:你的照片永远不会离开手机,隐私零风险。
TIDY 使用的 CLIP 模型基于 OpenCLIP 开源实现,在 LAION-2B 数据集(LAION-5B 的英文子集,约 20 亿图文对)上预训练。模型经过INT8 量化处理,大幅压缩模型体积,降低推理延迟,同时尽可能保留模型的语义理解能力。量化是移动端部署大模型的标配技巧:在精度损失很小的情况下,内存占用和推理时间都能显著下降。
推理部分由 Microsoft 的 ONNX Runtime 驱动(版本 1.14.0),这是目前最成熟的跨平台推理引擎之一。ONNX Runtime 支持 CPU、GPU、NPU 多种后端,能够自动选择最优的执行计划(Graph Optimization)。在 Android 端,ONNX Runtime 通过 JNI 调用底层优化过的算子,实现毫秒级的向量相似度计算。
图2:Text-to-Image 搜索——用文字描述找回照片
图片经 CLIP 编码后生成 512 维或 768 维向量,存储在 Android Room 数据库中。Room 是 Android 官方推荐的本地数据库,支持 Kotlin 协程和 LiveData。搜索时,Query 文本同样通过 CLIP 编码为向量,然后与数据库中所有向量逐一做**点积(dot product)**计算相似度。
代码中实现了高效的批量向量计算:searchEmbedding.dot(imageEmbedding) 直接在 FloatArray 上做 SIMD 友好的向量运算。排序后取余弦相似度最高的前 N 张图片返回给用户。
TIDY 采用标准 Android MVVM 架构,代码结构清晰:
| 层次 | 组件 | 说明 |
|---|---|---|
| UI 层 | MainActivity + Fragments | 使用 Navigation Component 管理三个 Tab:索引/搜索/图片 |
| ViewModel | SearchViewModel 等 | 承载搜索逻辑,管理 UI 状态 |
| 数据层 | Room Database + Repository | ImageEmbeddingDao 封装 CRUD,Repository 提供数据抽象 |
| AI 层 | ONNX Runtime + CLIP | 推理引擎封装,向量编解码 |
关键类包括:SearchViewModel 负责向量相似度排序,ImageEmbeddingRepository 管理向量数据的持久化,ClipTokenizer 和 ClipByteEncoder 是文本 Token 化模块,直接移植自 OpenAI CLIP 的官方实现。
图3:Image-to-Image 搜索——用一张图片找相似图片
TIDY 的使用流程非常简洁:首次启动时,App 扫描用户相册中所有图片,逐张通过 CLIP 编码并存储向量。这个过程在高端手机上可能需要几分钟,但只需要做一次。之后每次打开 App,只需要处理新增的照片,增量更新速度很快。
搜索支持两种模式:文字搜图(Text-to-Image)和以图搜图(Image-to-Image)。前者允许用「海边散步的金毛」这样的自然语言描述,后者支持用一张图片找到风格或内容相似的照片。结果按相似度排序呈现。
应用支持从 Google Play 和 F-Droid 两个渠道安装,无需科学上网即可从 F-Droid 获取。APK 体积控制在合理范围内(不含模型文件),适合在手机存储空间有限的情况下使用。
TIDY 也有一些局限需要正视:
TIDY 代表了一个重要趋势:AI 能力从云端向端侧迁移。过去,语义搜索、多模态理解这类能力只能在服务器上运行,用户不得不把数据上传到第三方平台。TIDY 证明了在消费级手机上运行轻量化的 CLIP 模型是完全可行的。
从技术角度看,TIDY 的工程实现也值得称道:它没有使用任何机器学习框架(TensorFlow Lite、PyTorch Mobile),而是通过 ONNX Runtime 直接加载量化模型,以最精简的方式实现了高质量的推理。这对想学习端侧 AI 部署的开发者来说是极佳的参考案例。
如果你对 CLIP 模型在移动端的部署感兴趣,TIDY 的源码是完全开放的(MIT 许可证),其中的 tokenizer 目录直接移植了 OpenAI CLIP 的官方实现,值得深入研究。