增加FAISS向量数据库对所有训练图片进行向量化的过程。

This commit is contained in:
zhanghuan
2025-09-22 11:29:22 +08:00
parent be284442e4
commit 8d6555747b
4 changed files with 1307 additions and 0 deletions
+228
View File
@@ -0,0 +1,228 @@
# FAISS相似度检索系统
基于ResNet50特征提取和FAISS索引的食物图片相似度检索系统。
## 功能特性
- ✅ 使用训练好的ResNet50 Embedding模型提取图片特征向量
- ✅ 构建高效的FAISS索引用于快速相似度检索
- ✅ 支持多种索引类型(精确搜索、近似搜索)
- ✅ 完整的标签映射和元数据管理
- ✅ 命令行界面和可视化结果展示
- ✅ 批量测试和性能评估
## 文件结构
```
FoodClassifier/
├── build_faiss_index.py # FAISS索引构建器
├── faiss_similarity_search.py # 相似度检索演示程序
├── README_FAISS.md # 使用说明文档
├── net/
│ ├── resnet_embedding.py # ResNet50特征提取网络
│ └── food_net.py # 原始分类网络
├── model/
│ └── embedding_20250917_145342/
│ └── best_embedding_model.pth # 训练好的模型
├── dataset/
│ └── train/ # 训练数据集
│ ├── 回锅肉/
│ ├── 炒细面/
│ ├── 西红柿鸡蛋/
│ └── 麻辣小面/
└── faiss_vector_db/
└── faiss_index/ # 生成的FAISS索引文件
├── faiss_index.bin # FAISS索引
├── image_paths.pkl # 图片路径映射
├── labels.pkl # 标签映射
├── class_info.json # 类别信息
└── embeddings.npy # 特征向量数组
```
## 安装依赖
```bash
pip install torch torchvision
pip install faiss-cpu # 或 faiss-gpu(如果有GPU
pip install pillow numpy tqdm matplotlib
```
## 使用方法
### 1. 构建FAISS索引
首次使用需要构建FAISS索引:
```bash
python build_faiss_index.py
```
这将:
- 加载训练好的ResNet50 Embedding模型
- 遍历训练集所有图片,提取512维特征向量
- 构建FAISS索引文件
- 保存标签映射和元数据
### 2. 相似度检索
#### 查看索引信息
```bash
python faiss_similarity_search.py --info
```
#### 单张图片相似度检索
```bash
# 基本搜索
python faiss_similarity_search.py --query dataset/test/回锅肉/aug_000.jpg
# 显示图片结果
python faiss_similarity_search.py --query dataset/test/回锅肉/aug_000.jpg --show_images
# 保存结果图片
python faiss_similarity_search.py --query dataset/test/回锅肉/aug_000.jpg --show_images --save_result
# 返回更多结果
python faiss_similarity_search.py --query dataset/test/回锅肉/aug_000.jpg --k 10
```
#### 批量测试
```bash
# 批量测试测试集
python faiss_similarity_search.py --batch_test dataset/test --max_tests 20
# 批量测试验证集
python faiss_similarity_search.py --batch_test dataset/val --max_tests 10
```
## 核心类说明
### FAISSIndexBuilder
负责构建FAISS索引的核心类:
```python
from faiss_vector_db.build_faiss_index import FAISSIndexBuilder
# 创建索引构建器
builder = FAISSIndexBuilder(
model_path="../model/embedding_20250917_145342/best_embedding_model.pth",
embedding_dim=512
)
# 构建完整索引
index = builder.build_complete_index(
train_dir="../dataset/train",
output_dir="faiss_index",
batch_size=16,
index_type='flat' # 'flat', 'ivf', 'hnsw'
)
```
### FAISSSearcher
负责相似度检索的核心类:
```python
from faiss_vector_db.build_faiss_index import FAISSSearcher
# 创建检索器
searcher = FAISSSearcher(
index_dir="faiss_vector_db/faiss_index",
model_path="model/embedding_20250917_145342/best_embedding_model.pth"
)
# 搜索相似图片
results = searcher.search_similar("test_image.jpg", k=5)
# 返回: [(图片路径, 类别名称, 相似度分数), ...]
# 按类别搜索
class_images = searcher.search_by_class("回锅肉", k=10)
# 返回: [(图片路径, 索引), ...]
```
## 索引类型说明
### 1. Flat索引 (推荐)
- **类型**: `'flat'`
- **特点**: 精确搜索,速度快
- **适用**: 中小规模数据集(< 100万向量)
- **优点**: 搜索结果完全准确
- **缺点**: 内存占用较大
### 2. IVF索引
- **类型**: `'ivf'`
- **特点**: 近似搜索,内存效率高
- **适用**: 大规模数据集(> 100万向量)
- **优点**: 内存占用小,搜索速度快
- **缺点**: 搜索结果可能不是最优
### 3. HNSW索引
- **类型**: `'hnsw'`
- **特点**: 图结构索引,搜索速度极快
- **适用**: 需要极快搜索速度的场景
- **优点**: 搜索速度最快
- **缺点**: 构建时间较长,内存占用中等
## 性能优化建议
### 1. 批处理大小
- GPU内存充足:`batch_size=32`
- GPU内存有限:`batch_size=16`
- 仅CPU`batch_size=8`
### 2. 索引选择
- 数据量 < 10万:使用 `'flat'`
- 数据量 10万-100万:使用 `'ivf'`
- 数据量 > 100万:使用 `'hnsw'`
### 3. 特征向量维度
- 默认512维提供良好的精度
- 可调整为256维以节省存储空间
- 1024维可提供更高精度(需重新训练)
## 输出文件说明
构建完成后,`faiss_vector_db/faiss_index/` 目录包含:
- **faiss_index.bin**: FAISS索引文件
- **image_paths.pkl**: 图片路径列表(pickle格式)
- **labels.pkl**: 对应的标签列表(pickle格式)
- **class_info.json**: 类别信息和元数据(JSON格式)
- **embeddings.npy**: 特征向量数组(NumPy格式,可选)
## 常见问题
### Q: 如何更新索引?
A: 重新运行 `build_faiss_index.py`,会覆盖原有索引。
### Q: 如何添加新的图片类别?
A: 将新类别图片添加到 `dataset/train/` 目录,然后重新构建索引。
### Q: 搜索速度慢怎么办?
A: 尝试使用 `'ivf'``'hnsw'` 索引类型,或减少返回结果数量。
### Q: 内存不足怎么办?
A: 减少 `batch_size`,或使用 `'ivf'` 索引类型。
### Q: 如何在其他项目中使用?
A: 复制 `build_faiss_index.py` 和相关模型文件,修改路径配置即可。
## 扩展功能
系统支持以下扩展:
1. **多模态检索**: 结合文本特征进行检索
2. **在线更新**: 支持动态添加新图片到索引
3. **分布式部署**: 支持多机部署和负载均衡
4. **Web接口**: 提供REST API接口
5. **移动端集成**: 支持移动端实时检索
## 技术细节
- **特征提取**: ResNet50 + 全连接层 → 512维向量
- **相似度计算**: 余弦相似度(内积,向量已归一化)
- **索引结构**: FAISS多种索引类型支持
- **数据格式**: 支持 JPG、PNG、BMP 等常见图片格式
- **预处理**: ImageNet标准化,224x224分辨率
## 许可证
本项目遵循 MIT 许可证。