水果图像分类 — CNN 实验教程
FruitCNN 是一个基于 Fruits-360 数据集的 CNN 实验教程项目。从传统机器学习基线到深度卷积网络,再到迁移学习,循序渐进地展示不同方法的原理与效果。
- 数据集: 176,586 张图片,253 个水果/蔬菜类别,100×100 像素
- 实验路径: KNN 基线 → 基础 CNN → 改进 CNN → 迁移学习 → 模型对比
- 框架: TensorFlow 2.x / Keras + scikit-learn
- 交互方式: Python 脚本 + Jupyter Notebook
# 1. 克隆仓库
git clone https://github.com/your-username/FruitCNN.git
cd FruitCNN
# 2. 安装依赖
pip install -r requirements.txt
# 3. 下载数据集
# 从 Kaggle 下载 Fruits-360: https://www.kaggle.com/datasets/moltean/fruits
# 解压后将 fruits-360/ 放到项目根目录
# 4. 运行实验
python main.pyFruitCNN/
├── main.py # 主实验脚本(交互式菜单)
├── inference.py # 单张图片推理
├── config.py # 全局配置
├── requirements.txt # Python 依赖
├── README.md # 本文档
├── LICENSE # MIT License
├── .gitignore
│
├── src/ # 核心模块
│ ├── data_utils.py # 数据加载 / 预处理 / 增强
│ ├── visualization.py # 可视化(曲线、混淆矩阵、对比图)
│ ├── evaluation.py # 训练循环 / KNN 基线 / 模型对比
│ └── models/
│ ├── simple_cnn.py # 实验 1: 基础 CNN (3 层)
│ ├── improved_cnn.py # 实验 2: 改进 CNN + DeepCNN (6 层)
│ └── transfer_learning.py # 实验 3: MobileNetV2 / ResNet50 / EfficientNetB0
│
├── experiments/ # Jupyter Notebook 教程
│ ├── 01_data_exploration.ipynb # 数据探索与可视化
│ ├── 02_cnn_experiments.ipynb # CNN 实验对比
│ ├── 03_transfer_learning.ipynb # 迁移学习实验
│ └── 04_model_comparison.ipynb # 全模型横向对比
│
└── images/ # 输出图表(运行时生成)
| 实验 | 方法 | 核心点 | 预期准确率 |
|---|---|---|---|
| 0 | KNN (k=5) | 传统 ML 基线,展平像素特征 | ~68% |
| 1 | SimpleCNN | Conv-BN-Pool ×3 → FC → Softmax | ~93% |
| 2 | ImprovedCNN | +Dropout +数据增强 +GAP +更深 | ~96% |
| 2b | DeepCNN | VGG 风格 6 层 Conv (64→128→256) | ~95% |
| 3 | MobileNetV2 | 迁移学习 + 特征提取 + 微调 | ~97% |
| 3 | ResNet50 | 残差连接,经典大模型迁移 | ~97% |
| 3 | EfficientNetB0 | 高效架构迁移 | ~97% |
python main.py
# [0] KNN 基线
# [1] 基础 CNN
# [2] 改进 CNN
# [2b] 深层 CNN
# [3] 迁移学习
# [A] 运行全部 + 对比python main.py --exp 1 # 运行指定实验
python main.py --all # 运行全部实验并横向对比cd experiments
jupyter notebook
# 按 01 → 02 → 03 → 04 顺序打开python inference.py # 交互模式
python inference.py model.h5 path/to/fruit.jpg # 指定模型和图片Conv(32) → BN → Pool → Conv(64) → BN → Pool → Conv(128) → BN → Pool → Flatten → Dense(128) → Softmax
Conv(32)×2 → BN → Pool → Drop → Conv(64)×2 → BN → Pool → Drop → Conv(128)×2 → BN → Pool → Drop → GAP → Dense(256) → BN → Drop → Softmax
[MobileNetV2 / ResNet50 / EfficientNetB0 - frozen] → GAP → Drop(0.5) → Dense(253) → Softmax
↓ (微调阶段)
[MobileNetV2 / ResNet50 / EfficientNetB0 - partial unfreeze] → GAP → Drop(0.5) → Dense(253) → Softmax
编辑 config.py 或直接在 Notebook 中覆盖参数:
CNN_EPOCHS = 50 # 训练轮数
CNN_LEARNING_RATE = 1e-3 # 学习率
CNN_BATCH_SIZE = 32 # 批次大小
TRANSFER_IMAGE_SIZE = (160, 160) # 迁移学习输入尺寸| 包 | 版本 | 用途 |
|---|---|---|
| tensorflow | ≥ 2.12 | CNN 训练 / 推理 |
| scikit-learn | ≥ 1.2 | KNN 基线 / 评估指标 |
| matplotlib | ≥ 3.7 | 可视化 |
| seaborn | ≥ 0.12 | 混淆矩阵热力图 |
| numpy | ≥ 1.24 | 数值计算 |
| Pillow | ≥ 9.5 | 图像加载 |
| jupyter | ≥ 1.0 | 交互式笔记 |
- 名称: Fruits-360 (v2026.3.6.0)
- 规模: 176,586 张 100×100 RGB 图片, 253 类
- 包含: 水果、蔬菜、坚果、种子
- 论文: Fruit recognition from images using deep learning (arXiv:1712.00580)
- 授权: CC BY-SA 4.0
欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/amazing-improvement) - 提交更改 (
git commit -m 'Add amazing improvement') - 推送到分支 (
git push origin feature/amazing-improvement) - 创建 Pull Request
本项目采用 MIT License。数据集 Fruits-360 采用 CC BY-SA 4.0 授权。
Made with ❤️ for the deep learning learning community