Files

8.3 KiB
Raw Permalink Blame History

食物识别系统改造计划 - 基于ResNet50+FAISS的Embedding方案

项目背景

原有系统采用End-to-End方式训练分类模型,存在新增菜品时需要重新训练整个模型的问题。现改造为基于ResNet50的Embedding模型+FAISS向量数据库的方案,实现快速新增菜品的能力。

改造目标

  1. 保留现有End-to-End方案的完整性
  2. 新增基于Embedding的识别方案
  3. 支持快速新增菜品(仅需20余张照片)
  4. 两套方案并行运行,便于对比和切换

开发步骤

阶段一:基础架构搭建

1.1 创建新的目录结构

FoodClassifier/
├── embedding_net/              # 新增:Embedding网络模块
│   ├── __init__.py
│   ├── resnet_embedding.py     # ResNet50 Embedding模型
│   └── embedding_utils.py      # Embedding相关工具函数
├── embedding_train/            # 新增:Embedding模型训练
│   ├── train_embedding.py      # 训练脚本
│   └── data_loader.py          # 数据加载器
├── embedding_classifier/       # 新增:基于Embedding的分类器
│   ├── embedding_classifier_app.py  # GUI应用
│   └── faiss_manager.py        # FAISS数据库管理
├── embedding_model/            # 新增:Embedding模型存储
│   ├── embedding_model.pth     # 训练好的Embedding模型
│   └── faiss_index/            # FAISS索引文件夹
│       ├── food_embeddings.index  # FAISS索引文件
│       └── food_labels.json    # 标签映射文件
├── embedding_toAndroid/        # 新增:Android部署
│   └── export_embedding_mobile.py  # 移动端模型导出
└── embedding_demo/             # 新增:演示和测试
    ├── test_embedding.py       # 测试脚本
    └── compare_methods.py      # 两种方法对比

1.2 更新配置文件

  • settings/settings.py 中新增Embedding相关配置
  • 保持原有配置不变,新增独立的Embedding配置段

阶段二:ResNet50 Embedding模型开发

2.1 设计Embedding网络架构 (embedding_net/resnet_embedding.py)

  • 基于预训练的ResNet50构建
  • 移除最后的分类层,输出512维特征向量
  • 支持移动端部署的预处理方法
  • 实现特征提取和相似度计算功能

2.2 实现Embedding工具函数 (embedding_net/embedding_utils.py)

  • 特征向量标准化函数
  • 余弦相似度计算
  • 批量特征提取
  • 特征向量可视化工具

阶段三:训练数据准备和模型训练

3.1 数据加载器开发 (embedding_train/data_loader.py)

  • 复用现有dataset目录结构
  • 实现三元组损失(Triplet Loss)的数据采样
  • 支持在线难样本挖掘
  • 数据增强策略优化

3.2 训练脚本开发 (embedding_train/train_embedding.py)

  • 实现三元组损失训练
  • 添加中心损失(Center Loss)提升类内聚合
  • 学习率调度和早停机制
  • 训练过程可视化和日志记录
  • 模型验证和性能评估

阶段四:FAISS向量数据库集成

4.1 FAISS管理器开发 (embedding_classifier/faiss_manager.py)

  • FAISS索引的创建、保存和加载
  • 向量的增删改查操作
  • 支持余弦相似度搜索
  • 批量向量操作接口
  • 索引优化和压缩

4.2 向量数据库构建

  • 将训练集所有图片转换为特征向量
  • 构建FAISS索引文件
  • 创建标签映射文件
  • 实现快速相似度检索

阶段五:分类器应用开发

5.1 GUI应用开发 (embedding_classifier/embedding_classifier_app.py)

  • 参考现有 food_classifier_app.py 的界面设计
  • 实现基于Embedding的图片识别
  • 显示相似度分数和置信度
  • 支持批量识别和结果导出
  • 添加新菜品的快速入库功能

5.2 新菜品快速添加功能

  • 图片批量上传界面
  • 自动特征提取和向量化
  • FAISS索引实时更新
  • 新菜品标签管理

阶段六:移动端部署支持

6.1 移动端模型导出 (embedding_toAndroid/export_embedding_mobile.py)

  • 参考现有 toAndroid.py 的导出流程
  • 导出TorchScript格式的Embedding模型
  • 优化模型大小和推理速度
  • 生成移动端配置文件

