又到了每年毕业设计冲刺的阶段,不少同学选定了“花卉图像识别”这个方向,但一打开 YOLOv8 的官方仓库,面对一大堆文件和命令行,还是不知道该从哪里下手。本文就围绕YOLOv8 + PyTorch这一套主流组合,用一个完整的花卉识别实战项目,带你从环境搭建、数据集准备、模型训练,一直走到结果评估和常见报错排查。内容定位是“1 小时跑通”,所以不会涉及太偏门的调参技巧,而是把最稳妥、最常用、最容易复现的路径展示出来。
无论你是刚接触深度学习、需要用 YOLOv8 来完成本科毕设,还是已经在做图像识别方向的小项目,这篇文章都能提供一个可以直接照着做的完整参考。文末会给出源码级示例、关键参数解释和训练注意事项,建议配合本地环境一边看一边操作。
1. YOLOv8 与花卉图像识别的基本概念
1.1 什么是 YOLOv8
YOLOv8 是 Ultralytics 团队在 2023 年初推出的目标检测模型系列,属于 YOLO(You Only Look Once)演进路线中的一个重要版本。它的前身包括 YOLOv5、YOLOv6、YOLOv7 等,而 YOLOv8 在结构设计和工程易用性上做了大量打磨,是目前学术界和工业界使用最广泛的目标检测工具之一。
“目标检测”和“图像分类”是有区别的。图像分类只回答“这张图片里是什么”,而目标检测不仅要回答“图片里有什么”,还要把每个目标的位置用边界框圈出来。放到花卉识别场景中,如果你只需要判断一张图片属于“玫瑰”还是“菊花”,那用图像分类就能搞定;但如果一张图中同时出现玫瑰、菊花、向日葵,你又想知道每一朵花在画面中的位置,就必须使用目标检测模型。YOLOv8 的优势恰恰在于,它在保证检测精度的同时,推理速度非常快,适合在 CPU、GPU 甚至边缘设备上部署。
1.2 YOLOv8 的核心版本特点
YOLOv8 在结构上做了三个比较明显的改进:
第一,主干网络采用了C2f 模块,它在 C3 模块的基础上增加了更多分支和梯度流,能够在保持轻量化的同时提升特征提取能力。
第二,颈部网络使用PAN-FPN 结构,通过自顶向下和自底向上的路径融合不同尺度的特征图,有利于同时检测大目标和小目标。对于花卉这种大小差异明显的目标,这种多尺度融合是很有必要的。
第三,检测头从 Anchor-Based 改为Anchor-Free 的 Decoupled Head。之前的 YOLO 版本在训练时需要提前计算锚框,而 YOLOv8 直接预测目标中心和宽高,简化了训练流程,也减少了很多后处理逻辑。
除此之外,YOLOv8 还提供了丰富的模型规格,分别是n(nano)、s(small)、m(medium)、l(large)、x(xlarge)。如果只是做毕设,yolov8s和yolov8m比较常用,前者训练快、显存占用低,后者精度更高、训练时间稍长。
1.3 为什么用 PyTorch 作为深度学习框架
PyTorch 是目前深度学习领域最主流的框架之一,尤其适合研究和教学场景。它的动态图机制让调试变得直观,你可以像写普通 Python 程序一样逐步查看张量的形状和数值。Ultralytics YOLOv8 官方仓库就是基于 PyTorch 实现的,所以使用 PyTorch 环境与 YOLOv8 的兼容性最好,这也是本文选择 PyTorch 的根本原因。
另外,PyTorch 生态非常成熟,不管是数据加载、模型可视化、还是 TensorBoard 日志,都有现成工具。即使你对深度学习底层原理还不熟悉,也可以借助 PyTorch 快速完成数据集的封装和模型的训练流程。
1.4 花卉识别任务的常见场景
- 植物物种调查:通过手机拍摄照片自动识别花卉品种。
- 智能园林管理:在园区监控画面中统计不同花卉的数量和位置。
- 农业病虫害辅助:结合花朵状态判断植物生长情况。
- 科普教育:开发一款“拍花识花”的小程序或 Web 应用。
毕设题目如果是“基于深度学习的室外花卉图像识别系统”,通常要求不仅能够识别单张图片,还要支持批量预测、实时摄像头检测或 Web 上传检测。这些功能都可以基于 YOLOv8 训练出的权重文件实现。
2. 环境准备与版本说明
2.1 推荐环境清单
在开始之前,先把环境梳理清楚。本文示例以常见环境为例,具体版本需要根据你的项目实际情况调整。
| 依赖项 | 推荐配置 | 说明 |
|---|---|---|
| 操作系统 | Windows 10/11 / Ubuntu 20.04 / Ubuntu 22.04 | 本文以 Windows 为主 |
| Python | 3.8 - 3.11 | 尽量使用 3.9 或 3.10 |
| PyTorch | 2.x 或 1.13 以上 | 需要与 CUDA 版本匹配 |
| CUDA | 11.7 / 11.8 / 12.x | 由显卡驱动决定 |
| GPU | NVIDIA 显卡,显存 4GB 以上 | 没有 GPU 也可以用 CPU 训练小数据集 |
| ultralytics | 8.0.x 及以上 | 包含 YOLOv8 训练与推理接口 |
如果你是学生,机器上没有 NVIDIA 显卡,CPU 训练小规模花卉数据集也可以完成,只是训练速度会慢一些。建议先用 CPU 跑通整个流程,再在有 GPU 的环境上做正式训练。
2.2 安装 PyTorch
PyTorch 的安装方式是整个环境准备中最容易出问题的环节。核心原则是:先确认自己的 CUDA 环境,再去官网选择对应的安装命令。
在命令行输入:
nvidia-smi如果你能看到类似下面的输出,说明显卡驱动正常,并且可以看到支持的 CUDA 版本:
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 525.85.05 Driver Version: 525.85.05 CUDA Version: 12.0 | +-----------------------------------------------------------------------------+然后进入 PyTorch 官网(pytorch.org),选择对应的操作系统、包管理工具和 CUDA 版本,复制安装命令。以 pip 和 CUDA 11.8 为例:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118需要注意的是,这里安装的是 PyTorch 的预编译版本,里面已经包含了 CUDA 运行库,不需要单独安装完整 CUDA Toolkit。如果你使用 CPU 版本,安装命令是:
pip install torch torchvision torchaudio安装完成后,用下面这段 Python 代码验证是否可用:
import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else "CPU")如果torch.cuda.is_available()返回True,说明 PyTorch 可以正常使用 GPU,这是后续训练速度的关键。
2.3 安装 ultralytics 库
ultralytics 是 YOLOv8 的官方 Python 包,安装非常简单:
pip install ultralytics这个命令会自动安装 opencv-python、numpy、matplotlib、pandas 等常用依赖。安装完成后,可以在 Python 中查看版本:
import ultralytics print(ultralytics.__version__)2.4 准备标注工具和数据集
训练 YOLOv8 需要的是 YOLO 格式的数据集,也就是每张图片对应一个文本标注文件,文本中每一行表示一个目标:
类别ID x_center y_center width height其中x_center、y_center、width、height都是相对于图片宽高的归一化数值,取值范围在 0 到 1 之间。
如果你需要手动标注自己的花卉图片,推荐使用 LabelImg 或 Label Studio。LabelImg 可以输出 YOLO 格式的 txt 文件,操作方式也不复杂:画框、选择类别、保存。对于公开数据集,比如 Oxford 102 Flower 等花卉数据集,可以从网上下载后转换为 YOLO 格式。
3. YOLOv8 网络架构与原理拆解
3.1 整体架构
YOLOv8 的网络可以分成三个部分:
- Backbone(主干网络):负责从原始图片中提取特征。YOLOv8 使用带 C2f 模块的卷积网络,逐层缩小特征图尺寸、增加通道数。
- Neck(颈部网络):负责融合不同尺度的特征。YOLOv8 使用 PAN-FPN,将深层语义信息和浅层细节信息进行融合。
- Head(检测头):负责输出目标的类别和位置信息。YOLOv8 使用解耦检测头,分别输出分类分支和回归分支。
用一个简单的表来理解:
| 组成部分 | 作用 | 输出示例 |
|---|---|---|
| 输入层 | 接收图片并调整尺寸 | 640×640×3 |
| Backbone | 提取多尺度特征 | 80×80、40×40、20×20 |
| Neck | 融合特征 | 每个尺度都有完整语义信息 |
| Head | 输出预测框和类别概率 | 类别数 + 4 个坐标参数 |
3.2 C2f 模块
C2f 模块是 YOLOv8 中替代 C3 的核心模块。它借鉴了 ELAN 思路,将输入特征图拆成多个分支,经过多次卷积和拼接后再输出。这样的设计让梯度在反向传播时有更多路径,训练时更容易收敛,推理时也不会明显增加计算量。
C2f 的一个直观理解是:它把原来比较“直”的卷积路径变成了多条并行的小路径,再通过拼接操作把信息融合起来。这种结构在深层次网络中表达能力更强,训练过程的损失下降也更稳定。
3.3 Anchor-Free 检测头
传统 YOLO 使用锚框,需要预设一组固定宽高比的候选框。YOLOv8 去掉了锚框,让模型直接预测每个位置到目标中心点的偏移、目标宽度和高度。对于初学者而言,这意味着训练数据不需要复杂锚框聚类,代码也更简洁。
Anchor-Free 的好处在于:同一套模型结构可以适配更多目标形状。花卉的形态差异很大,玫瑰花和向日葵的宽高比完全不同,Anchor-Free 方案在这种场景下更有优势。
3.4 训练阶段的损失函数
YOLOv8 的分类损失使用 BCE Loss(二元交叉熵),回归损失使用 CIOU Loss 或 DFL Loss 的组合。其中 DFL(Distribution Focal Loss)用于学习边界框坐标的概率分布,能让框回归更精准。
训练时,YOLOv8 会综合计算边界框损失和分类损失,然后通过反向传播更新网络参数。过程可以用下面的流程表示:
- 输入一批图片,前向传播得到预测结果。
- 将预测结果与真实标注做匹配。
- 计算分类损失和回归损失。
- 反向传播更新权重。
- 重复上述步骤,直到损失下降趋于稳定。
4. 完整实战:YOLOv8 花卉识别模型训练
4.1 创建项目结构
为了便于管理和后续论文撰写,建议先创建清晰的项目目录:
flower_yolov8/ ├── data/ │ ├── images/ │ │ ├── train/ │ │ └── val/ │ └── labels/ │ ├── train/ │ └── val/ ├── models/ │ └── flower.yaml ├── runs/ ├── train.py └── predict.py其中data/images/train存放训练图片,data/images/val存放验证图片,data/labels/train和data/labels/val存放对应的 YOLO 格式标注文件。models/flower.yaml是训练配置文件。runs目录用于保存训练日志和模型权重。
4.2 准备数据集
4.2.1 数据集来源
如果你的毕设题目允许使用公开数据集,可以直接下载 Oxford 102 Flower 数据集,它包含 102 类花卉,图片数量约 8000 多张,非常适合做目标检测或分类训练。也可以使用 Kaggle 上的 Flower Detection 数据集,这些数据集的标注格式可能不同,需要转换成 YOLO 格式。
如果要求自建数据集,建议每类花卉准备 200 到 500 张图片,图片分辨率不要太小,尽量覆盖不同角度和光照条件。
4.2.2 数据划分与标注格式转换
将数据集分为训练集和验证集,比例一般为 8:2 或 9:1。如果你的标注是 COCO 格式的 JSON 文件,可以写一个 Python 脚本转换成 YOLO 格式。这里给出一个简单的 COCO 转 YOLO 核心代码,按需调整路径:
import json import os def coco_to_yolo(coco_json_path, output_dir): with open(coco_json_path, 'r', encoding='utf-8') as f: coco = json.load(f) images = {img['id']: img for img in coco['images']} categories = {cat['id']: idx for idx, cat in enumerate(coco['categories'])} os.makedirs(output_dir, exist_ok=True) for ann in coco['annotations']: img = images[ann['image_id']] img_w, img_h = img['width'], img['height'] bbox = ann['bbox'] # COCO格式: [x, y, width, height] x, y, w, h = bbox x_center = (x + w / 2) / img_w y_center = (y + h / 2) / img_h w_norm = w / img_w h_norm = h / img_h cat_id = ann['category_id'] cls_id = categories[cat_id] txt_name = os.path.splitext(img['file_name'])[0] + '.txt' txt_path = os.path.join(output_dir, txt_name) with open(txt_path, 'a', encoding='utf-8') as f: f.write(f"{cls_id} {x_center:.6f} {y_center:.6f} {w_norm:.6f} {h_norm:.6f}\n") coco_to_yolo('annotations/instances_train.json', 'data/labels/train') coco_to_yolo('annotations/instances_val.json', 'data/labels/val')需要注意,categories的索引必须从 0 开始,因为 YOLO 格式的类别 ID 从 0 开始。
4.3 创建 YOLOv8 数据配置文件
在models/flower.yaml中写入以下配置:
# 文件路径:models/flower.yaml path: ./data # 数据集根目录 train: images/train # 训练图片相对路径 val: images/val # 验证图片相对路径 nc: 102 # 类别数,这里以 Oxford 102 Flower 为例 names: [ 'rose', 'daisy', 'tulip', 'sunflower', # 这里按实际类别顺序写全所有名称 ]如果你的类别只有 10 类,就把nc改成 10,并在names列表中写 10 个名字。类别顺序必须与标注文件中的数字一一对应,否则训练出来的模型会出现“名字和实际物体对不上”的问题。
4.4 编写训练脚本
新建train.py文件,内容如下:
# 文件路径:train.py from ultralytics import YOLO # 加载预训练模型,s 表示 small 版本 model = YOLO('yolov8s.pt') # 开始训练 model.train( data='models/flower.yaml', epochs=50, imgsz=640, batch=8, device=0, # 0 表示第一张GPU;CPU 则改为 'cpu' workers=2, lr0=0.01, name='flower_experiment' )重点参数解释如下:
data:指定数据集配置文件路径。epochs:训练轮数。数据集少时,50 到 100 轮足够。imgsz:输入网络的图片尺寸。640 是默认推荐值。batch:批大小。显存不足时减小到 4 或 2。device:指定训练设备。有 GPU 用0,没有用'cpu'。workers:数据加载线程数。Windows 下建议设置为 2 或 4,太高容易出问题。lr0:初始学习率,默认 0.01,如果损失震荡严重可以调小到 0.001。name:训练实验名称,日志和权重会保存在runs/detect/flower_experiment下。
如果你不想写脚本,也可以直接在命令行执行:
yolo detect train data=models/flower.yaml model=yolov8s.pt epochs=50 imgsz=640 batch=8 device=04.5 运行训练并观察日志
在项目根目录执行:
python train.py训练开始后,控制台会持续输出每一轮的训练信息,包括train_loss、val_loss、mAP50、mAP50-95等指标。对初学者来说,重点关注两个值:
mAP50:当预测框与真实框的 IoU 大于 0.5 时,模型的平均检测精度。数值越高越好。mAP50-95:在不同 IoU 阈值(0.5 到 0.95)下的平均精度,这是更严格的评价指标。
如果你的验证集 mAP50 在训练结束后能达到 0.7 以上,说明模型已经具备较好的检测能力。
4.6 训练结果文件说明
训练完成后,在runs/detect/flower_experiment目录下会生成以下内容:
| 文件/目录 | 说明 |
|---|---|
weights/best.pt | 验证集表现最好的模型权重 |
weights/last.pt | 最后一轮的模型权重 |
args.yaml | 本次训练的所有超参数记录 |
results.csv | 每轮训练的详细指标 |
confusion_matrix.png | 混淆矩阵图 |
results.png | 损失曲线和指标曲线图 |
val_batch0_pred.jpg | 验证集预测结果可视化图 |
毕设论文中通常需要展示results.png和confusion_matrix.png,这些文件可以直接使用。
5. 模型推理与结果可视化
5.1 单张图片推理
训练完成后,编写predict.py对图片进行检测:
# 文件路径:predict.py from ultralytics import YOLO # 加载训练好的模型 model = YOLO('runs/detect/flower_experiment/weights/best.pt') # 推理单张图片 results = model.predict( source='data/images/val/xxx.jpg', conf=0.25, save=True, project='runs/predict', name='flower_demo' ) # 打印检测结果 for result in results: boxes = result.boxes if boxes is not None: for box in boxes: cls_id = int(box.cls[0]) conf = float(box.conf[0]) xyxy = box.xyxy[0].tolist() print(f"类别ID: {cls_id}, 置信度: {conf:.3f}, 框: {xyxy}")参数说明:
source:输入图片路径,也可以是文件夹或摄像头。conf:置信度阈值,低于该值的预测框会被过滤。save:是否保存预测结果图片。
5.2 批量推理文件夹
如果需要跑完整个验证集或测试文件夹,可以直接把source改成文件夹路径:
model.predict( source='data/images/val', conf=0.25, save=True, project='runs/predict', name='val_batch' )5.3 摄像头实时检测
如果你的毕设项目要求实时检测,可以使用摄像头作为输入源:
model.predict(source=0, show=True)其中source=0表示默认摄像头。这个功能在答辩演示时效果不错,但需要保证电脑摄像头驱动正常。
5.4 导出为其他格式
YOLOv8 支持将模型导出为 ONNX、TensorRT、OpenVINO 等格式,方便部署到服务端或边缘设备:
yolo export model=runs/detect/flower_experiment/weights/best.pt format=onnx导出后的best.onnx可以用于后续的服务化部署,也可以使用 ONNX Runtime 推理。
6. 常见问题与排查思路
6.1 PyTorch 安装慢或安装失败
现象:pip install torch一直卡住,或者安装后import torch报错。
原因:网络原因导致下载超时;或者安装的包版本与 Python 版本不匹配。
解决思路:
- 使用国内镜像源安装,例如阿里云或清华源。
- 安装 CPU 版本先跑通流程,再更换 GPU 版本。
- 检查 Python 版本,建议使用 3.9 或 3.10。
国内镜像安装方式:
pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple但注意,使用镜像源默认安装的是 CPU 版本,如果需要 CUDA 版本,建议从 PyTorch 官网复制命令,并加上--index-url参数。
6.2 CUDA 不可用
现象:torch.cuda.is_available()返回False。
原因:显卡驱动太旧;PyTorch 版本与 CUDA 版本不匹配;安装了 CPU 版 PyTorch。
解决思路:
- 执行
nvidia-smi查看显卡支持的 CUDA 版本。 - 卸载 PyTorch,重新安装对应 CUDA 版本的预编译包。
- 如果显卡是 AMD 或 Intel,无法使用 CUDA,只能使用 CPU 训练。
6.3 显存不足
现象:训练时报CUDA out of memory。
原因:batch太大,或输入图片尺寸太大。
解决思路:
- 将
batch从 16 减小到 8、4 或 2。 - 将
imgsz从 640 减小到 512 或 416。 - 关闭其他占用显存的程序。
- 使用
device=0时,确保 PyTorch 真的在使用 GPU。
6.4 训练时找不到标签文件
现象:训练日志中出现大量WARNING: corrupt image或No labels found。
原因:图片和标签文件没有放在正确的目录结构下;标签文件名和图片名不一致。
解决思路:
- 检查
data/images/train下的图片名和data/labels/train下的 txt 文件名是否一致。 - 检查
flower.yaml中path、train、val的路径是否正确。 - 手动打开一个 txt 文件,确认内容不是空的。
6.5 模型训练不收敛或 mAP 很低
现象:训练过程中损失不下降,或者验证集 mAP 一直很低。
原因:数据集标注有问题;类别数配置错误;学习率过高;数据量太少。
解决思路:
- 可视化几张验证集预测图,观察标注框是否准确。
- 检查
nc是否和实际类别数一致。 - 降低初始学习率到 0.001 再试。
- 增加数据增强,比如随机翻转、旋转、亮度调整。
6.6 推理结果没有检测框
现象:预测图片能正常输出,但画面上没有任何框。
原因:置信度阈值太高;目标太小;模型没有充分训练。
解决思路:
- 把
conf从 0.25 降低到 0.1 或 0.05。 - 检查输入图片是否包含目标。
- 确认加载的权重是
best.pt而不是last.pt。
7. 最佳实践与工程建议
7.1 统一类别 ID 管理
在训练前,把类别名称和 ID 的对应关系写到一个classes.txt文件里,方便随时查对。比如:
0 rose 1 daisy 2 tulip 3 sunflower这样无论是标注、转换格式、还是后期推理时打印类别名,都能保持一致,避免“标签错位”这种隐蔽问题。
7.2 固定随机种子
为了让每次训练结果尽量可复现,可以在训练脚本开头设置随机种子:
import random import numpy as np import torch random.seed(0) np.random.seed(0) torch.manual_seed(0) torch.cuda.manual_seed_all(0)注意,即使固定随机种子,GPU 训练时由于并行计算等原因,结果仍可能有一点点浮动,这属于正常现象。
7.3 数据增强策略
YOLOv8 默认自带一些数据增强,例如 Mosaic、随机翻转、色彩抖动等。如果数据集比较小,可以适当加强增强强度,但不要过度,否则模型会难以拟合真实图片特征。推荐的入门做法是直接用默认增强,等模型 baseline 稳定后,再逐步调整。
在train.py中可以通过augment相关参数控制,例如:
model.train( data='models/flower.yaml', epochs=50, imgsz=640, batch=8, device=0, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=10, translate=0.1, scale=0.5, fliplr=0.5, )这些参数分别控制色调、饱和度、亮度、旋转角度、平移比例、缩放比例和水片翻转概率,初学者可以先用默认值,不要急着全部改。
7.4 训练日志与模型版本管理
训练过程中的results.csv是非常宝贵的信息,建议保留。每次实验都使用不同的name参数,不要全部堆在一个目录下。这样后期写论文时,可以清晰对比不同超参数、不同骨干网络的效果。
对于权重文件,建议定期备份best.pt,因为它直接决定了后续推理效果。如果有多个实验版本,可以在权重文件名上加上_epochs或_backbone后缀。
7.5 数据安全与实验备份
在任何需要删除或覆盖文件的环节,都要先确认当前操作是否会影响原数据集标注。尤其是当你在处理标注文件时,建议保留一份原始 COCO 或 VOC 格式的备份。如果项目时间紧张,宁愿多保存几份数据,也不要因为一个误操作导致整个数据集作废。
7.6 显存与训练时间权衡
| 模型规格 | 显存占用 | 训练速度 | 推荐场景 |
|---|---|---|---|
| yolov8n | 低 | 快 | 快速验证、CPU 训练 |
| yolov8s | 中 | 较快 | 毕设项目首选 |
| yolov8m | 较高 | 中 | 对精度要求较高 |
| yolov8l | 高 | 慢 | 数据量大、GPU 较好 |
| yolov8x | 很高 | 很慢 | 竞赛或极致精度 |
对于普通毕设,yolov8s是性价比最高的选择;如果训练集非常小,也可以直接用yolov8n快速验证全流程。
7.7 类别不均衡问题
如果某些花卉类别图片特别多,而另一些特别少,模型会偏向样本多的类别。解决办法包括:
- 增加样本少类别的图片数量(最直接有效)。
- 对样本少的类别做额外数据增强。
- 调整损失函数中的类别权重。
在 YOLOv8 中,类别权重可以通过自定义 loss 或修改数据集分布实现,但初学者优先考虑扩充数据。
7.8 模型过拟合与欠拟合判断
如果训练损失持续下降,但验证集 mAP 不升反降,大概率是过拟合。此时可以增加数据增强、增加训练数据、或者使用更大的模型。反之,如果训练损失和验证损失都停留在较高位置,说明模型容量不足或训练不充分,需要增加训练轮数或换更大的模型。
看results.png是判断过拟合和欠拟合最快的方式:
- 训练损失下降、验证损失也下降:正常。
- 训练损失下降、验证损失上升:过拟合。
- 两者都不下降:学习率太高或数据集有问题。
8. 基于模型做一个小型识别程序
如果你希望毕设界面更完整,可以基于 Flask 写一个简单的 Web 上传识别功能。后端调用训练好的 YOLOv8 模型,前端上传图片,页面返回检测结果和标注图片。这里给出一个最小示例。
8.1 文件结构
web_demo/ ├── app.py ├── templates/ │ └── index.html └── uploads/8.2 Flask 后端代码
# 文件路径:web_demo/app.py import os from flask import Flask, request, render_template, redirect, url_for from ultralytics import YOLO from PIL import Image app = Flask(__name__) model = YOLO('../runs/detect/flower_experiment/weights/best.pt') UPLOAD_FOLDER = 'uploads' os.makedirs(UPLOAD_FOLDER, exist_ok=True) @app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': file = request.files['image'] if file: path = os.path.join(UPLOAD_FOLDER, file.filename) file.save(path) results = model.predict(source=path, conf=0.25) annotated_path = os.path.join(UPLOAD_FOLDER, 'annotated_' + file.filename) annotated_img = results[0].plot() Image.fromarray(annotated_img).save(annotated_path) return render_template('index.html', result=annotated_path) return render_template('index.html') if __name__ == '__main__': app.run(debug=True, port=5000)8.3 前端模板
<!-- 文件路径:web_demo/templates/index.html --> <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>花卉识别</title> </head> <body> <h1>YOLOv8 花卉识别系统</h1> <form method="post" enctype="multipart/form-data"> <input type="file" name="image" accept="image/*" required> <button type="submit">上传识别</button> </form> {% if result %} <h3>识别结果:</h3> <img src="{{ url_for('static', filename='../uploads/' ~ result) }}" style="max-width: 600px;"> {% endif %} </body> </html>这个 Demo 只是最简单的演示,生产环境还需要考虑文件大小限制、并发处理、模型加载优化等问题。不过对于毕设而言,已经足够展示“完整系统”的雏形。
9. 总结与后续学习建议
本文从 YOLOv8 的基本概念出发,梳理了环境搭建、数据集准备、模型训练、推理评估和常见排错的完整流程。核心要点可以归纳为下面几点:
- YOLOv8 是一个 Anchor-Free 的检测模型,适合同时完成目标定位和分类。
- PyTorch 是 YOLOv8 官方支持最好的框架,环境搭建时要特别注意 CUDA 版本匹配。
- 数据集格式必须严格遵循 YOLO 规范,图片与标签文件名字一一对应。
- 训练时优先关注
mAP50和mAP50-95,不要只看训练损失是否下降。 best.pt是最终要使用的权重文件,推理和部署都以它为准。- 遇到报错时,先检查环境、再检查数据、最后检查代码,这是最快的排查路径。
如果你完成了今天的花卉识别模型,下一步可以尝试做三件事:
第一,把识别结果接入简单的 Web 服务或桌面程序,形成一个小型系统,这对毕设答辩非常加分。
第二,尝试替换骨干网络或调整输入尺寸,观察 mAP 和推理速度的变化,这个过程能帮助理解模型结构对性能的影响。
第三,在更大的数据集上训练,或者使用 YOLOv8 提供的其他任务,如实例分割、姿态估计,看看同一套框架在不同任务上的表现。
训练深度学习模型,最重要的是先跑通一个最小闭环,再逐步改进。这也是我做 CV 方向这么久以来最深的体会。第一次跑通 YOLOv8 时,你可能发现很多环节靠的是“照着做”,但随着你对数据格式、损失函数、模型结构的理解加深,后续的调试会越来越顺手。如果这篇文章能帮你在毕设阶段节省一些时间,那它的目的就达到了。