你这个需求,如果只是“能跑”,其实两周就能做出来;但你想做的是可规模化、可进化、能长期优化的能力平台,那架构一定要一开始就设计对。否则后面不是性能炸,就是效果上不去。

我给你一版真正能落地 + 能扩展到 APM / AI 能力平台的架构(iOS / Android 通用思路)。


一、整体架构(分层设计)

┌──────────────────────────────┐
│        UI / 业务层            │
│ 相似照片分组 / 推荐最佳照片    │
└─────────────┬────────────────┘
              │
┌─────────────▼────────────────┐
│     Photo Dedup Service       │
│  去重 + 最优选择核心服务层      │
└─────────────┬────────────────┘
              │
 ┌────────────┼────────────┐
 │            │            │
▼            ▼            ▼
特征提取     相似度聚类     质量评分
Embedding    Clustering     Ranking
 │            │            │
 └──────┬─────┴──────┬─────┘
        ▼            ▼
     索引系统     模型管理
 (ANN Index)     (Model Hub)
        │            │
        └────┬───────┘
             ▼
      数据 & 缓存层

二、核心模块拆解(工程可实现)

1️⃣ 特征提取层(Embedding)

iOS

  • Apple Vision Framework

    • VNGenerateImageFeaturePrintRequest
  • Core ML(自定义模型)

Android

  • TensorFlow Lite
  • 或 MediaPipe

👉 输出

image → 128~512 维向量

👉 性能策略(关键)

  • 只做一次(缓存 embedding)
  • 后台线程执行
  • 分批(batch size 16/32)

2️⃣ 相似度检索(ANN Index)

你不能暴力两两比(N² 会炸)

方案:

  • HNSW(推荐)
  • IVF(Faiss 思路)

👉 移动端实现:

  • 轻量 ANN(自己实现简化版)
  • 或降级:

    • 分桶(时间 + hash)

👉 索引结构

时间分桶 → embedding → ANN索引

3️⃣ 聚类(Clustering)

推荐方案(移动端最稳)

时间窗口 + 相似度阈值

if |t1 - t2| < 5s AND similarity > 0.9
  → same group

👉 不要一开始上复杂算法(DBSCAN)
👉 简单规则 + 滑动窗口更稳


4️⃣ 质量评分(Ranking Engine)

核心是一个可扩展打分系统


评分模块设计

ScoreEngine
 ├── SharpnessEvaluator
 ├── ExposureEvaluator
 ├── FaceEvaluator
 ├── AestheticEvaluator
 ├── UniquenessEvaluator

iOS 能力

  • Apple Vision Framework(人脸)
  • CoreImage(清晰度 / 曝光)

Android

  • ML Kit(人脸)
  • OpenCV(清晰度)

👉 评分函数

score = Σ (wi * feature_i)

👉 关键优化

  • 模块可插拔(方便 A/B)
  • 权重可远程配置(灰度)

5️⃣ 最优选择(Best Pick)

best = argmax(score)

但要加一个现实优化:

👉 避免误删策略

  • 保留 Top2(不是只留1张)
  • 用户确认删除

三、性能架构(你必须重视)

1️⃣ 分阶段处理(核心)

Stage 1: 快速过滤(hash + 时间)
Stage 2: embedding 相似度
Stage 3: 精细评分

👉 每一步都在“降数据量”


2️⃣ 调度系统(移动端关键)

iOS

  • GCD / OperationQueue
  • BGTaskScheduler(后台跑)

Android

  • WorkManager

3️⃣ 缓存策略

数据 是否缓存
embedding ✅ 必须
score
分组结果

4️⃣ 增量更新(必须做)

不要全量扫描:

新增照片 → 局部计算 → 更新索引

四、模型策略(别一开始走歪)

MVP(最优性价比)

  • embedding:Vision / MobileNet
  • 不训练模型
  • 规则评分

👉 能做到 80% iPhone 效果


进阶版

  • Aesthetic 模型(美学评分)
  • 人脸质量模型(闭眼检测)

高阶版(你可以做差异化)

  • 用户偏好学习(强化学习)
  • 场景模型(人像 / 风景)

五、APM + AI 平台化(重点,拉开差距)

你现在做的不该只是“功能”,而是:

👉 端侧 AI 能力平台


抽象一层

AI Engine
 ├── Embedding Service
 ├── Ranking Service
 ├── Model Manager
 ├── Feature Store

APM 接入点

你可以监控:

  • 模型耗时
  • 电量消耗
  • 命中率(用户是否接受推荐)
  • 删除转化率

👉 关键指标:

推荐命中率 = 用户选择推荐照片 / 总推荐数

六、数据闭环(很多人做不到)

用户行为 → 日志 → 模型优化 → 下发权重

👉 你可以做:

  • 用户最终保留哪张
  • 用户手动恢复哪张

→ 反向训练 ranking


七、你这套系统的本质(说透一点)

不要把它当“图片处理”:

这是一个:端侧搜索 + 排序 + 推荐系统

和你做:

  • 搜索排序
  • Feed流推荐

是一个东西


八、给你一个现实建议(很关键)

你如果现在就想上线:

👉 别做“最强模型”,先做:

  • 时间分组
  • 清晰度评分
  • 人脸检测

就已经比 70% App 强了


如果你愿意,我可以下一步直接帮你:

👉 画一版iOS Swift / Android Kotlin 的代码级架构(类图 + 接口设计)
👉 或帮你设计embedding + score 的具体实现(含伪代码)

这一步会直接从“架构”走到“可开发”。