从0到1:PyTorch 深度学习狗类分类系统,支持 OpenCV 读取与UI展示
环境难配:Python 版本、CUDA、PyTorch 经常踩坑,依赖安装一步错步步错。代码报错:学了一堆框架却无法落地,接口不熟、模型调用不明白。没思路:不会做数据组织、不会搭建前端 UI,更不知道如何把“结果”展示给老师看。纯 Python 开发,PyTorch 推理,Qt5 可视化界面,逻辑清晰。一键运行,内置主入口脚本,安装依赖后即可启动 UI。带 UI 界面,支持“选择图像—开始检测—输
·
前言
- 环境难配:Python 版本、CUDA、PyTorch 经常踩坑,依赖安装一步错步步错。
- 代码报错:学了一堆框架却无法落地,接口不熟、模型调用不明白。
- 没思路:不会做数据组织、不会搭建前端 UI,更不知道如何把“结果”展示给老师看。
本项目优势:
- 纯 Python 开发,PyTorch 推理,Qt5 可视化界面,逻辑清晰。
- 一键运行,内置主入口脚本,安装依赖后即可启动 UI。
- 带 UI 界面,支持“选择图像—开始检测—输出结果+置信度”。
- 包含丰富数据集(示例为十类狗品种),目录规范,训练日志与曲线齐全。
- 可扩展性强:随时替换/升级模型权重、调整类别映射、扩展数据集。
系统演示


