数据集结构读取
从 train、validation、test 三个目录读取样本,类别名由子文件夹排序生成,建立 class_to_idx 映射。
Overview
项目使用 PyTorch 搭建完整的图像分类流程。数据部分读取训练、验证和测试三份目录结构,统一将图像转换为 RGB 并调整到 224x224;训练集增加随机水平翻转、15° 随机旋转和颜色抖动;模型部分复用 ImageNet 预训练的 VGG16 特征提取层,冻结前 10 层参数,并将分类器输出调整为 36 类;训练阶段使用交叉熵损失、SGD 优化器和验证损失触发的学习率调度器,最终保存验证准确率最高的权重。
Visual Evidence
0.9128。
Pipeline
从 train、validation、test 三个目录读取样本,类别名由子文件夹排序生成,建立 class_to_idx 映射。
训练集使用 Resize(224,224)、水平翻转、随机旋转、颜色抖动、Tensor 转换和 ImageNet 均值方差归一化。
FruitVegDataset 过滤 png / jpg / jpeg 文件,加载图像时统一转为 RGB,再返回图像 Tensor 与类别标签。
加载预训练 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])
模型类: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
best_model.pth,最终测试使用最佳权重而不是最后一轮权重。
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 体积较大,页面只展示实验流程和结果,不在浏览器端加载模型文件。