基于 YOLOv8 的中草药智能识别系统 —— 从模型训练到桌面应用

基于 YOLOv8 的中草药智能识别系统 —— 从模型训练到桌面应用

一、项目简介

中草药种类繁多,形态各异,传统的人工鉴别方式依赖经验且效率有限。本项目基于 YOLOv8 图像分类模型 和 PyQt5 桌面框架,构建了一个支持 100 种中草药 的智能识别系统。用户只需上传一张图片,系统即可在毫秒级时间内给出识别结果和置信度。

系统支持 单张图片、批量文件夹、视频文件、摄像头实时 四种识别模式,界面简洁美观,操作直观。


二、技术栈

模块 技术选型
深度学习框架 Ultralytics YOLOv8 (ultralytics==8.0.199)
分类模型 YOLOv8n-cls(轻量级,推理速度快)
GUI 框架 PyQt5
图像处理 OpenCV + PIL
深度学习后端 PyTorch (torch==1.9.0)
辅助库 NumPy, Matplotlib, SciPy

三、项目结构

ChineseMedicineCls/
├── MainProgram.py       # 主程序入口,MainWindow 核心逻辑
├── Config.py            # 配置文件:模型路径、类别名称映射
├── train.py             # 模型训练脚本
── detect_tools.py      # 工具函数:图像读取、格式转换等
├── requirements.txt     # 依赖列表
├── models/
│   └── best.pt          # 训练好的最佳模型权重
├── datasets/Data/
│   ├── train/           # 训练集(100 类,每类约 80 张)
│   └── val/             # 验证集(100 类,每类约 19 张)
└── UIProgram/
    ├── UiMain.py        # 界面布局定义
    ├── style.css        # QSS 样式表
    ├── QssLoader.py     # 样式加载器
    └── ui_imgs/         # 图标与资源文件

四、模型训练

使用 YOLOv8n-cls 预训练模型,在 100 种中草药数据集上进行迁移学习:

from ultralytics import YOLO

model = YOLO("yolov8n-cls.pt")
model.train(data='datasets/Data', epochs=250, batch=4)

数据集按 8:2 划分为训练集和验证集,涵盖安息香、白扁豆、人参、冬虫夏草、黄芪、灵芝、天麻等 100 种常见中草药。训练完成后最佳权重保存为 models/best.pt。


五、核心代码解析

5.1 配置管理(Config.py)

model_path = 'models/best.pt'

names = {0: 'Anxixiang', 1: 'Baibiandou', ..., 99: 'Zirantong'}

CH_names = ['安息香', '白扁豆', ..., '自然铜']

维护了 100 类中草药的英文拼音索引和中文名称的对应关系,推理时通过 top1 索引直接映射到中文药名。

5.2 主程序(MainProgram.py)

模型加载与初始化:

self.device = 0 if torch.cuda.is_available() else 'cpu'
self.model = YOLO(Config.model_path, task='classify')
self.model(np.zeros((48, 48, 3), dtype=np.uint8), device=self.device)  # 预热

启动时自动检测 GPU 可用性,并执行一次 dummy 推理完成模型预热,避免首次识别时的延迟。

单张图片识别流程:

def open_img(self):
    file_path, _ = QFileDialog.getOpenFileName(...)
    self.org_img = tools.img_cvread(self.org_path)

    self.results = self.model(self.org_path, conf=self.conf)[0]
    cls_index = self.results.probs.top1
    conf = self.conf_list[cls_index]

    if conf > self.conf:
        res_name = Config.CH_names[cls_index]
    else:
        res_name = '无法识别'

    self.ui.resLb.setText(res_name)
    self.ui.label_conf.setText('{:.2f}%'.format(conf * 100))
    self.show_image(self.org_img)

推理结果取 top1 分类,置信度超过阈值(0.3)则显示对应中文名,否则提示"无法识别"。

图片自适应显示:

def show_image(self, img):
    label_w = self.ui.label_show.width()
    label_h = self.ui.label_show.height()
    img_h, img_w = img.shape[:2]
    ratio = min(label_w / img_w, label_h / img_h)
    new_w = int(img_w * ratio)
    new_h = int(img_h * ratio)
    resize_cvimg = cv2.resize(img, (new_w, new_h))
    pix_img = tools.cvimg_to_qpiximg(resize_cvimg)
    self.ui.label_show.setPixmap(pix_img)