效果说明:
- 在示例测试集上,准确率可达约 95%(以实际模型权重为准)。
- GPU 环境下,单张图像推理速度可达 30+ FPS,满足实时/准实时展示。
核心技术栈
- Python 3.8(3.11):语言生态成熟,第三方库丰富。
- PyTorch:主流深度学习框架,社区活跃,调用简洁。
- Qt5(PyQt5):桌面级 UI 开发稳定可靠,适合毕设演示。
- OpenCV / PIL:图像读取与基本处理,兼容性好、易上手。
- Torchvision:数据增强与预处理流水线,开箱即用。
为何选择这些技术:
- 社区成熟、文档完善,遇到问题可以快速查阅与定位。
- 部署简单,从命令行到桌面 UI 的完整闭环,适合展示与评审。
- 模块化设计,便于后续迭代,比如替换网络结构或二次开发新功能。
项目目录结构(规范清晰)
xception_dog_01/
├── all_data/ # 数据集(按类别分文件夹,示例为十类狗品种)
├── font/ # 中文字体文件(用于图表/中文显示)
├── models/ # 模型结构文件(示例包含 xception.py)
├── runs/ # 训练或实验记录(TensorBoard 等)
├── test/ # 测试用图片示例(快速验证UI与推理)
├── ui/ # UI资源(背景与图标等)
├── weights/ # 模型权重(如 dog-best-epoch.pth)
├── utils.py # 工具函数(数据划分、统计/可视化等)
├── my_dataset.py # 自定义数据集封装(PIL+Torch)
├── predict.py # 单图推理入口(脚本化调用)
├── train.py # 训练脚本(参数管理、数据增强、日志)
├── to_rgb.py # 数据预处理(统一为RGB、重命名)
├── ui.py / ui2.py # 由 .ui 转换生成的 PyQt5 窗口类
├── 主界面.py / 主界面2.py # UI主入口(加载权重、事件绑定、结果展示)
├── inf.py # 类别说明信息(识别结果文案)
├── ui.ui / ui2.ui # Qt Designer 原始界面文件
├── dataset.png # 类别分布可视化图(示例)
├── 损失值曲线图.png / 精确度曲线图.png # 训练效果可视化
└── 先看我-项目使用说明/ # 使用指南(含演示视频链接)
核心代码展示
1)UI加载与模型权重初始化(来自 主界面.py)
# 导入必要库与UI类
from PyQt5 import QtWidgets, QtCore
from ui import Ui_MainWindow
import os, json, torch
from models.xception import xception as create_model
from inf import data_inf
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self) # 载入 Qt Designer 生成的界面布局
# 文案与信息初始化
self.label.setText('基于深度学习算法的狗类识别系统')
self.label_res.setText('')
self.label_pro.setText('')
# 允许 MKL 重复加载(避免某些环境下冲突)
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
# 自动选择设备:优先使用 GPU
self.device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
# 加载类别映射(用于显示中文类别名)
with open('./class_indices.json', "r") as f:
self.class_indict = json.load(f)
# 构建模型并加载权重(核心参数与训练细节不展示)
self.model = create_model().to(self.device)
model_weight_path = "weights/dog-best-epoch.pth"
self.model.load_state_dict(torch.load(model_weight_path, map_location=self.device))
self.model.eval()
# 绑定界面按钮事件:选择图片/开始检测
self.pushButton_pic.clicked.connect(self.select_img)
self.pushButton_begin.clicked.connect(self.img_detect)
2)图像预处理流水线(来自 主界面.py)
from PIL import Image
from torchvision import transforms
import torch, os
def img_detect(self):
img_size = 224
# 标准化的图像变换:统一尺寸、中心裁剪、张量化、归一化
data_transform = transforms.Compose([
transforms.Resize(int(img_size * 1.143)), # 保持比例缩放
transforms.CenterCrop(img_size), # 中心裁剪到模型输入大小
transforms.ToTensor(), # 转换为 PyTorch 张量
transforms.Normalize( # 标准化通道均值与方差
[0.485, 0.456, 0.406],
[0.229, 0.224, 0.225]
)
])
assert os.path.exists(self.img_path), "file: '{}' dose not exist.".format(self.img_path)
img = Image.open(self.img_path)
img = data_transform(img) # 变换管线
img = torch.unsqueeze(img, dim=0) # 扩展 batch 维度,形状 [N, C, H, W]
3)推理入口(非核心调用,来自 predict.py/主界面.py)
with torch.no_grad():
# 前向计算:输出类别 logits
output = torch.squeeze(self.model(img.to(self.device))).cpu()
# softmax 转概率
predict = torch.softmax(output, dim=0)
# 取概率最大的类别索引
predict_cla = torch.argmax(predict).numpy()
# 根据类别索引映射中文类别名与置信度
res = self.class_indict[str(list(predict.numpy()).index(max(predict.numpy())))]
num = "%.2f" % (max(predict.numpy()) * 100) + "%"
# 同步更新到 UI:类别与置信度
self.label_res.setText(res)
self.label_pro.setText(num)
# 显示对应的科普说明(非必须)
self.textEdit.setText(data_inf[res])
附:数据清洗为 RGB 的辅助脚本(来自 to_rgb.py,示例化展示)
from PIL import Image
import os
# 遍历数据集,将所有图片统一转为 RGB,并按序重命名
for cls in os.listdir('all_data'):
num = 1
for file_name in os.listdir(f'all_data/{cls}'):
img = Image.open(f'all_data/{cls}/{file_name}')
if img.mode != "RGB":
img = img.convert("RGB") # 转为 RGB
img.save(f'all_data/{cls}/{num}.png') # 统一为 .png
os.remove(f'all_data/{cls}/{file_name}') # 删除原文件,避免重复
num += 1
如何使用 / 运行步骤
提示:项目已提供“环境配置命令.txt”,如暂未生成
requirements.txt,可参考该文件逐项安装。
-
步骤 1:安装依赖
- 推荐:
pip install -r requirements.txt - 或参考:打开
环境配置命令.txt,逐条执行依赖安装命令。
- 推荐:
-
步骤 2:运行主界面
python 主界面.py- 若希望使用另一套样式可运行:
python 主界面2.py
-
步骤 3:加载图片 / 开启摄像头(此示例以图片为主)
- 点击“选择图像”,选择
test/或任意图片。 - 点击“开始检测”,在右侧看到类别与置信度,并显示相关介绍。
- 点击“选择图像”,选择
-
单图脚本化推理(可选):
python predict.py- 修改
img_path即可在控制台查看识别类别与概率。
获取源码方式
由于篇幅限制,完整源码、训练好的模型权重、以及万字项目报告,请点击下方卡片/链接获取(含项目演示视频与详细文档)。
参考视频示例(项目内提供):先看我-项目使用说明/3-项目运行使用演示视频链接.txt
项目代码链接:https://my.feishu.cn/wiki/RHiZwpdduiztHDkrBNkcjM8Unlh?from=from_copylink
—
更多推荐
所有评论(0)