【深度学习实战】基于YOLOv8的中药材智能识别系统:从零到部署完整教程
本文介绍了一个基于YOLOv8的中药材智能识别系统,支持100种中药材识别。系统采用深度学习技术,提供Flask和Streamlit两种Web界面,包含用户管理、图像处理和结果存储功能。核心技术包括YOLOv8分类模型、MySQL数据库存储、中文文本绘制等,实现了从数据准备到部署的全流程解决方案。项目代码结构清晰,适合作为深度学习实战案例。
【深度学习实战】基于YOLOv8的中药材智能识别系统:从零到部署完整教程
📝 前言
随着人工智能技术的发展,深度学习在图像识别领域取得了突破性进展。本文将详细介绍如何使用YOLOv8构建一个完整的中药材智能识别系统,包括数据准备、模型训练、Web应用开发等全流程内容。本项目支持识别100种常见中药材,提供了Flask和Streamlit两种Web界面,适合作为深度学习项目的实战案例。
🎯 项目概述
项目特点
- ✅ 识别种类丰富:支持100种常见中药材的识别
- ✅ 多种识别方式:支持图片、视频、摄像头实时识别
- ✅ 完整的Web系统:提供用户注册、登录、历史记录管理
- ✅ 双框架支持:同时提供Flask和Streamlit两种Web界面
- ✅ 数据库存储:使用MySQL存储用户信息和识别历史
技术架构
┌─────────────────────────────────────────────────┐
│ 前端界面层 │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Flask Web UI │ │ Streamlit UI │ │
│ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────┐
│ 业务逻辑层 │
│ ┌──────────────────────────────────────────┐ │
│ │ ImageProcessor(图像处理核心类) │ │
│ │ Database(数据库操作类) │ │
│ └──────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────┐
│ 模型推理层 │
│ YOLOv8 Classification Model │
│ (best.pt) │
└─────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────┐
│ 数据存储层 │
│ MySQL Database │
└─────────────────────────────────────────────────┘
🛠️ 技术栈详解
1. 深度学习框架
YOLOv8 (Ultralytics)
- 版本:8.0.199
- 任务类型:Classification(图像分类)
- 优势:
- 速度快:实时推理能力强
- 精度高:在多种数据集上表现优异
- 易用性:API简洁,易于集成
from ultralytics import YOLO
# 加载模型
model = YOLO('models/best.pt', task='classify')
# 推理
results = model(image_path)
conf_list = results[0].probs.data.tolist()
2. Web框架
Flask版本(app1.py)
- 优势:灵活、可定制性强
- 适用场景:需要复杂前端交互的场景
- 特点:支持完整的HTML/CSS/JavaScript前端
Streamlit版本(app.py)
- 优势:开发快速、代码简洁
- 适用场景:快速原型开发、数据科学应用
- 特点:Python代码即可生成Web界面
3. 数据库设计
MySQL数据库结构
-- 用户表
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL, -- bcrypt加密
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 识别历史记录表
CREATE TABLE recognition_history (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
original_file VARCHAR(255),
result_file VARCHAR(255),
top1_class VARCHAR(50),
confidence FLOAT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
📚 核心代码解析
1. 图像处理核心类(ImageProcessor)
这是系统的核心类,负责图像识别和结果可视化。
class ImageProcessor:
def __init__(self):
self.model = YOLO(Config.model_path, task='classify')
self.output_dir = "static/output"
if not os.path.exists(self.output_dir):
os.makedirs(self.output_dir)
def process_image(self, img_path):
"""处理单张图片"""
# 1. 读取图片
img = tools.img_cvread(img_path)
# 2. 模型推理
results = self.model(img_path, conf=0.3)[0]
conf_list = results.probs.data.tolist()
# 3. 获取Top-3结果
top3_indices = np.argsort(conf_list)[-3:][::-1]
# 4. 在图片上绘制结果
img = self.draw_chinese_text(img, "识别结果:", ...)
# 5. 保存结果
save_path = os.path.join(self.output_dir, save_name)
cv2.imwrite(save_path, img)
return save_path, recognition_results, top1_class, confidence
关键技术点:
- 中文文本绘制:使用PIL的ImageDraw和ImageFont实现中文文本在OpenCV图像上的绘制
def draw_chinese_text(self, img, text, position, text_color=(0, 255, 0), text_size=30):
"""在OpenCV图像上绘制中文文本"""
if isinstance(img, np.ndarray):
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img)
fontStyle = ImageFont.truetype("simsun.ttc", text_size, encoding="utf-8")
draw.text(position, text, text_color, font=fontStyle)
return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
- Top-3结果提取:使用numpy的argsort获取置信度最高的三个类别
top3_indices = np.argsort(conf_list)[-3:][::-1] # 获取Top-3索引
2. 数据库操作类(Database)
使用单例模式确保数据库连接的唯一性。
class Database:
_instance = None
def __new__(cls):
"""单例模式"""
if cls._instance is None:
cls._instance = super(Database, cls).__new__(cls)
return cls._instance
def register_user(self, username, password):
"""用户注册,密码使用bcrypt加密"""
hashed = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
query = "INSERT INTO users (username, password) VALUES (%s, %s)"
self.cursor.execute(query, (username, hashed))
def login_user(self, username, password):
"""用户登录,验证密码"""
user = self.fetch_user(username)
if user and bcrypt.checkpw(password.encode('utf-8'), user['password'].encode('utf-8')):
return user
return None
安全特性:
- 使用bcrypt进行密码加密存储
- 使用参数化查询防止SQL注入
- 单例模式避免连接泄漏
3. Flask路由设计
@app.route('/detect_image', methods=['POST'])
def detect_image():
"""图片识别接口"""
if 'user_id' not in session:
return jsonify({'error': '未登录'}), 401
file = request.files['file']
file_path = save_uploaded_file(file)
# 调用图像处理器
save_path, results, top1_class, confidence = image_processor.process_image(file_path)
# 保存识别记录
db.save_recognition(session['user_id'], file_path, save_path, top1_class, confidence)
return jsonify({
'processed_image': url_for('static', filename=f"output/{os.path.basename(save_path)}"),
'stats': detection_stats,
'boxes': detection_boxes
})
4. Streamlit界面实现
def main_page():
st.markdown('<h1 class="header-style">🌿 中药材智能识别系统</h1>', unsafe_allow_html=True)
tab1, tab2, tab3, tab4 = st.tabs([
"📷 图片识别",
"🎥 视频识别",
"📹 摄像头识别",
"📋 历史记录"
])
with tab1:
uploaded_file = st.file_uploader("选择图片", type=['jpg', 'jpeg', 'png'])
if uploaded_file:
file_path = save_uploaded_file(uploaded_file)
save_path, results = process_uploaded_image(file_path)
# 显示结果
🚀 完整部署教程
步骤1:环境准备
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
# Windows
venv\Scripts\activate
# Linux/Mac
source venv/bin/activate
# 安装依赖
pip install -r requirements_web.txt
步骤2:数据库配置
# 创建数据库
mysql -u root -p
CREATE DATABASE chinese_medicine_db CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
exit
# 导入数据库结构
mysql -u root -p chinese_medicine_db < chinese_medicine_db.sql
步骤3:配置环境变量
创建 .env 文件:
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=chinese_medicine_db
SECRET_KEY=your_secret_key_here
步骤4:准备模型文件
将训练好的 best.pt 文件放在 models/ 目录下。
步骤5:运行应用
Flask版本:
python app1.py
# 访问 http://127.0.0.1:5000
Streamlit版本:
streamlit run app.py
# 访问显示的URL
🎓 模型训练教程
如果需要训练自定义模型:
1. 数据准备
datasets/
└── Data/
├── 安息香/
│ ├── img1.jpg
│ ├── img2.jpg
│ └── ...
├── 白扁豆/
│ ├── img1.jpg
│ └── ...
└── ...
2. 训练配置
# train.py
from ultralytics import YOLO
model = YOLO("yolov8n-cls.pt") # 使用预训练模型
model.train(
data='datasets/Data', # 数据路径
epochs=250, # 训练轮数
batch=4, # 批次大小
imgsz=224, # 图像尺寸
device=0 # GPU设备ID
)
3. 训练要点
- 数据增强:YOLOv8自动进行数据增强
- 学习率调整:可以根据训练曲线调整
- 模型选择:可根据需求选择yolov8n、yolov8s、yolov8m等不同大小
💡 关键技术难点与解决方案
1. 中文文本在OpenCV图像上的绘制
问题:OpenCV的putText函数不支持中文字符。
解决方案:使用PIL的ImageDraw和ImageFont。
def draw_chinese_text(img, text, position, text_color=(0, 255, 0), text_size=30):
# OpenCV转PIL
if isinstance(img, np.ndarray):
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# 使用PIL绘制中文
draw = ImageDraw.Draw(img)
fontStyle = ImageFont.truetype("simsun.ttc", text_size, encoding="utf-8")
draw.text(position, text, text_color, font=fontStyle)
# PIL转回OpenCV
return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
2. 视频逐帧处理
问题:视频文件较大,需要逐帧处理并生成结果视频。
解决方案:使用OpenCV的VideoCapture和VideoWriter。
cap = cv2.VideoCapture(video_path)
fourcc = cv2.VideoWriter_fourcc(*'avc1')
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 处理帧
processed_frame, results, _, _ = image_processor.process_video_frame(frame)
# 写入输出视频
out.write(processed_frame)
cap.release()
out.release()
3. 实时摄像头识别
问题:需要低延迟的实时识别。
解决方案:使用多线程或异步处理,优化模型推理速度。
cap = cv2.VideoCapture(0) # 打开摄像头
while True:
ret, frame = cap.read()
if not ret:
break
# 实时处理
frame, results, top1_class, confidence = image_processor.process_video_frame(frame)
# 显示结果
cv2.imshow("识别结果", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
4. 数据库连接管理
问题:频繁创建数据库连接影响性能。
解决方案:使用单例模式 + 连接池。
class Database:
_instance = None
_connection = None
def __new__(cls):
if cls._instance is None:
cls._instance = super(Database, cls).__new__(cls)
return cls._instance
def ensure_connection(self):
"""确保数据库连接有效"""
if not self.connection or not self.connection.is_connected():
self.connect()
📊 性能优化建议
1. GPU加速
安装CUDA版本的PyTorch:
# 检查CUDA版本
nvidia-smi
# 安装对应版本的PyTorch
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118
2. 模型量化
使用模型量化减小模型大小,提升推理速度:
# 使用TensorRT或ONNX Runtime
model.export(format='onnx') # 导出ONNX格式
3. 批量处理
对于多张图片,可以使用批量处理:
results = model(image_list, batch=8) # 批量处理8张图片
4. 缓存机制
对于重复识别的图片,可以使用缓存:
import hashlib
def get_image_hash(image_path):
with open(image_path, 'rb') as f:
return hashlib.md5(f.read()).hexdigest()
# 使用Redis或内存缓存结果
🐛 常见问题解答
Q1: 模型加载失败怎么办?
A: 检查以下几点:
- 确认
models/best.pt文件存在且完整 - 检查模型文件路径是否正确
- 确认已安装正确版本的ultralytics
Q2: 中文显示为乱码?
A: 解决方案:
- 确保系统已安装中文字体(如simsun.ttc)
- 检查字体文件路径
- 确认Python文件编码为UTF-8
Q3: 摄像头无法打开?
A: 可能原因:
- 摄像头被其他程序占用
- 摄像头权限未授予
- 摄像头ID不正确(尝试0-9)
Q4: 数据库连接失败?
A: 检查项:
- MySQL服务是否启动
.env文件配置是否正确- 数据库用户权限是否足够
- 防火墙是否阻止连接
Q5: 识别速度慢?
A: 优化方法:
- 使用GPU加速
- 减小输入图像尺寸
- 使用更小的模型(yolov8n)
- 批量处理图片
📈 项目扩展方向
1. 移动端应用
可以开发Android/iOS应用,使用模型量化技术部署到移动设备。
2. API服务化
将识别功能封装为RESTful API,支持第三方调用:
@app.route('/api/v1/recognize', methods=['POST'])
def recognize_api():
# API接口实现
pass
3. 批量识别功能
添加批量图片识别功能,提高处理效率。
4. 中药材信息查询
集成中药材详细信息数据库,识别后显示功效、用法等信息。
5. 模型持续学习
实现模型在线学习功能,根据用户反馈持续优化模型。
📝 总结
本项目是一个完整的深度学习应用案例,涵盖了从模型训练到Web部署的全流程。通过本项目,您可以学习到:
- ✅ YOLOv8分类模型的使用
- ✅ Flask和Streamlit Web应用开发
- ✅ MySQL数据库操作
- ✅ 图像处理和中文文本绘制
- ✅ 用户认证和会话管理
- ✅ 视频处理和实时识别
希望本项目能对您的学习有所帮助!如有问题,欢迎在评论区交流讨论。
🔗 相关资源
💬 作者留言
如果觉得本文对您有帮助,欢迎点赞、收藏、转发!您的支持是我持续创作的动力。
后续会持续更新更多深度学习实战项目,包括目标检测、语义分割、自然语言处理等领域,敬请关注!
标签:#深度学习 #YOLOv8 #Python #Web开发 #图像识别 #中药材识别 #Flask #Streamlit #计算机视觉 #人工智能
更多推荐


所有评论(0)