根据显示区域实际尺寸等比缩放,确保图片不变形、不溢出。

视频/摄像头识别:

def open_frame(self):
    ret, now_img = self.cap.read()
    if ret:
        self.video_index += 1
        if self.video_index % self.detection_frequency == 0:
            self.results = self.model(now_img, conf=self.conf)[0]
            # ... 处理结果
        self.show_image(now_img)

通过定时器逐帧读取,每 5 帧执行一次推理,兼顾实时性与性能。

5.3 工具函数(detect_tools.py)

def img_cvread(path):
    """读取含中文路径的图片"""
    img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), cv2.IMREAD_COLOR)
    return img

def cvimg_to_qpiximg(cvimg):
    """OpenCV 图像转 PyQt QPixmap"""
    height, width, depth = cvimg.shape
    cvimg = cv2.cvtColor(cvimg, cv2.COLOR_BGR2RGB)
    qimg = QImage(cvimg.data, width, height, width * depth, QImage.Format_RGB888)
    return QPixmap(qimg)

解决了 OpenCV 不支持中文路径的常见问题,以及 OpenCV 与 PyQt 之间的图像格式转换。


六、界面设计

界面采用 左右分栏 布局,使用弹性布局(QVBoxLayout / QHBoxLayout)替代绝对定位,支持窗口自由缩放。

6.1 初始界面

在这里插入图片描述

  • 顶部:深蓝色标题栏,显示系统名称
  • 左侧上方:图片/视频显示区域(白色卡片)
  • 左侧下方:识别结果信息表格(序号、文件路径、结果、置信度)
  • 右侧上方:识别结果展示区(类别名称、置信度、用时)
  • 右侧下方:操作按钮区(2×2 网格排列)

6.2 识别结果界面

在这里插入图片描述

以"北沙参"为例,系统识别置信度达 93.15%,耗时仅 0.015 秒,结果同时展示在右侧面板和下方表格中。

6.3 样式设计

通过 QSS 样式表统一管理界面风格:

  • 主色调:浅灰背景 #f0f2f5 + 深蓝标题 #2c3e50 + 蓝色按钮 #409eff
  • 卡片风格:白色面板 + 细边框 + 圆角
  • 按钮交互:hover 变亮蓝,pressed 变深蓝
  • 表格:交替行色 + 蓝色选中高亮

七、四种识别模式

模式 操作 说明
单张图片 点击"打开图片" 选择一张图片进行识别
批量识别 点击"打开文件夹" 选择文件夹,逐张识别并汇总到表格
视频识别 点击"打开视频" 读取视频文件,每 5 帧检测一次
摄像头 点击"打开摄像头" 实时采集并识别,再次点击关闭

八、运行环境

# 安装依赖
pip install -r requirements.txt

# 启动程序
python MainProgram.py

核心依赖版本:

  • ultralytics==8.0.199
  • torch==1.9.0
  • opencv-python==4.8.1.78
  • PyQt5==5.15.2
  • numpy==1.26.1

九、总结

本项目将 YOLOv8 图像分类能力与 PyQt5 桌面应用相结合,实现了 100 种中草药的快速智能识别。系统具有以下特点:

  1. 多模式输入:支持图片、文件夹、视频、摄像头四种方式
  2. 毫秒级响应:单次推理耗时约 15ms,满足实时需求
  3. GPU 自适应:自动检测并使用 GPU 加速
  4. 中文路径兼容:解决了 OpenCV 读取中文路径的常见问题
  5. 现代 UI 设计:卡片式布局 + 弹性缩放 + QSS 统一样式

该系统可应用于中药房辅助鉴别、中药教学演示、中药材质量检测等场景,具有一定的实用价值。

代码下载路径

有训练代码和训练好的模型以及训练过程,提供数据,提供GUI界面代码
项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
https://www.bilibili.com/video/BV13jnG6kE2B/
在这里插入图片描述

导航