毕设花卉识别实战:基于YOLOv8+PyTorch的全流程详解
2026/8/29 23:12:01 网站建设 项目流程

毕设花卉识别没思路?基于 YOLOv8+PyTorch 的实战项目,从环境配置到模型训练一次讲透

毕业设计选了图像识别方向,但打开电脑不知道从哪下手?网上教程一堆,要么只讲原理不给代码,要么给了代码跑不起来,卡在环境配置就劝退一半人。这次我们来看一个非常经典的实战方向:基于 YOLOv8 + PyTorch 的花卉图像识别。这个选题在毕设里出现频率很高,原因是它足够完整——有数据集、有检测模型、有可视化评估、还能扩展成网页或 App 应用,工作量适中,适合一个人独立完成,也容易讲清楚创新点。

这篇文章会从零开始,带你走完一条完整的实战链路:环境搭建 → 数据集准备与标注 → YOLOv8 原理拆解 → 模型训练 → 效果评估 → 图片/视频推理 → 批量任务与接口部署。整套流程跑完之后,你手里会有一套能运行、可验证、能展示的源码工程,而不是一堆散落的概念和报错截图。

1. 核心能力速览

先把项目的关键信息列出来,方便你判断它是否适合自己。

能力项说明
项目类型基于 YOLOv8 的目标检测实战项目,采用 PyTorch 作为深度学习框架
核心功能花卉图像识别,包含模型训练、验证、评估、推理全流程
模型结构YOLOv8 的 Backbone + Neck + Head 结构
显存需求取决于模型版本;YOLOv8n/s 较小,8G 以内显存可尝试,YOLOv8l/x 需要更大显存,实际以本机测试为准
启动方式命令行训练 + Python 脚本推理,也可封装 Web 接口
是否支持 CPU支持,但训练速度慢,建议使用 NVIDIA GPU 并安装 CUDA 版 PyTorch
是否支持批量任务支持,可对文件夹内所有图片批量推理
是否支持 API支持,可用 FastAPI/Flask 封装识别接口
代码依赖Python、PyTorch、Ultralytics、OpenCV
适合人群正在准备毕业设计的学生、入门目标检测的开发者

这里有一个很实际的优势:YOLOv8 不是只能做花卉识别。你换一套数据集,它就能识别其他物体。所以这个项目的底子打得好的话,后续扩展方向很宽。

2. 适用场景与使用边界

2.1 适合什么场景

  • 毕业设计:花卉识别是经典课题,数据公开、场景明确、评估指标清晰,很容易写出完整的技术报告。
  • 课程项目:如果想学习目标检测,YOLOv8 是目前生态最完善、上手最快的模型之一。
  • 农业/园林信息化:在授权前提下,可以将模型部署到温室、植物园的场景中,做花卉种类统计和识别。

2.2 不适合什么场景

  • 对识别精度要求极高且场景极其复杂的工业应用,需要针对性调优或更换更专业的模型。
  • 数据量极小(只有几十张图)且没有标注文件的场景,需要先扩充数据。

2.3 使用边界

花卉图像识别本身是通用目标检测技术,不涉及敏感内容。但在使用过程中需要注意以下几点:

  • 数据集版权:公开数据集(如 Oxford 102 Flowers)通常允许学术研究使用,但商用时需要确认具体授权条款。
  • 自建数据集时,拍摄的图片如果涉及他人私有场所或私有花卉资源,注意隐私和物权问题。
  • 模型若部署到公开服务,需要做好访问控制,避免被恶意刷接口。

3. 环境准备:PyTorch 与 YOLOv8 依赖安装

在动手训练之前,第一步是把环境搞定。这里以 Windows 10/11 和 Ubuntu 20.04/22.04 为例,Python 建议使用 3.9 至 3.11 版本。

3.1 安装 PyTorch

YOLOv8 底层是 PyTorch,所以必须先安装 PyTorch。打开 PyTorch 官网 ,选择你对应的系统、包管理工具和 CUDA 版本。如果你使用的是 NVIDIA 显卡,推荐安装 CUDA 11.8 或 12.1 版本对应的 PyTorch。