6.2 移动端集成方案

  • 提供Android集成示例代码
  • FAISS索引的移动端适配
  • 离线推理方案设计

阶段七:测试和对比验证

7.1 功能测试 (embedding_demo/test_embedding.py)

  • 单张图片识别测试
  • 批量图片识别测试
  • 新菜品添加流程测试
  • 性能基准测试

7.2 方法对比 (embedding_demo/compare_methods.py)

  • End-to-End vs Embedding方法对比
  • 识别准确率对比
  • 推理速度对比
  • 新菜品扩展能力对比
  • 生成对比报告

阶段八:文档和部署

8.1 技术文档编写

  • API文档
  • 使用说明文档
  • 部署指南
  • 性能调优指南

8.2 部署脚本和工具

  • 一键部署脚本
  • 环境配置检查工具
  • 模型版本管理工具

技术实现细节

网络架构设计

# ResNet50 Embedding模型结构
ResNet50Embedding(
  backbone: ResNet50(pretrained=True)
  embedding_layer: Linear(2048 -> 512)
  l2_normalize: True
)

损失函数设计

  • 主损失:Triplet Loss (margin=0.3)
  • 辅助损失:Center Loss (weight=0.1)
  • 总损失:L_total = L_triplet + λ * L_center

FAISS索引配置

  • 索引类型:IndexFlatIP (内积索引,适合余弦相似度)
  • 特征维度:512
  • 搜索策略:Top-K检索 (K=5)

数据增强策略

embedding_transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.RandomRotation(15),
    transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),
    transforms.RandomAffine(degrees=0, translate=(0.1, 0.1)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

命名规范

文件命名

  • 模块文件:{功能}_embedding.py
  • 配置文件:embedding_settings.py
  • 模型文件:embedding_model_v{版本}.pth
  • 索引文件:food_embeddings_v{版本}.index

类命名

  • 网络模型:ResNet50EmbeddingNet
  • 数据管理:FAISSFoodManager
  • 应用界面:EmbeddingFoodClassifierApp

函数命名

  • 特征提取:extract_food_embedding()
  • 相似度搜索:search_similar_foods()
  • 索引更新:update_faiss_index()

性能目标

识别性能

  • 识别准确率:≥95%(与End-to-End方法相当)
  • 推理速度:≤100ms/张(CPU环境)
  • 新菜品添加:≤30秒(20张图片)

系统性能

  • 内存占用:≤2GB
  • 模型大小:≤100MB
  • 索引大小:≤50MB1000个菜品)

风险评估和应对

技术风险

  1. 特征表达能力不足

    • 风险:Embedding可能无法充分表达食物特征
    • 应对:采用多尺度特征融合,增加特征维度
  2. 相似度阈值设定困难

    • 风险:难以确定合适的相似度阈值
    • 应对:通过验证集自动调优,支持动态阈值
  3. 新菜品泛化能力

    • 风险:新菜品可能与现有菜品特征重叠
    • 应对:实现特征空间可视化,人工审核机制

实施风险

  1. 开发周期延长

    • 风险:新架构开发复杂度高
    • 应对:分阶段实施,优先核心功能
  2. 性能不达预期

    • 风险:识别准确率或速度不满足要求
    • 应对:保留原有方案,渐进式替换

项目时间规划

  • 第1-2周:阶段一、二(基础架构和网络设计)
  • 第3-4周:阶段三(数据准备和模型训练)
  • 第5-6周:阶段四、五(FAISS集成和应用开发)
  • 第7周:阶段六(移动端支持)
  • 第8周:阶段七、八(测试验证和文档)

成功标准

  1. 功能完整性:所有计划功能正常运行
  2. 性能达标:识别准确率和速度满足目标
  3. 易用性:新菜品添加流程简单高效
  4. 稳定性:长时间运行无内存泄漏或崩溃
  5. 可扩展性:支持1000+菜品规模

后续优化方向

  1. 模型压缩:量化、剪枝等技术减小模型大小
  2. 增量学习:支持在线学习新菜品特征
  3. 多模态融合:结合文本描述提升识别准确率
  4. 分布式部署:支持大规模并发识别请求
  5. 自动标注:利用弱监督学习减少人工标注工作量