基于 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.199torch==1.9.0opencv-python==4.8.1.78PyQt5==5.15.2numpy==1.26.1
九、总结
本项目将 YOLOv8 图像分类能力与 PyQt5 桌面应用相结合,实现了 100 种中草药的快速智能识别。系统具有以下特点:
- 多模式输入:支持图片、文件夹、视频、摄像头四种方式
- 毫秒级响应:单次推理耗时约 15ms,满足实时需求
- GPU 自适应:自动检测并使用 GPU 加速
- 中文路径兼容:解决了 OpenCV 读取中文路径的常见问题
- 现代 UI 设计:卡片式布局 + 弹性缩放 + QSS 统一样式
该系统可应用于中药房辅助鉴别、中药教学演示、中药材质量检测等场景,具有一定的实用价值。
代码下载路径
有训练代码和训练好的模型以及训练过程,提供数据,提供GUI界面代码
项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
https://www.bilibili.com/video/BV13jnG6kE2B/

浙公网安备 33010602011771号