以 CUDA 11.8 为例,在终端中执行:

# Windows 使用 pip pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # Linux 使用 pip pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

如果你只是 CPU 环境,可以用 CPU 版本:

pip install torch torchvision torchaudio

安装完成后验证一下:

python -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"

如果输出torch.__version__2.x.y+cu118,并且torch.cuda.is_available()True,说明 GPU 环境正常。

3.2 安装 Ultralytics

Ultralytics 是 YOLOv8 的官方 Python 包,安装很简单:

pip install ultralytics

安装之后可以顺便验证一下:

yolo predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'

这条命令会下载一个很小的 YOLOv8n 模型,并对示例图片执行推理。如果输出结果中能看到对应类别和框坐标,说明环境已经通了。

3.3 验证 CUDA 环境

如果你安装的是 GPU 版 PyTorch,但torch.cuda.is_available()返回False,问题一般出在三个地方:

  • NVIDIA 驱动版本过低,需要到官网更新驱动。
  • PyTorch 的 CUDA 版本和驱动不匹配。
  • 电脑上有多套 Python 环境,pip 装到了别的环境中。

建议使用 conda 创建独立环境:

conda create -n yolo python=3.10 -y conda activate yolo

然后在新环境中重新安装依赖,这样不会污染系统 Python,也方便后面备份和复现环境。

4. 数据集准备:从公开数据集到自制数据集

花卉识别项目,数据是第一步。这里提供两种路线。

4.1 使用公开数据集

最经典的是Oxford 102 Flowers数据集,包含 102 类花卉,每类 40 到 258 张图片,非常适合做分类或检测。

还有Flower Recognition数据集,包含 5 类常见花卉(雏菊、蒲公英、玫瑰、向日葵、郁金香),规模较小,适合入门验证。

如果你使用的是分类格式的数据集,而 YOLOv8 需要检测格式(txt 标签文件),需要先做格式转换。转换逻辑是:根据每张图片的类别标签生成一个只有类别号、没有框坐标的标注文件,或者先把分类任务当成检测任务,对每张图用一个覆盖全图的框来标注。

更通用的做法是使用已经标注成 YOLO 格式的检测数据集。你可以在 Roboflow Universe 上搜索“flower detection”,下载 YOLOv8 格式的数据集。下载下来后通常包含:

dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── valid/ │ ├── images/ │ └── labels/ └── data.yaml

data.yaml是数据配置文件,内容类似:

train: dataset/train/images val: dataset/valid/images nc: 5 names: ['daisy', 'dandelion', 'rose', 'sunflower', 'tulip']

注意:nc是类别数,names是类别名称列表。这两项必须和你的标签文件一致,否则训练会报错。

4.2 自建数据集:拍摄图片 + LabelImg 标注

如果你想做一套属于自己的数据集,推荐用 LabelImg 标注。

安装方式:

pip install labelImg labelImg

标注流程:

  1. 在 LabelImg 中打开图片文件夹。
  2. 点击Create RectBox画框,框住花卉主体。
  3. 选择或输入类别名称。
  4. 保存为 YOLO 格式。
  5. 导出后会生成同名 txt 文件,格式为:
class_id x_center y_center width height

注意,这里的x_center y_center width height都是归一化到 0-1 之间的比例数值,不是像素坐标。

比如一张图片里有一朵玫瑰,标注文件可能是:

2 0.51234 0.47321 0.23345 0.35678

其中2是玫瑰在类别表中的索引。

自建数据集有几个提高质量的小建议:

  • 每类花卉至少收集 150 张以上图片,覆盖不同角度、不同光照、不同背景。
  • 同一个目标的框尽量紧贴目标边界,不要包含太多背景。
  • 训练集、验证集、测试集比例建议 8:1:1。
  • 不要从网上批量爬取大量重复或低分辨率图片,模型会学不到有效特征。

