Skip to content

Repository files navigation

🍎 FruitCNN

水果图像分类 — CNN 实验教程

Python TensorFlow License Notebooks Dataset


📖 项目简介

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.py

📁 项目结构

FruitCNN/
├── 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       # 运行全部实验并横向对比

Jupyter Notebook

cd experiments
jupyter notebook
# 按 01 → 02 → 03 → 04 顺序打开

单张推理

python inference.py                              # 交互模式
python inference.py model.h5 path/to/fruit.jpg   # 指定模型和图片

📊 模型架构对比

SimpleCNN

Conv(32) → BN → Pool → Conv(64) → BN → Pool → Conv(128) → BN → Pool → Flatten → Dense(128) → Softmax

ImprovedCNN

Conv(32)×2 → BN → Pool → Drop → Conv(64)×2 → BN → Pool → Drop → Conv(128)×2 → BN → Pool → Drop → GAP → Dense(256) → BN → Drop → Softmax

Transfer Learning

[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 交互式笔记

📚 数据集

🤝 贡献

欢迎提交 Issue 和 Pull Request!

  1. Fork 本仓库
  2. 创建特性分支 (git checkout -b feature/amazing-improvement)
  3. 提交更改 (git commit -m 'Add amazing improvement')
  4. 推送到分支 (git push origin feature/amazing-improvement)
  5. 创建 Pull Request

📄 许可证

本项目采用 MIT License。数据集 Fruits-360 采用 CC BY-SA 4.0 授权。


Made with ❤️ for the deep learning learning community

About

A comprehensive CNN experiment tutorial for fruit image classification — from KNN baseline to transfer learning. Built on Fruits-360 dataset with 253 classes.

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages