猫狗图像分类与在线识别系统
基于深度学习的猫狗图像分类项目,使用 PyTorch + ResNet18(迁移学习)进行模型训练,FastAPI 提供后端服务,Vue.js 实现前端交互界面
猫狗图像分类与在线识别系统
基于深度学习的猫狗图像分类项目,使用 PyTorch + ResNet18(迁移学习)进行模型训练,FastAPI 提供后端服务,Vue.js 实现前端交互界面。


项目简介
本项目实现了一个完整的图像分类系统,包括:
- 模型训练:使用 PyTorch 和预训练的 ResNet18 模型进行迁移学习
- 后端服务:基于 FastAPI 的 RESTful API 服务
- 前端界面:使用 Vue.js 实现的图片上传与识别展示页面
适合作为本科毕业设计项目,代码结构清晰,注释完整,便于论文撰写和答辩展示。
技术栈
深度学习
- PyTorch:深度学习框架
- ResNet18:预训练的卷积神经网络模型
- 迁移学习:利用 ImageNet 预训练权重,在小数据集上快速收敛
后端
- FastAPI:现代、快速的 Python Web 框架
- Uvicorn:ASGI 服务器
前端
- Vue.js 3:渐进式 JavaScript 框架(使用本地 vue.js 文件)
- HTML5 + CSS3:现代化 UI 设计
项目结构
cats_vs_dogs/
├── README.md # 项目说明文档
├── requirements.txt # Python 依赖包
├── train.py # 模型训练脚本
├── data/
│ └── cats_vs_dogs/ # 数据集目录
│ ├── cats/ # 猫的图片文件夹
│ └── dogs/ # 狗的图片文件夹
├── models/
│ └── resnet18_cats_dogs.pth # 训练好的模型文件(训练后生成)
├── backend/
│ ├── main.py # FastAPI 服务入口
│ ├── model_loader.py # 模型加载和推理模块
│ └── utils.py # 工具函数
└── frontend/
├── index.html # 前端页面
└── vue.js # Vue 3 库文件(需要自行放置)
快速开始
1. 环境准备
安装 Python 依赖
重要:由于 PyTorch 需要单独安装 CUDA 版本,请按以下步骤操作:
方式一:使用安装脚本(推荐,最简单)
- Windows 用户:双击运行
install_cuda_pytorch.bat - Linux/Mac 用户:运行
bash install_cuda_pytorch.sh
脚本会自动安装 CUDA 版本的 PyTorch 和其他依赖。
方式二:手动安装
https://blog.csdn.net/yuanmomoya/article/details/147025483
-
首先安装支持 CUDA 的 PyTorch(RTX 4060 Ti 推荐使用 CUDA 12.1):
# CUDA 12.1 版本(推荐) pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121或者使用 CUDA 11.8 版本:
# CUDA 11.8 版本 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 -
验证 CUDA 是否可用:
python -c "import torch; print(f'CUDA 可用: {torch.cuda.is_available()}'); print(f'CUDA 版本: {torch.version.cuda if torch.cuda.is_available() else \"未安装\"}'); print(f'GPU 设备: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else \"无\"}')"如果输出显示
CUDA 可用: True和您的 GPU 名称(如 “NVIDIA GeForce RTX 4060 Ti”),说明安装成功。 -
安装其他依赖:
pip install -r requirements.txt
注意:
- 如果您的系统没有安装 CUDA 驱动,请先安装 NVIDIA CUDA Toolkit
- RTX 4060 Ti 需要 CUDA 11.8 或更高版本
- 安装 CUDA 版本的 PyTorch 后,训练速度将大幅提升(相比 CPU 训练快 10-50 倍)
准备数据集
将猫狗图像数据集放置在 data/cats_vs_dogs/ 目录下,目录结构如下:
data/cats_vs_dogs/
├── cats/
│ ├── cat001.jpg
│ ├── cat002.jpg
│ └── ...
└── dogs/
├── dog001.jpg
├── dog002.jpg
└── ...
数据集来源:
- Kaggle Dogs vs Cats
- 或自行收集整理猫狗图片
2. 模型训练
运行训练脚本:
python train.py
训练过程会显示:
- 每个 epoch 的训练损失和准确率
- 验证损失和准确率
- 最佳模型自动保存
训练完成后,模型会保存到 models/resnet18_cats_dogs.pth。
训练参数说明:
BATCH_SIZE = 32:批次大小LEARNING_RATE = 0.001:学习率NUM_EPOCHS = 10:训练轮数TRAIN_RATIO = 0.8:训练集占比(80%)
可在 train.py 中修改这些参数。
3. 启动服务(统一启动)
推荐方式:一键启动前后端整合服务
在项目根目录运行:
python app.py
服务启动后:
- 前端界面:访问
http://localhost:8000使用图像分类功能 - API 文档:访问
http://localhost:8000/docs查看 Swagger 文档 - 健康检查:访问
http://localhost:8000/ping检查服务状态
API 接口:
GET /:前端首页GET /ping:健康检查POST /predict:图像分类预测
注意:确保 frontend/vue.global.js 文件存在(Vue 3 库文件)。
论文要点说明
1. 卷积神经网络(CNN)
卷积神经网络通过卷积层自动提取图像特征:
- 卷积层:使用卷积核扫描图像,提取局部特征
- 池化层:降低特征图尺寸,减少参数量
- 全连接层:将提取的特征映射到类别输出
2. ResNet 残差结构
ResNet(残差网络)通过跳跃连接解决了深层网络的梯度消失问题:
- 残差块:
output = F(x) + x,允许梯度直接传播 - 深度优势:可以训练更深的网络(18层、34层、50层等)
- 性能提升:在 ImageNet 等数据集上取得了优异的分类效果
3. 迁移学习
迁移学习利用在大数据集(ImageNet)上预训练的模型,在小数据集上快速适应:
- 预训练权重:模型已学习通用图像特征(边缘、纹理、形状等)
- 微调策略:
- 冻结 backbone,只训练分类层(快速、适合小数据集)
- 解冻全部层,端到端训练(更充分,需要更多数据)
- 优势:减少训练时间,提高小数据集上的准确率
4. 数据增强
数据增强通过随机变换增加训练样本的多样性:
- RandomHorizontalFlip:随机水平翻转
- RandomRotation:随机旋转
- ColorJitter:颜色抖动
- 作用:提升模型泛化能力,减少过拟合
5. PyTorch 模型保存与加载
# 保存模型
torch.save({
'model_state_dict': model.state_dict(),
'optimizer_state_dict': optimizer.state_dict(),
'val_acc': val_acc,
'class_to_idx': class_to_idx
}, 'model.pth')
# 加载模型
checkpoint = torch.load('model.pth')
model.load_state_dict(checkpoint['model_state_dict'])
6. 前后端分离架构
- 训练与推理分离:模型训练完成后,通过 API 提供服务
- RESTful API:标准化的接口设计,便于扩展和维护
- CORS 跨域:允许前端从不同域名访问后端服务
- 工程化实践:模块化设计,职责清晰
7. Vue.js 3 响应式系统
Vue.js 3 实现了数据驱动视图的响应式系统:
- createApp() API:Vue 3 新的应用创建方式,支持多个应用实例
- Proxy 响应式:基于 ES6 Proxy 实现响应式系统,性能更优(相比 Vue 2 的 Object.defineProperty)
- 双向数据绑定:数据变化自动更新视图
- 组件化思想:将 UI 拆分为可复用的组件
- MVVM 模式:Model-View-ViewModel 架构
常见问题
Q1: 训练时显存不足
解决方案:
- 减小
BATCH_SIZE(如改为 16 或 8) - 使用 CPU 训练(较慢但不需要 GPU)
Q2: 模型准确率较低
解决方案:
- 增加训练轮数
NUM_EPOCHS - 解冻 backbone 进行端到端训练(修改
train.py中的freeze_backbone=False) - 增加数据增强的强度
- 检查数据集质量和数量
Q3: 前端无法连接后端
解决方案:
- 确认后端服务已启动(访问
http://localhost:8000/ping测试) - 检查前端代码中的 API 地址是否正确
- 确认防火墙未阻止端口 8000
Q4: 模型文件找不到
解决方案:
- 确保已运行
train.py完成训练 - 检查
models/resnet18_cats_dogs.pth文件是否存在 - 确认后端代码中的模型路径正确
代码说明
训练脚本(train.py)
- 使用
ImageFolder自动加载数据集 - 支持训练集/验证集自动划分
- 实现完整的训练循环(前向传播、反向传播、模型保存)
- 打印训练和验证的损失、准确率
后端服务(backend/)
main.py:FastAPI 应用入口,定义 API 路由model_loader.py:模型加载和推理逻辑utils.py:图像处理工具函数
前端页面(frontend/index.html)
- 图片上传(点击或拖拽)
- 图片预览
- 调用后端 API 进行预测
- 展示识别结果和置信度
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)