5. YOLOv8 模型结构详解:为什么它能又快又准

这一步是毕设答辩中被老师提问的高频区。你要能讲清楚 YOLOv8 相比之前版本有哪些改进。

5.1 Backbone:C2f 模块

YOLOv8 的 Backbone 使用了C2f模块替代之前的 C3 模块。C2f 模块的特点是:通过 split 操作将特征图分成两个分支,其中一个分支经过多个 Bottleneck 模块,最后把不同层级的特征拼接起来。

这样做的好处是:在保持轻量化的同时,增强了梯度流和特征复用能力。对于花卉这种纹理复杂、颜色丰富的目标,C2f 能提取到更丰富的细节特征。

5.2 Neck:PAN-FPN 结构

YOLOv8 采用 PAN-FPN(Path Aggregation Network)结构,自顶向下传递语义特征,同时自底向上传递定位特征。这样能把大目标的全局信息和细节信息更好地融合,提升多尺度检测能力。一朵小花可能只占图片很小区域,是一个典型的小目标;而大片花丛又可能是大目标。PAN-FPN 对这种尺度差异大的场景很有帮助。

5.3 Head:解耦头 + Anchor-Free

YOLOv8 的检测头是 Decoupled Head,分类和回归分支分开,各用一组卷积处理。同时 YOLOv8 转向了Anchor-Free方式,不再预设 anchor box,而是直接把目标中心点映射到特征图上,根据目标尺寸动态调整。

Anchor-Free 的优势是:

  • 减少了 anchor 的超参数调优过程。
  • 训练时正样本匹配更灵活。
  • 推理阶段输出更加直接。

5.4 损失函数

YOLOv8 在回归分支使用了CIoU 或 DFL 损失,分类分支使用 BCE Loss。DFL 损失通过分布估计让目标框回归更精确。

这部分是答辩时的加分项。如果能画一张网络结构图,标出 C2f、SPPF、PAN-FPN、Detect Head 的位置,老师会觉得你的工作量很扎实。

6. 训练自己的花卉 YOLOv8 模型

环境装好、数据准备好、原理也懂了,下面开始真正的训练流程。

6.1 准备数据配置文件

在项目下创建flower-data.yaml

path: ./datasets/flower # 数据集根目录 train: train/images val: valid/images test: test/images nc: 5 names: ['daisy', 'dandelion', 'rose', 'sunflower', 'tulip']

6.2 训练命令

Ultralytics 提供了两种训练方式:命令行和 Python 代码。

命令行方式:

yolo detect train data=flower-data.yaml model=yolov8s.pt epochs=100 imgsz=640 batch=16 device=0

Python 方式:

from ultralytics import YOLO # 加载预训练权重,s 版本兼顾速度和精度 model = YOLO("yolov8s.pt") # 开始训练 results = model.train( data="flower-data.yaml", epochs=100, imgsz=640, batch=16, device=0, # 0 表示第一张 GPU,CPU 可改为 "cpu" workers=4, project="runs/train", name="flower_yolov8s", patience=20, # 早停 save_period=10, # 每 10 轮保存一次权重 )

参数说明:

  • model:预训练权重路径。如果本地没有,会自动下载。yolov8n.pt最小最快,yolov8s.pt精度更好,yolov8m.pt需要更多显存。
  • epochs:训练轮数。新手可以先跑 50 轮看曲线是否收敛,再决定是否增加。
  • imgsz:输入图片尺寸。640 是默认值,增大到 1280 能提升小目标识别效果,但显存占用也翻倍。
  • batch:批大小。根据显存调整。如果报CUDA out of memory,从 16 降到 8 或 4。
  • device0表示使用第一块 GPU。多卡可以写0,1
  • patience:如果验证集指标连续 20 轮没有提升,自动结束训练,节省时间。

