From 44031b92cd8e59308750280a93c787ce637b60a3 Mon Sep 17 00:00:00 2001 From: zhanghuan <1262329256@qq.com> Date: Wed, 17 Sep 2025 11:41:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=B6=E4=BD=9C=E4=BA=86=E5=BA=A6=E9=87=8F?= =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E7=9A=84=E5=BC=80=E5=8F=91=E8=AE=A1=E5=88=92?= =?UTF-8?q?=EF=BC=8C=E5=88=9B=E5=BB=BA=E4=BA=86=E5=87=A0=E4=B8=AA=E7=A9=BA?= =?UTF-8?q?python=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classifier/embedding_foood_classifier_app.py | 0 faiss_index/food_labels.json | 0 net/resnet_embedding.py | 0 plan.md | 256 +++++++++++++++++++ train/train_embedding.py | 0 5 files changed, 256 insertions(+) create mode 100644 classifier/embedding_foood_classifier_app.py create mode 100644 faiss_index/food_labels.json create mode 100644 net/resnet_embedding.py create mode 100644 plan.md create mode 100644 train/train_embedding.py diff --git a/classifier/embedding_foood_classifier_app.py b/classifier/embedding_foood_classifier_app.py new file mode 100644 index 0000000..e69de29 diff --git a/faiss_index/food_labels.json b/faiss_index/food_labels.json new file mode 100644 index 0000000..e69de29 diff --git a/net/resnet_embedding.py b/net/resnet_embedding.py new file mode 100644 index 0000000..e69de29 diff --git a/plan.md b/plan.md new file mode 100644 index 0000000..0b93e7e --- /dev/null +++ b/plan.md @@ -0,0 +1,256 @@ +# 食物识别系统改造计划 - 基于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 部署脚本和工具 +- 一键部署脚本 +- 环境配置检查工具 +- 模型版本管理工具 + +## 技术实现细节 + +### 网络架构设计 +```python +# 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) + +### 数据增强策略 +```python +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 +- 索引大小:≤50MB(1000个菜品) + +## 风险评估和应对 + +### 技术风险 +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. **自动标注**:利用弱监督学习减少人工标注工作量 \ No newline at end of file diff --git a/train/train_embedding.py b/train/train_embedding.py new file mode 100644 index 0000000..e69de29