这是一个基于 PyTorch 实现的 CIFAR-10 图像分类项目。项目从零开始搭建了一个卷积神经网络(CNN),在 CIFAR-10 数据集上训练并达到了约 75% 的测试准确率。模型能够对真实照片、卡通、油画、像素画等多种风格的图片进行识别,并提供了单张图片预测和批量预测的功能。
- 任务:10 类彩色图像分类(飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船、卡车)
- 框架:PyTorch
- 模型:自定义 CNN(4 个卷积层 + 2 个全连接层,含 BatchNorm 和 Dropout)
- 最终性能:
- CIFAR-10 测试集准确率:75.24%
- 真实照片测试集准确率:80%
- 风格化图片(卡通/油画/像素)准确率:67%
本项目在以下环境中开发和测试:
- Python 3.12
- CUDA 12.8(支持 RTX 5060 等新一代显卡)
- PyTorch 2.10+cu128
- torchvision, torchaudio
- numpy, matplotlib, pillow, tqdm
-
创建 Conda 环境(指定路径):
conda create --prefix E:\conda_env\cifar10_env python=3.12 -y conda activate E:\conda_env\cifar10_env
-
安装 PyTorch 和依赖:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128 pip install numpy matplotlib pillow tqdm
-
验证 GPU 可用性:
python -c "import torch; print(torch.cuda.is_available())"输出应为
True。
项目使用 CIFAR-10 数据集,包含 60,000 张 32x32 彩色图像,分为 10 类,每类 6,000 张。训练集 50,000 张,测试集 10,000 张。
数据会在第一次运行训练脚本时自动下载到 ./data 目录。
CIFAR10CNN(
(conv1): Conv2d(3, 32, kernel_size=3, padding=1)
(bn1): BatchNorm2d(32)
(conv2): Conv2d(32, 64, kernel_size=3, padding=1)
(bn2): BatchNorm2d(64)
(pool): MaxPool2d(2)
(conv3): Conv2d(64, 128, kernel_size=3, padding=1)
(bn3): BatchNorm2d(128)
(conv4): Conv2d(128, 128, kernel_size=3, padding=1)
(bn4): BatchNorm2d(128)
(pool2): MaxPool2d(2)
(fc1): Linear(128*4*4 -> 256)
(fc2): Linear(256 -> 10)
(dropout): Dropout(0.25)
)- 数据增强:随机水平翻转、随机裁剪(padding=4)
- 优化器:Adam(lr=0.001, weight_decay=1e-4)
- 学习率调度:StepLR(每 20 轮衰减一半)
- 训练轮数:30
- 保存策略:保存测试集准确率最高的模型为
cifar10_cnn_best.pth
运行训练:
python train_cifar10.py训练过程中会输出每个 epoch 的损失和准确率,并保存最佳模型。
Epoch 6 用时: 16.98秒,当前学习率: 0.001000
*** 保存最佳模型,准确率: 75.24% ***
...
训练完成,最佳准确率: 75.24%
提供了两种预测模式:单张图片预测和批量文件夹预测。脚本 batch_predict_cifar10.py 会自动加载最佳模型。
python batch_predict_cifar10.py 图片路径例如:
python batch_predict_cifar10.py C:\Users\user\Desktop\cat.jpgpython batch_predict_cifar10.py脚本会扫描当前目录下的 test_imgs 文件夹,识别所有图片并输出结果。
模型加载成功
找到 40 张图片,开始识别...
airplane_cartoon.jpg -> airplane (置信度: 1.0000)
bird_oil.jpg -> frog (置信度: 0.9511)
cat_real.jpg -> cat (置信度: 0.3991)
...
识别完成!
CIFAR10/
├── train_cifar10.py # 训练脚本
├── batch_predict_cifar10.py # 预测脚本(支持单张/批量)
├── cifar10_cnn_best.pth # 训练好的最佳模型(生成)
├── test_imgs/ # 存放测试图片的文件夹(用户自建)
├── data/ # CIFAR-10 数据集存放位置(自动下载)
└── README.md # 项目说明
在自行收集的 40 张风格化测试图片(含真实照片、卡通、油画、像素画)上,模型表现如下:
| 图片类型 | 准确率 |
|---|---|
| 真实照片 | 80% |
| 卡通 | 70% |
| 油画 | 60% |
| 像素画 | 70% |
| 总体 | 70% |
- 强类别:飞机、青蛙、鸟等识别稳定。
- 易混淆:汽车 vs 卡车、猫 vs 狗、鹿 vs 卡车(尤其在艺术风格下)。
- 低置信度正确:部分真实照片虽然正确,但置信度较低(如猫 0.399),说明特征不够显著。
- 使用更强的数据增强(如颜色抖动、灰度化)提升风格泛化能力。
- 尝试更深的模型(如 ResNet-18、VGG)以获得更高准确率。
- 针对特定误分类情况收集少量样本进行微调。
本项目参考了 PyTorch 官方教程和 CIFAR-10 相关开源项目,并在实际调试中解决了一系列环境兼容性问题(如 CUDA 版本匹配、Windows 多进程数据加载等),最终形成完整可复现的代码。
欢迎 Star 和 Fork! 如有问题,请提交 Issue。