训练过程中终端会输出每个 epoch 的损失、mAP50、mAP50-95 等指标。同时也会生成runs/train/flower_yolov8s/目录,里面包括:

  • weights/best.pt:验证集指标最好的权重。
  • weights/last.pt:最后一个 epoch 的权重。
  • results.png:损失曲线和 mAP 曲线。
  • confusion_matrix.png:混淆矩阵。
  • val_batch*.jpg:验证集批次预测可视化。

6.3 显存不足怎么办

如果显存不够,按顺序尝试:

# 1. 减小 batch yolo detect train data=flower-data.yaml model=yolov8s.pt epochs=100 imgsz=640 batch=8 device=0 # 2. 换更小的模型 yolo detect train data=flower-data.yaml model=yolov8n.pt epochs=100 imgsz=640 batch=16 device=0 # 3. 降低图片尺寸 yolo detect train data=flower-data.yaml model=yolov8s.pt epochs=100 imgsz=512 batch=16 device=0

从实际部署经验看,YOLOv8n/s 在 8G 显存显卡上可以正常训练,batch 控制在 16 以内一般不会爆显存。但这是一个大致区间,具体还需要看你的数据集图片大小和训练环境,不要把它当成绝对标准。

7. 模型评估:怎么判断模型训练得好不好

训练完成之后,需要用验证集来评估效果,不能只看训练损失。

7.1 验证命令

yolo detect val model=runs/train/flower_yolov8s/weights/best.pt data=flower-data.yaml

输出的关键指标:

  • mAP50:IoU 阈值为 0.5 时的平均精度。这个数值越高越好,0.9 以上说明模型在简单场景下已经比较可靠。
  • mAP50-95:IoU 从 0.5 到 0.95 递增后的平均精度,更严格。
  • Precision:预测为正样本中真正正确的比例。
  • Recall:所有正样本中被正确找出来的比例。

花卉识别项目中,mAP50 达到 0.85 以上是一个比较理想的水平。

7.2 查看混淆矩阵

训练结束后打开runs/train/flower_yolov8s/confusion_matrix.png。对角线上的数值越高越好。如果几种花卉互相混淆严重,说明它们外观差异不大,需要扩充对应类别的数据量或调整训练策略。

7.3 过拟合与欠拟合

  • 如果训练损失持续下降,但验证损失先降后升,说明过拟合。可以增加数据增强、增大数据量或加入早停。
  • 如果训练损失和验证损失都居高不下,说明模型容量不足或训练轮数不够,换大模型或增加轮数。

8. 推理测试:图片、视频、批量任务

训练出来的best.pt就是最终产物。下面演示如何用它做推理。

8.1 单张图片推理

yolo detect predict model=runs/train/flower_yolov8s/weights/best.pt source=test_images/rose.jpg conf=0.3 save=True

conf=0.3表示只有置信度超过 0.3 的检测结果才会输出。置信度阈值可以按场景调整,如果要求高精度就调高,如果要求高召回就调低。

Python 方式:

from ultralytics import YOLO model = YOLO("runs/train/flower_yolov8s/weights/best.pt") results = model.predict( source="test_images/rose.jpg", conf=0.3, save=True, project="runs/predict", name="single" )

输出结果会保存在runs/predict/single/下。同时results[0].boxes里保存了检测框坐标、置信度和类别索引,方便后续逻辑处理。

8.2 批量推理文件夹

批量任务在毕设中很重要,因为在验收时你要展示模型能对大量图片快速识别:

