基于 Chinese-CLIP 模型的本地化智能照片搜索应用,支持文字搜图、以图搜图、人脸分组、地点相册等多种功能。
- 文字搜图: 输入中文/英文文本,使用 CLIP 模型语义匹配照片库中的图片
- 以图搜图: 选择一张照片,搜索相似的照片
- 人脸分组: 自动识别照片中的人物并分组
- 地点相册: 按拍摄地点浏览照片
- 相似聚类: 自动发现相似照片簇
- 图文相似度: 分析照片与文字的匹配度
- 图图相似度: 比较两张照片的相似度
- 最 X 的照片: 展示照片库中的各项之最(最高、最长、分辨率最大等)
- 离线处理: 所有推理在设备本地完成,无需网络,保护隐私
- 智能索引: 后台自动提取图片特征向量,支持暂停/继续
- 高效检索: 使用 L2 归一化的余弦相似度快速排序
- 精美 UI: 现代化的用户界面,流畅的交互体验
PhotoScanner/
├── PhotoScannerApp.swift # 应用入口
├── ContentView.swift # 主视图 (Tab导航)
│
├── Models/ # 模型层
│ ├── ChineseTokenizer.swift # 中文BERT分词器
│ ├── CLIPTextModel.swift # CoreML文本编码器
│ └── CLIPImageModel.swift # CoreML图像编码器
│
├── Data/ # 数据层
│ ├── ChineseCLIP_image.mlpackage/ # 图像模型
│ ├── ChineseCLIP_text.mlpackage/ # 文本模型
│ ├── EmbeddingCache.swift # 特征向量持久化缓存
│ └── PhotoLibraryManager.swift # 相册访问与索引管理
│
├── Views/ # UI视图
│ ├── AssetThumbnailView.swift # 资产缩略图视图
│ ├── BestPhotosView.swift # 最X的照片页面
│ ├── DiscoverView.swift # 发现页面
│ ├── FaceGroupingView.swift # 人脸分组页面
│ ├── LocationAlbumView.swift # 地点相册页面
│ ├── PhotoDetailView.swift # 照片详情页面
│ ├── SearchView.swift # 主搜索页面
│ ├── SettingsView.swift # 设置与索引进度页面
│ ├── StatsView.swift # 聚类统计页面
│ └── ToolsView.swift # 工具页面
│
├── Assets.xcassets/ # 资源文件
└── vocab.txt # 分词器词汇表
项目已经包含了预转换的模型文件,位于 PhotoScanner/PhotoScanner/Data/ 目录中:
ChineseCLIP_image.mlpackage(~350MB) 下载地址 https://javaandjar.oss-cn-beijing.aliyuncs.com/ChineseCLIP_image.mlpackage.zip 解压放入ChineseCLIP_text.mlpackage(~190MB) 下载地址 https://javaandjar.oss-cn-beijing.aliyuncs.com/ChineseCLIP_text.mlpackage.zip 解压放入vocab.txt(~107KB)
如果这些文件不存在,请运行转换脚本生成它们:
在 Xcode 项目设置中添加:
Info.plist / Privacy - Photo Library Usage Description:
用于访问您的照片库以进行文字搜索和特征索引
- 选择真机或模拟器 (iOS 15+)
- Cmd + R 运行
- 首次打开后进入「设置」页,点击「开始分析」建立索引
- 返回「搜索」页输入关键词(如 "猫咪"、"海边日落"、"旅行")
- 或点击推荐标签快速搜索
- 结果按相似度降序排列,百分比表示匹配程度
| 组件 | 技术 |
|---|---|
| 文本编码 | Chinese-CLIP ViT-B/16 Text Encoder → CoreML |
| 图像编码 | Chinese-CLIP ViT-B/16 Vision Encoder → CoreML |
| 分词器 | BERT WordPiece Tokenizer (Swift实现) |
| 特征维度 | 512维浮点向量 |
| 相似度计算 | 余弦相似度 (L2归一化后的点积) |
| 缓存存储 | JSON文件 (Documents目录) |
- 首次索引约3000张照片需要5-10分钟(取决于设备性能)
- 模型文件较大(~540MB),建议仅在真机上测试
- 索引过程支持后台执行,可随时暂停/继续
- iOS 15.0+
- Swift 5.9+
- SwiftUI
- Photos Framework
- CoreML Framework
- Core Location Framework