# KNN-dogs **Repository Path**: bcqcbh/knn-dogs ## Basic Information - **Project Name**: KNN-dogs - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-03 - **Last Updated**: 2025-11-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 一、项目简介 本项目使用传统机器学习的集成学习方法实现猫狗二分类任务,核心特点: 低内存消耗:图片尺寸优化(64×64)+ PCA 降维,25000 张样本训练仅需 2GB 以内内存 高性价比:集成随机森林与逻辑回归,测试准确率达 85%+ 交互友好:Gradio 网页界面,支持图片上传、实时预测、置信度展示 跨平台兼容:Windows/Linux/macOS 均可运行 ## 二、项目结构 plaintext cat-dog-classification/ ├─ train_ensemble.py # 模型训练脚本(核心) ├─ ensemble_webapp.py # Gradio网页应用脚本 ├─ data/ # 数据集文件夹(需手动创建) │ └─ train/ # 训练集图片(猫/狗图片) │ ├─ cat.0.jpg │ ├─ dog.0.jpg │ └─ ...(其他图片) ├─ saved_models/ # 训练后生成的模型文件(自动创建) │ ├─ ensemble_model.joblib # 集成学习模型 │ ├─ scaler.joblib # 特征标准化器 │ └─ pca.joblib # PCA降维模型 └─ README.md # 项目说明文档 ## 三、环境准备 依赖库安装 bash # 安装核心依赖 pip install numpy pillow scikit-learn joblib gradio pandas 核心依赖说明: numpy:数组计算 pillow:图片处理 scikit-learn:机器学习模型(随机森林、逻辑回归、PCA 等) joblib:模型保存与加载 gradio:交互式网页应用开发 ## 数据集准备 创建数据集目录:在项目根目录下创建 data/train 文件夹 下载猫狗数据集: 推荐使用 Kaggle 猫狗分类数据集(下载地址) 解压后将所有猫图片(cat.xxx.jpg)和狗图片(dog.xxx.jpg)放入 data/train 文件夹 数据集要求: 图片格式:JPG(支持 PNG/BMP 等常见格式,会自动转换) 命名规则:猫图片以 cat 开头,狗图片以 dog 开头(如 cat.123.jpg、dog.456.jpg) 建议样本数量:≥1000 张(官方数据集 25000 张最佳) ## 使用步骤 1. 模型训练 运行训练脚本,自动完成数据处理、模型训练、结果评估和模型保存: bash python train_ensemble.py 训练流程说明: 数据预处理: 图片统一缩放为 64×64 像素(降低内存占用) 转换为 RGB 模式 + 归一化(0-1 范围) 展平为一维特征向量(64×64×3=12288 维) 数据划分:8:2 比例划分训练集 / 测试集(分层抽样,保证类别平衡) 特征优化: 标准化(消除量纲影响) PCA 降维(12288 维→200 维,保留 90%+ 方差) 模型训练: 基础模型:随机森林(100 棵树)+ 逻辑回归 集成策略:硬投票 + 软投票对比,选择最优模型 模型保存:自动生成 saved_models 文件夹,保存 3 个核心文件 训练输出示例: plaintext ================================================== 开始数据处理... ================================================== 数据路径验证通过:/xxx/cat-dog-classification/data/train 找到 25000 张图片 已处理 1000/25000 张图片 ... 数据处理完成! 展平后图片数据形状: (25000, 12288) 标签数据形状: (25000,) 猫的数量: 12500 狗的数量: 12500 ================================================== 划分训练集和测试集... ================================================== 训练集大小: 20000 样本 测试集大小: 5000 样本 特征维度: 12288 维 ================================================== 使用PCA进行降维... ================================================== 原始特征维度: 12288 维 降维后特征维度: 200 维 保留的方差比例: 92.35% PCA降维完成! ================================================== 构建集成学习模型... ================================================== ✓ 随机森林分类器配置完成 ✓ 逻辑回归分类器配置完成 ✓ 硬投票集成模型构建完成 ✓ 软投票集成模型构建完成 ================================================== 开始模型训练... ================================================== [1/2] 训练硬投票集成模型... ✓ 硬投票模型训练完成 训练集准确率: 0.9872 测试集准确率: 0.8640 测试集F1分数: 0.8635 [2/2] 训练软投票集成模型... ✓ 软投票模型训练完成 训练集准确率: 0.9915 测试集准确率: 0.8724 测试集F1分数: 0.8719 ================================================== 投票策略对比: ================================================== 硬投票 - 测试集准确率: 0.8640, F1分数: 0.8635 软投票 - 测试集准确率: 0.8724, F1分数: 0.8719 ✓ 选择软投票模型作为最终模型 ================================================== 保存模型和相关组件... ================================================== ✓ 集成模型已保存到: ./saved_models/ensemble_model.joblib ✓ 标准化器已保存到: ./saved_models/scaler.joblib ✓ PCA模型已保存到: ./saved_models/pca.joblib ================================================== 所有任务完成! ================================================== 模型训练总结: - 训练样本数: 20000 - 测试样本数: 5000 - 图片尺寸: 64×64 - 最终特征维度: 200 维 - 最终模型测试准确率: 0.8724 - 最终模型测试F1分数: 0.8719 2. 网页应用预测 训练完成后,运行网页应用脚本,通过浏览器进行交互式预测: bash python ensemble_webapp.py 应用启动输出: plaintext ================================================== 正在加载模型... ================================================== 加载集成学习模型... ✓ 模型加载成功: ./saved_models/ensemble_model.joblib 加载标准化器... ✓ 标准化器加载成功: ./saved_models/scaler.joblib 加载PCA模型... ✓ PCA模型加载成功: ./saved_models/pca.joblib ================================================== 所有模型加载完成! ================================================== ================================================== 启动Gradio网页应用... ================================================== Running on local URL: http://127.0.0.1:7860 To create a public link, set `share=True` in `launch()`. 预测使用说明: 打开浏览器,访问 http://127.0.0.1:7860 上传图片:点击左侧上传区域,选择一张猫或狗的图片 查看结果: 自动预测类别(猫 / 狗) 显示置信度分布(猫概率 + 狗概率) 展示模型核心参数(图片尺寸、特征维度等) 网页应用界面特点: 简洁直观:上传区域 + 结果展示区分离 实时响应:上传图片后自动预测,无需手动触发 错误提示:支持图片格式校验、模型加载状态提示 提示说明:包含支持格式、最佳实践等指导信息 ## 四、关键参数说明 训练脚本可配置参数 在 train_ensemble.py 中可调整以下核心参数: python 运行 IMAGE_SIZE = (64, 64) # 图片尺寸(可改为96×96提升准确率,但增加内存消耗) n_components = 200 # PCA降维维度(可调整为300提升准确率) rf_classifier = RandomForestClassifier( n_estimators=100, # 随机森林树的数量 max_depth=15, # 树的最大深度(防止过拟合) min_samples_split=8, # 分裂节点最小样本数 min_samples_leaf=4 # 叶节点最小样本数 ) lr_classifier = LogisticRegression( C=1.0, # 正则化强度(越小正则化越强) max_iter=1000 # 最大迭代次数 ) 网页应用可配置参数 在 ensemble_webapp.py 中可调整: python 运行 IMAGE_SIZE = (64, 64) # 必须与训练脚本一致! server_name = "127.0.0.1" # 访问地址(0.0.0.0允许局域网访问) server_port = 7860 # 端口号(可改为8080等未占用端口) share = False # 是否生成公共链接(境外服务器可用) ## 五、常见问题解决 1. 训练时出现 "Killed" 错误 原因:内存不足(原始 224×224 尺寸导致特征维度过高) 解决方案:确保 IMAGE_SIZE = (64, 64),关闭其他占用内存的程序 2. 网页应用提示 "模型未加载" 原因:未训练模型或模型文件路径错误 解决方案: 先运行 train_ensemble.py 完成训练 确保 saved_models 文件夹与 ensemble_webapp.py 在同一目录 检查 saved_models 中是否有 3 个 .joblib 文件 3. 预测结果准确率低 原因:样本数量不足、图片质量差、参数配置不当 解决方案: 增加样本数量(建议≥10000 张) 上传清晰的正面照片(避免遮挡、模糊、多动物图片) 调整训练参数(如增加随机森林树数量、PCA 维度) 4. 图片上传失败 原因:图片格式不支持、图片损坏、文件过大 解决方案: 转换为 JPG 格式(推荐) 压缩图片大小(建议≤5MB) 检查图片完整性(可通过图片查看器打开验证) 技术细节 模型原理 集成学习策略:结合随机森林(处理非线性特征)和逻辑回归(处理线性特征),通过投票机制提升泛化能力 特征优化:PCA 降维减少计算量和过拟合风险,同时保留核心特征 数据预处理:标准化消除特征量纲影响,确保模型训练稳定性 性能指标 训练时间:25000 样本约 10-20 分钟(取决于 CPU 核心数) 测试准确率:85%-88%(64×64 尺寸)/ 88%-90%(96×96 尺寸) 内存占用:训练峰值≤2GB,预测时≤500MB ## 六、个人信息 - 学号: 202352320105 - 年级: 2023 - 专业: 智能科学与技术 - 班级: 一班