from ultralytics import YOLO import os model = YOLO("runs/train/flower_yolov8s/weights/best.pt") image_dir = "test_images" results = model.predict( source=image_dir, # 自动遍历文件夹内所有图片 conf=0.3, save=True, save_txt=True, # 保存 txt 格式的检测结果 project="runs/predict", name="batch" ) for result in results: img_path = result.path print(f"图片: {img_path}") for box in result.boxes: cls_id = int(box.cls[0]) conf = float(box.conf[0]) xyxy = box.xyxy[0].tolist() print(f" 类别索引: {cls_id}, 置信度: {conf:.4f}, 框坐标: {xyxy}")

批量推理的常见问题:

  • 某张图片卡住没有输出。

    排查:检查该图片是否损坏,或尝试将其格式统一转换为 JPG。

  • 文件夹中混入了非图片文件。

    排查:推理前先过滤扩展名,只保留.jpg.png.jpeg

8.3 视频推理

yolo detect predict model=runs/train/flower_yolov8s/weights/best.pt source=demo.mp4 conf=0.3 save=True

视频推理一般用于展示。如果你要做实时摄像头识别,可以把source改成0表示调用默认摄像头:

yolo detect predict model=runs/train/flower_yolov8s/weights/best.pt source=0 conf=0.3 show=True

9. 接口 API 与业务系统接入

如果你的毕设要做成一个小系统,比如网页端上传图片识别花卉,可以直接用 FastAPI 封装一个推理接口。

9.1 FastAPI 封装示例

from fastapi import FastAPI, File, UploadFile from ultralytics import YOLO from PIL import Image import io app = FastAPI() model = YOLO("runs/train/flower_yolov8s/weights/best.pt") # 类别名称要和训练时一致 CLASS_NAMES = ['daisy', 'dandelion', 'rose', 'sunflower', 'tulip'] @app.post("/predict") async def predict(file: UploadFile = File(...)): # 读取上传文件 image_bytes = await file.read() image = Image.open(io.BytesIO(image_bytes)) # 执行推理 results = model.predict(image, conf=0.3) boxes = results[0].boxes detections = [] for box in boxes: cls_id = int(box.cls[0]) conf = float(box.conf[0]) xyxy = box.xyxy[0].tolist() detections.append({ "class": CLASS_NAMES[cls_id], "confidence": round(conf, 4), "bbox": [round(v, 2) for v in xyxy] }) return { "success": True, "count": len(detections), "detections": detections } if __name__ == "__main__": import uvicorn uvicorn.run(app, host="127.0.0.1", port=8000)

9.2 调用接口测试

启动服务:

python api_server.py

然后调用:

curl -X POST "http://127.0.0.1:8000/predict" \ -F "file=@rose.jpg"

Python 调用:

import requests url = "http://127.0.0.1:8000/predict" files = {"file": open("rose.jpg", "rb")} response = requests.post(url, files=files, timeout=30) print(response.json())

返回示例:

{ "success": true, "count": 1, "detections": [ { "class": "rose", "confidence": 0.9321, "bbox": [102.34, 88.12, 342.56, 289.78] } ] }

注意,这个接口示例是通用模板,实际字段名和返回结构需要根据你的业务场景调整。在毕设报告中,可以额外说明如果要在生产环境中部署,还需要加:请求鉴权、限流、日志记录、模型版本管理等模块。

10. 资源占用与性能观察

在训练和推理过程中,有几个指标值得观察:

  • 显存占用:可以用nvidia-smi命令实时查看。
  • GPU 利用率:训练时 GPU 利用率通常应该在 80% 以上,如果很低,可能是数据加载太慢,可以增加workers参数。
  • CPU 占用:如果数据增强复杂,CPU 会成为瓶颈。
  • 启动速度:模型加载时会有几秒初始化时间,这是正常现象。

训练过程中把 batch 调大,显存占用会明显上升;imgsz从 640 提升到 1280,显存占用可能增加 2 倍以上。推理时如果显存不够,可以尝试只做推理而不保存标注框渲染图,或者降低imgsz

11. 常见问题与排查方法

问题现象可能原因排查方式解决方案
ModuleNotFoundError: No module named 'ultralytics'依赖未安装检查 pip listpip install ultralytics
torch.cuda.is_available()返回 FalseCUDA 驱动或 PyTorch 版本不匹配查看 NVIDIA 驱动版本更新驱动,重装对应 CUDA 版本的 PyTorch
CUDA out of memory显存不足查看 nvidia-smi减小 batch,换 yolov8n,降低 imgsz
训练 loss 为 NaN学习率过大或数据异常检查数据标签、学习率降低学习率,检查数据集中是否有空标注文件
mAP 一直很低数据量不足或标注不准检查标注框、类别对应扩充数据集,清理错误标注
推理时检测不到目标置信度阈值过高降低 conf 参数测试conf=0.1测试,确认后再调回
端口被占用上一个服务未关闭检查端口占用netstat -ano查看占用并杀掉进程,或换端口启动
批量推理时内存持续上涨图片一次性加载过多查看系统内存改为逐批处理,降低 batch 或使用流式读取

端口冲突的排查示例(Windows):

netstat -ano | findstr :8000 taskkill /PID 12345 /F

Linux 下:

lsof -i:8000 kill -9 12345

12. 最佳实践与正式使用建议

如果你不只是想要一个能跑通的 Demo,而是希望这个项目真正站得住脚,可以参考下面这些工程化建议。

12.1 环境隔离

训练深度学习项目时永远建议使用独立环境,不要直接装到系统 Python 里。环境文件分享给别人时,用requirements.txt固定版本:

pip freeze > requirements.txt

别人复现时:

pip install -r requirements.txt

12.2 文件目录管理

建议按这个结构组织项目:

flower-recognition/ ├── datasets/ │ └── flower/ │ ├── train/ │ ├── valid/ │ └── test/ ├── runs/ │ ├── train/ │ └── predict/ ├── weights/ ├── api_server.py ├── train.py ├── predict.py └── requirements.txt

模型文件、输入素材、输出结果分开存放,避免训练一轮后目录乱成一团。

12.3 小参数先跑通

第一次训练不要直接上 100 轮,先用 20 轮、batch=4、yolov8n 跑通整个流程,确认没有报错后再正式训练。这样排查问题效率最高。

12.4 记录每个版本的训练配置

建议在训练脚本中固定记录参数。比如:

from ultralytics import YOLO config = { "model": "yolov8s.pt", "data": "flower-data.yaml", "epochs": 100, "imgsz": 640, "batch": 16, "lr0": 0.01, } model = YOLO(config["model"]) results = model.train(**config)

这样下次想复现结果,直接读配置就能还原。

12.5 部署安全

接口服务默认绑定127.0.0.1,只在本机访问。如果要在局域网或公网使用,建议加访问令牌,并用反向代理保护后端服务。

12.6 数据合规

如果自建数据集,优先使用自己拍摄的图片。使用公开数据集时,务必检查授权条款。项目涉及真实人脸、声音或私人场所时,要提前做好脱敏处理。

13. 总结与下一步

这个基于 YOLOv8 + PyTorch 的花卉图像识别项目,最值得尝试的点在于:它把目标检测的完整链路浓缩在一个很小的项目里。从环境搭建、数据处理、模型训练、效果评估到接口封装,每个环节都能学到可迁移到其他任务的技能。跑通之后,你不仅能完成一个毕设题目,还能把它扩展到草莓成熟度检测、交通标志识别、PCB 缺陷检测等更多方向。

最先应该验证的功能是:环境和数据集是否正确。先用yolov8n.pt跑 20 轮,确认训练和评估流程没有问题,再正式训练并调优。

最容易踩的坑有三个:

  1. PyTorch 的 CUDA 版本装错,导致 GPU 不可用。
  2. 数据集的 yaml 配置里类别数或类别名不一致,训练时直接报错。
  3. 标注框格式错误,把像素坐标当成归一化坐标,导致检测结果偏移。

后续可以继续扩展的方向包括:用 TensorRT 加速推理、把接口部署到服务器、加入 Gradio 做一个可交互的演示页面、把模型导出为 ONNX 后嵌入到移动端应用。建议把项目源码、数据集说明、模型权重整理到同一个仓库里,毕设答辩时直接展示可复现的项目,这样的工作量呈现会更有说服力。

这套流程走完,你对 YOLOv8 和 PyTorch 的理解会从“看过教程”变成“能独立上手”。下一步就是打开终端,把环境装好,第一次训练跑起来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询