Course Project · Pattern Recognition

基于 CNN 的瓜果蔬菜识别系统

在模式识别课程项目中完成的图像分类实验,基于 Fruits and Vegetables Image Recognition Dataset 和预训练 VGG16,完成 36 类果蔬图像的数据预处理、数据增强、迁移学习训练、验证评估和单图预测展示。

36 类 苹果、香蕉、胡萝卜、番茄等果蔬类别
3825 张 训练 3115、验证 351、测试 359
96.58% 训练过程中保存的最佳验证准确率
96.66% best_model.pth 在测试集上的准确率

Overview

项目概览

项目使用 PyTorch 搭建完整的图像分类流程。数据部分读取训练、验证和测试三份目录结构,统一将图像转换为 RGB 并调整到 224x224;训练集增加随机水平翻转、15° 随机旋转和颜色抖动;模型部分复用 ImageNet 预训练的 VGG16 特征提取层,冻结前 10 层参数,并将分类器输出调整为 36 类;训练阶段使用交叉熵损失、SGD 优化器和验证损失触发的学习率调度器,最终保存验证准确率最高的权重。

PyTorch torchvision VGG16 迁移学习 数据增强 CrossEntropyLoss SGD

Visual Evidence

数据与预测展示

果蔬图像数据集样例九宫格
数据集样例 训练集中随机抽取的果蔬样本,用于确认类别目录、图像质量和数据分布。
原始图像与多次数据增强结果
数据增强 展示随机翻转、旋转和颜色抖动后的图像变化,帮助模型适应角度与光照差异。
测试集单张图像预测示例
预测示例 测试集中单张图像预测结果,notebook 输出示例置信度为 0.9128

Pipeline

实验流程

数据集结构读取

trainvalidationtest 三个目录读取样本,类别名由子文件夹排序生成,建立 class_to_idx 映射。

图像预处理与增强

训练集使用 Resize(224,224)、水平翻转、随机旋转、颜色抖动、Tensor 转换和 ImageNet 均值方差归一化。

自定义 Dataset

FruitVegDataset 过滤 png / jpg / jpeg 文件,加载图像时统一转为 RGB,再返回图像 Tensor 与类别标签。

VGG16 迁移学习

加载预训练 VGG16 的 features,冻结前 10 个参数组,保留 AdaptiveAvgPool2d((7,7)),重写分类器输出 36 类。

训练与验证

每轮训练后在验证集评估损失与准确率,使用 ReduceLROnPlateau 调整学习率,并将最佳验证模型保存为 best_model.pth

测试与预测展示

加载最佳模型后在测试集计算整体准确率和各类别准确率,并通过 predict_image 输出单张图像类别与置信度。

Modules

模块拆解

数据探索模块

统计 36 个类别和不同数据划分的样本数量,并生成样例图,帮助确认训练集、验证集和测试集结构。

增强与归一化模块

训练集加入随机扰动,验证和测试阶段只保留确定性预处理,避免评估指标受到随机增强影响。

模型构建模块

基于预训练 VGG16 提取通用视觉特征,再通过 4096 维全连接层和 Dropout 完成果蔬类别判别。

训练控制模块

使用 batch size 32、20 个 epoch、学习率 0.001、动量 0.9 的 SGD 配置,并在验证集上保存最佳权重。

评估统计模块

输出测试集整体准确率,并逐类统计分类效果,便于观察香蕉、甜玉米、土豆等类别的识别差异。

单图预测模块

predict_image 将外部图像经过同一套验证预处理后输入模型,返回预测类别和 softmax 置信度。

Code Highlights

算法、框架与关键参数

这一部分从 001.ipynb 中提炼,展示数据读取、模型结构、训练配置和预测函数中的具体实现细节。

数据集与增强

数据路径:Fruits and Vegetables Image Recognition Dataset
划分:train / validation / test
类别数:36
训练样本:3115
验证样本:351
测试样本:359

训练增强:
Resize(224,224)
RandomHorizontalFlip()
RandomRotation(15)
ColorJitter(0.2,0.2,0.2)
Normalize([0.485,0.456,0.406],
          [0.229,0.224,0.225])

VGG16 模型改造

模型类:class VGG16(nn.Module)
预训练特征层:models.vgg16(pretrained=True).features
池化层:AdaptiveAvgPool2d((7,7))
分类器:
Linear(512*7*7, 4096)
ReLU(True) + Dropout()
Linear(4096, 4096)
ReLU(True) + Dropout()
Linear(4096, num_classes)

冻结策略:features.parameters()[:10]

训练配置

设备:cuda if available else cpu
损失函数:nn.CrossEntropyLoss()
优化器:optim.SGD
学习率:lr=0.001
动量:momentum=0.9
批量大小:batch_size=32
训练轮数:num_epochs=20
调度器:ReduceLROnPlateau(patience=3)
最佳权重:torch.save(..., 'best_model.pth')

评估与预测

整体评估:test_acc = correct / total
测试准确率:96.66%
逐类统计:
class_correct[label] += c[i].item()
class_total[label] += 1

单图预测:
predict_image(image_path, model, transform, class_names)
预处理:transform(image).unsqueeze(0)
概率:torch.nn.functional.softmax(outputs, dim=1)
返回:predicted_class + confidence

Implementation

关键实现内容

Result

实验结果与收获

训练日志显示,模型从第 1 轮训练准确率 32.68%、验证准确率 74.64% 起步,到第 20 轮达到训练准确率 98.17%、验证准确率 96.01%。训练过程中第 9 轮保存了最佳验证模型,验证准确率为 96.58%。

加载 best_model.pth 后,测试集整体准确率为 96.66%。逐类统计中,苹果、白菜、黄瓜、葡萄、芒果、番茄、西瓜等多个类别达到 100%;香蕉为 77.78%,甜椒和土豆为 70.00%,反映出部分类别在样本数量、外观相似性或拍摄条件上仍有进一步优化空间。

这个项目完整走通了模式识别课程中的图像分类实践链路:从数据组织、预处理、模型迁移、训练验证到测试评估和预测可视化,适合作为机器学习与计算机视觉方向的课程项目展示。

页面内容基于当前文件夹中的 001.ipynb、实验报告和输出图整理。模型权重 best_model.pth 体积较大,页面只展示实验流程和结果,不在浏览器端加载模型文件。