前言

  • 环境难配: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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