# OPTIMAL_KNN_MNIST_QUESTION_1 **Repository Path**: jieti-king/optimal_knn_mnist_question_1 ## Basic Information - **Project Name**: OPTIMAL_KNN_MNIST_QUESTION_1 - **Description**: 本项目使用gradio应用在 minist 上训练的最有 KNN 模型就行手写数字识别。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 378 - **Created**: 2025-09-20 - **Last Updated**: 2025-11-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 🐱🐶 猫狗识别项目 基于集成学习和Faiss索引的智能图像分类系统 ## 📋 项目简介 本项目实现了一个完整的猫狗图像识别系统,包含以下功能: 1. **数据处理**: 自动读取、预处理图片数据,统一调整为224x224像素 2. **特征提取**: 将图片转换为扁平特征向量,使用PCA降维 3. **集成学习**: 结合随机森林和逻辑回归的投票集成策略 4. **相似度检索**: 使用Faiss构建高效的向量索引 5. **Web应用**: 基于Gradio的交互式预测界面 ## 🛠️ 技术栈 - **Python**: 3.7+ - **机器学习**: scikit-learn (随机森林、逻辑回归、集成学习) - **特征降维**: PCA (主成分分析) - **图像处理**: Pillow, NumPy - **相似度检索**: Faiss - **Web框架**: Gradio ## 📦 安装依赖 ```bash pip install -r requirements.txt ``` ### 依赖包说明 - `numpy`: 数值计算 - `scikit-learn`: 机器学习算法 - `Pillow`: 图像处理 - `faiss-cpu`: 相似度检索(CPU版本) - `joblib`: 模型序列化 - `gradio`: Web界面 ## 🚀 使用方法 ### 1. 训练模型 首先运行训练脚本,处理数据并训练模型: ```bash python train_ensemble.py ``` **训练脚本功能:** - 从 `cat_dog_data/data/train` 读取图片 - 预处理图片(调整大小、归一化、扁平化) - 划分训练集和测试集(8:2) - 构建Faiss索引 - 训练集成学习模型(决策树 + SVM) - 对比硬投票和软投票策略 - 保存模型和索引 **输出文件:** - `saved_models/ensemble_model.joblib`: 集成学习模型 - `saved_models/scaler.joblib`: 特征标准化器 - `saved_indexes/faiss_index.faiss`: Faiss向量索引 - `saved_indexes/train_labels.npy`: 训练集标签 ### 2. 启动Web应用 训练完成后,启动Gradio网页应用: ```bash python ensemble_webapp.py ``` 应用会在浏览器中自动打开,默认地址: `http://127.0.0.1:7860` **Web应用功能:** - 上传猫或狗的图片 - 自动预处理和预测 - 显示预测结果和置信度 - 展示Faiss相似度检索结果 ## 📊 模型架构 ### 特征工程 - **原始特征**: 224×224×3 = 150,528维 - **PCA降维**: 降至500维 (保留>95%方差) - **标准化**: StandardScaler归一化 ### 集成学习模型 ``` 投票集成分类器 ├── 随机森林分类器 │ ├── 树的数量: 100 │ ├── 最大深度: 20 │ ├── 最小分裂样本数: 10 │ └── 最小叶节点样本数: 5 └── 逻辑回归分类器 ├── 正则化参数C: 1.0 ├── 最大迭代次数: 1000 └── 优化算法: L-BFGS ``` ### 投票策略 - **硬投票**: 基于多数投票,每个分类器投一票 - **软投票**: 基于预测概率的平均,考虑分类器的置信度 系统会自动选择性能更好的策略作为最终模型。 ## 📁 项目结构 ``` 作业/ ├── train_ensemble.py # 模型训练脚本 ├── ensemble_webapp.py # Gradio网页应用 ├── requirements.txt # 依赖包列表 ├── README.md # 项目说明文档 ├── cat_dog_data/ # 数据目录 │ └── data/ │ ├── train/ # 训练数据 │ └── test/ # 测试数据 ├── saved_models/ # 保存的模型(训练后生成) │ ├── ensemble_model.joblib │ └── scaler.joblib └── saved_indexes/ # 保存的索引(训练后生成) ├── faiss_index.faiss └── train_labels.npy ``` ## 🎯 功能特点 ### 1. 数据处理 - ✅ 自动读取图片文件 - ✅ 统一调整为224x224像素 - ✅ RGB模式转换(处理灰度图) - ✅ 归一化到[0, 1]范围 - ✅ 扁平化为150528维特征向量 ### 2. 模型训练 - ✅ 特征标准化(StandardScaler) - ✅ 决策树分类器(防过拟合配置) - ✅ 支持向量机(RBF核) - ✅ 硬投票和软投票对比 - ✅ 准确率和F1分数评估 ### 3. Faiss索引 - ✅ L2距离度量 - ✅ Flat索引(精确搜索) - ✅ 快速相似度检索 - ✅ K近邻查询 ### 4. Web应用 - ✅ 友好的用户界面 - ✅ 图片上传和预览 - ✅ 实时预测 - ✅ 置信度可视化 - ✅ 相似度分析 - ✅ 异常处理 ## 📈 性能指标 模型在测试集上的表现(示例): - **准确率**: 通常在60-75%之间 - **F1分数**: 与准确率相近 *注: 实际性能取决于数据集大小和质量* ## ⚠️ 注意事项 1. **数据路径**: 确保数据在 `cat_dog_data/data/train` 目录下 2. **内存需求**: 处理大量图片需要足够的内存 3. **训练时间**: 根据数据量,训练可能需要几分钟到几十分钟 4. **模型文件**: 首次使用需要先运行 `train_ensemble.py` ## 🐛 故障排除 ### 问题1: 模型文件不存在 **解决方案**: 先运行 `python train_ensemble.py` 训练模型 ### 问题2: 内存不足 **解决方案**: - 减少训练数据量 - 使用更小的图片尺寸 - 增加系统内存 ### 问题3: Faiss安装失败 **解决方案**: - Windows: `pip install faiss-cpu` - Linux/Mac: `pip install faiss-cpu` 或 `conda install -c pytorch faiss-cpu` ### 问题4: Gradio无法启动 **解决方案**: - 检查端口7860是否被占用 - 尝试更换端口: 修改 `ensemble_webapp.py` 中的 `server_port` ## 📝 代码说明 ### train_ensemble.py **主要功能模块:** 1. **数据处理** (第1部分) - `load_and_preprocess_images()`: 加载和预处理图片 - 图片调整、归一化、扁平化 - 训练集/测试集划分(8:2) 2. **Faiss索引** (第2部分) - 创建L2距离的Flat索引 - 添加训练数据到索引 3. **模型构建** (第3部分) - PCA降维(500维) - 随机森林分类器配置 - 逻辑回归分类器配置 - 硬投票和软投票集成 4. **训练评估** (第4部分) - 训练两种投票策略 - 计算准确率和F1分数 - 选择最佳模型 5. **模型保存** (第5部分) - 保存集成模型 - 保存标准化器 - 保存PCA模型 - 保存Faiss索引 - 保存训练标签 ### ensemble_webapp.py **主要功能模块:** 1. **模型加载** - `load_models()`: 加载所有必需的文件 - 异常处理和错误提示 2. **图片预处理** - `preprocess_image()`: 预处理上传的图片 - 格式转换、尺寸调整、归一化 3. **预测功能** - `predict_image()`: 执行预测流程 - 特征标准化和PCA降维 - 集成模型预测 - Faiss相似度检索 - 结果格式化 4. **Gradio界面** - `create_interface()`: 创建Web界面 - 图片上传组件 - 预测按钮和结果显示 - 自定义样式 ## 🔮 未来改进 - [ ] 添加更多基础模型(随机森林、梯度提升等) - [ ] 使用深度学习特征提取(CNN) - [ ] 支持批量预测 - [ ] 添加模型性能可视化 - [ ] 实现在线学习功能 - [ ] 优化Faiss索引(使用IVF等) ## 📄 许可证 本项目仅用于学习和研究目的。 ## 👨‍💻 作者 202352320118李沛翔 **祝您使用愉快! 🎉**