YOLOv8与PyTorch实战:花卉目标检测全流程指南
在毕业设计里“花卉图像识别”是出现频率很高的题目。很多同学第一反应是拿一个图像分类网络把花的种类分出来但随着需求细化问题往往不只是分类一张照片里可能同时出现多朵花需要标出每朵花的位置要统计一块花田里某种花的数量要把识别结果做成可视化界面。这些需求已经不是单纯分类模型能覆盖的了目标检测是更合适的思路。YOLOv8 是 Ultralytics 开源的检测框架底层依赖 PyTorch训练、验证、导出、推理都被封装成比较完整的链路很适合作为毕设项目的技术主线。下面的内容会围绕“YOLOv8 PyTorch 花卉识别”走完一次完整实战先说明为什么选检测而不是分类再准备环境整理数据集配置训练参数跑通训练和验证最后处理常见报错并给出增量训练和部署扩展的建议。按这个顺序操作顺利的话一个小时左右就能把最小可用的花卉检测模型在自己电脑上跑起来。1. 为什么花卉识别选 YOLOv8 而不是普通分类网络1.1 YOLOv8 的检测能力与网络结构特点YOLOv8 的核心任务是目标检测解决的是“一张图里有谁、在哪里、是什么”的问题。它把整张图划分成多个区域通过网络直接回归每个目标的边界框、置信度和类别概率因此推理速度很快可以同时输出大量目标的位置与类别。从网络结构看YOLOv8 可以分成三部分Backbone负责提取图像特征使用了 C2f 模块。C2f 在跨层连接基础上做了更丰富的梯度流设计让浅层细节和深层语义都能被有效保留。Neck采用 PAN-FPN 结构把不同尺度的特征图融合起来。小目标靠浅层高分辨率特征大目标靠深层语义特征融合后能兼顾不同大小的花朵。Head使用解耦检测头分类分支和回归分支分开输出并且采用 anchor-free 方式直接回归目标框的中心点和宽高。相比旧版本需要预设锚框anchor-free 让后处理更简单也更容易上手。如果你之前只用过分类网络可以把 YOLOv8 理解成“在分类基础上加了位置回归”。分类模型输出的是“这朵花是什么”检测模型输出的是“这里有花、花的类别是什么、花在哪里”。1.2 花卉场景为什么更适合用检测思路花卉图像和通用目标检测场景略有不同一张图里通常有多个目标。公园照片、花束图片、花田航拍图中同一画面会出现几十朵花分类网络只能给整张图一个类别无法表达“图里同时有玫瑰和向日葵”。目标之间存在遮挡和重叠。花朵层层叠叠需要模型学会区分不同个体的边界这正是检测模型的长处。毕设经常需要输出数量和位置。比如统计花田某类花的数量、按坐标裁剪局部区域这些都要依靠边界框完成。从答辩角度看检测任务比单纯分类更容易展示技术深度可以展示 mAP 指标、可视化检测框、分析漏检误检案例还能进一步扩展成统计系统或巡检系统。1.3 任务定位先想清楚产品形态再决定模型不是所有花卉识别都必须用检测模型。先明确你的毕设最终交付形态再选任务类型。需求形态推荐方式输出内容适用场景单张图只有一朵花只判断品种图像分类YOLOv8 classify 或 CNN 分类模型类别概率单花特写识别一张图多朵花需要定位和计数目标检测YOLOv8 detect边界框、类别、置信度花田统计、相册批量识别需要精细分割花瓣轮廓实例分割YOLOv8 segment掩码和边界框花瓣面积测算、形态分析如果毕设题目只写了“花卉图像识别”优先建议做目标检测。它兼容分类能力又能输出位置信息后期扩展空间大。但也要量力而行如果数据集很小、标注经验不足可以先跑通检测再考虑分割。注意先想清楚“识别”在题目里的具体含义。检测模型输出的是边界框和类别不是直接输出“整张图属于哪一类”。答辩前要能把需求、模型输出、评价指标三者对应起来。2. 环境准备PyTorch、CUDA 与 ultralytics 安装2.1 安装前先确认硬件和驱动训练 YOLOv8 需要 PyTorch 调用 GPU 加速。虽然 CPU 也能训练但速度会慢很多。以常见配置为例GTX 1660 Ti 6GB 显存可以训练 YOLOv8n 和 YOLOv8s只要 batch 和图像尺寸控制好8GB 显存可以比较舒服地训练 YOLOv8s如果是服务器上的 24GB 显存YOLOv8m 也能跑。打开终端执行nvidia-smi重点看两行右上角 Driver Version显卡驱动版本。中间 CUDA Version当前驱动支持的最高 CUDA 版本。这个 CUDA Version 不是说你已经装了 CUDA Toolkit而是指驱动能够兼容的上限。PyTorch 安装时选择的 CUDA 版本不能超过这个上限。2.2 创建独立虚拟环境并安装 PyTorch强烈建议用 conda 创建独立环境避免项目依赖污染系统 Python。以 Python 3.10 为例conda create -n flower python3.10 -y conda activate flower激活后安装 PyTorch。以 CUDA 11.8 版本为例官方推荐的安装命令是pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118如果你的驱动更新可以换成 cu121 或 cu124 对应的命令。具体版本以 PyTorch 官网安装页当前提供的命令为准不要盲目复制旧命令。如果电脑没有 NVIDIA 显卡可以先装 CPU 版pip install torch torchvision torchaudioCPU 版能跑通流程但训练时间会明显增加。建议先用 CPU 版把小数据集、小迭代次数验证一遍再去找带 GPU 的机器训练。2.3 安装 ultralytics 并做环境验证PyTorch 装好后继续安装 YOLOv8 的官方工具包pip install ultralytics安装完成后执行一个最关键的验证脚本import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else CPU only)预期输出是 PyTorch 版本号然后是True最后是显卡型号。如果torch.cuda.is_available()返回False说明 PyTorch 和驱动之间不匹配先不要急着训练回到 2.1 检查驱动版本。再确认 ultralytics 安装成功yolo version能输出版本号就说明命令行入口正常。注意不要用pip install torch和pip install torchvision分开装两个不同时期发布的版本。torch 和 torchvision 必须配套否则导入 ultralytics 时可能出现mismatch或undefined symbol报错。2.4 环境检查清单检查项命令或方法预期结果显卡驱动nvidia-smi能看到显卡信息和驱动版本Python 版本python --version3.9 到 3.11 均可PyTorch GPU 可用torch.cuda.is_available()Trueultralytics 安装yolo version输出版本号当前目录写权限训练时确认项目目录可写能创建runs/目录3. 数据集准备从原始图片到 YOLO 标注格式3.1 数据来源与选择建议花卉检测数据集有两个来源公开数据集Oxford 102 Flowers 是比较经典的花卉数据集包含 102 类花卉适合做分类和检测研究Oxford 17 Flowers 类别更少适合快速跑通流程。自建数据集用手机拍摄不同品种、不同角度的花卉再用标注工具手动标注。自建数据集工作量较大但更贴合毕设独创性要求。如果使用公开数据集要注意查看它的标注形式是不是目标检测需要的边界框格式。很多经典花卉数据集是为分类设计的只有类别标签没有边界框。这种情况下要么自己补标注要么只做分类任务。标注工具推荐 LabelImg它可以直接导出 YOLO 格式的 txt 文件。标注时建议遵循一个原则框住完整花朵主体尽量少包入花茎和大片背景因为背景越多模型越容易学到错误特征。3.2 按 YOLOv8 要求组织目录结构YOLOv8 对数据集目录有约定通常这样组织flower_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── flower.yaml图片放在images对应子目录标注文件放在labels对应子目录。标注文件是 txt 文件文件名和图片名一致后缀从.jpg换成.txt。例如rose_001.jpg对应rose_001.txt。目录结构错位是新手最常见的问题之一。YOLOv8 查找标签时是自动把images替换成labels如果你把标注文件放错目录训练时会出现大量 “no labels found” 警告。3.3 YOLO 标注格式与坐标转换每个 txt 文件中的每一行对应一个目标格式为class_id x_center y_center width height其中x_center、y_center、width、height都是相对于图片宽高归一化后的值范围在 0 到 1 之间。例如一张 640x480 的图片玫瑰的边界框左上角是 (100, 80)右下角是 (300, 260)。转换公式如下img_w, img_h 640, 480 x1, y1, x2, y2 100, 80, 300, 260 x_center ((x1 x2) / 2) / img_w y_center ((y1 y2) / 2) / img_h width (x2 - x1) / img_w height (y2 - y1) / img_h print(x_center, y_center, width, height)输出结果为0.3125 0.3541666666666667 0.3125 0.375最终 txt 文件里写0 0.3125 0.3542 0.3125 0.375注意顺序是x_center y_center width height不是x1 y1 x2 y2。如果沿用分类任务的习惯直接填绝对坐标训练时 loss 会异常检测框会全部偏到一边或直接变成 NaN。3.4 数据划分与质量检查数据划分建议按 8:1:1 或 7:2:1 分割成训练集、验证集、测试集。必须保证验证集和训练集没有重叠否则评估结果虚高答辩时经不起追问。划分完成后写一个简单脚本检查标注质量import os from collections import Counter label_dir flower_dataset/labels/train class_counter Counter() for name in os.listdir(label_dir): path os.path.join(label_dir, name) for line in open(path, r): parts line.strip().split() if len(parts) ! 5: print(格式错误:, path, line) continue cls_id int(parts[0]) class_counter[cls_id] 1 values [float(v) for v in parts[1:]] if not all(0 v 1 for v in values): print(坐标越界:, path, line) print(class_counter)检查两个重点每个 txt 是否都是 5 列类别 id 是否从 0 开始连续编号。坐标是否都在 0 到 1 之间。如果出现大于 1 的值说明标注工具导出的是绝对坐标需要先转换。4. 训练配置数据集 YAML 与关键超参数说明4.1 编写数据集 YAML在数据集根目录创建flower.yaml内容如下path: /absolute/path/to/flower_dataset train: images/train val: images/val test: images/test names: 0: rose 1: sunflower 2: tulip 3: daisy 4: dandelionpath是数据集根目录的绝对路径。train、val、test都是在path下的相对路径。names是类别名列表顺序必须和标注文件里的class_id一一对应。这里最容易踩的坑是path写错或写相对路径。YOLOv8 在有些版本里会把相对路径解析到当前工作目录而不是 YAML 文件所在目录。最稳妥的做法是写绝对路径并且在项目目录下统一管理数据路径。4.2 模型选型n、s、m、l、x 怎么选YOLOv8 提供五个规模。以官方公开的参考指标来看参数量和计算量大致如下模型参数量(约)计算量(约)推荐显存适用场景YOLOv8n3.2M8.7 GFLOPs2-4GB快速验证、CPU 推理YOLOv8s11.2M28.6 GFLOPs4-6GB毕设常用速度精度平衡YOLOv8m25.9M78.9 GFLOPs8GB精度要求较高YOLOv8l43.7M165.2 GFLOPs12GB数据量大、显存充足YOLOv8x68.2M257.8 GFLOPs16GB追求最高精度如果是第一次跑通流程直接选 YOLOv8n它训练快、显存占用小能让你在最短时间内验证数据、代码、环境都没问题。确认流程没问题后再用 YOLOv8s 或 YOLOv8m 做正式训练。GTX 1660 Ti 6GB 建议使用 n 或 s 模型batch 控制在 8 到 16。4.3 关键训练参数速查训练参数不需要全记住但下面几个必须理解参数常用取值作用注意事项epochs100-300训练轮数小数据集可以配合早停imgsz640输入图像尺寸调大会增加显存和训练时间batch8-32每批图片数量显存不足时优先调小 batchlr00.01 左右初始学习率loss 为 NaN 时优先调小patience20-50早停耐心轮数验证指标不再提升时提前结束workers2-8数据加载进程数Windows 下遇到卡死先调到 0 或 2device0使用哪张显卡CPU 训练填 cpuimgsz不是越大越好。花卉目标本身比较大640 已经够用。把imgsz从 640 调到 320训练速度会明显提升但小花朵可能检测不到调到 1280 会显著增加显存占用收益不一定明显。5. 模型训练与训练日志解读5.1 命令行方式快速训练进入项目目录执行yolo detect train data/absolute/path/to/flower_dataset/flower.yaml modelyolov8n.pt epochs100 imgsz640 batch16 device0modelyolov8n.pt表示使用官方预训练权重作为初始权重。第一次运行时工具会自动下载权重文件如果网络不通导致下载失败可以从官方 GitHub Releases 页面手动下载yolov8n.pt放到当前目录再重新执行命令。使用预训练权重是迁移学习比从零训练收敛更快。如果确实想从零训练可以把model改成yolov8n.yaml但小数据集不建议这样做效果通常不如预训练权重。5.2 Python 代码方式训练毕设需要提交代码用 Python 脚本更清晰。新建train.pyfrom ultralytics import YOLO model YOLO(yolov8n.pt) model.train( data/absolute/path/to/flower_dataset/flower.yaml, epochs100, imgsz640, batch16, device0, workers4, patience30, optimizerauto, projectflower_project, namerun1, pretrainedTrue, )训练完成后会在flower_project/run1/目录下生成结果主要文件有flower_project/run1/ ├── weights/ │ ├── best.pt │ └── last.pt ├── args.yaml ├── results.csv ├── results.png ├── confusion_matrix.png ├── val_batch0_pred.jpg └── ...best.pt是验证集表现最好的权重last.pt是最后一轮的权重。之后做推理、导出、部署一律使用best.pt。5.3 训练日志与指标含义训练过程中会实时打印损失值和指标box_loss边界框回归损失衡量预测框和真实框的位置差距。cls_loss分类损失衡量类别判断是否正确。dfl_loss分布焦点损失帮助边界框定位更精准。precision精确率预测为正类的样本里真正正确的比例。recall召回率所有真实正类样本中被找回来的比例。mAP50IoU 阈值 0.5 下的平均精度是毕设最常用的指标。mAP50-95IoU 从 0.5 到 0.95 取多个阈值的平均精度更严格。判断训练是否正常可以看两个趋势训练集 loss 持续下降说明模型在学习。验证集 mAP 上升后趋于平稳说明模型在泛化。如果训练 loss 下降但验证 mAP 不升反降大概率是过拟合需要增加数据、增大数据增强或减小模型规模。5.4 绘制损失函数曲线YOLOv8 训练时已经把results.csv保存下来直接读它画图import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(flower_project/run1/results.csv) df.columns [c.strip() for c in df.columns] epoch df[epoch] fig, axes plt.subplots(1, 2, figsize(12, 4)) axes[0].plot(epoch, df[train/box_loss], labeltrain/box_loss) axes[0].plot(epoch, df[val/box_loss], labelval/box_loss) axes[0].set_title(Box Loss) axes[0].legend() axes[1].plot(epoch, df[metrics/mAP50(B)], labelmAP50) axes[1].plot(epoch, df[metrics/mAP50-95(B)], labelmAP50-95) axes[1].set_title(mAP) axes[1].legend() plt.tight_layout() plt.savefig(training_curves.png, dpi150)画出来的曲线图可以直接放进毕设论文的实验分析部分。建议把 train loss 和 val loss 放在同一张图能直观展示是否有过拟合。注意results.csv的列名首尾可能带空格读取后先用strip()清洗列名否则按列名取数据会报 KeyError。6. 模型验证与推理把检测结果可视化6.1 在验证集上评估模型训练结束后运行验证命令yolo detect val modelflower_project/run1/weights/best.pt data/absolute/path/to/flower_dataset/flower.yaml batch16输出会包含Precision精确率。Recall召回率。mAP50IoU 为 0.5 时的平均精度。mAP50-95更严格的平均精度。各类别的详细指标。对于花卉检测如果目标较大、类别区分明显mAP50 一般能达到 0.8 以上才算可接受。如果只有 0.3 以下先不要急着调模型回头检查标注质量和类别数量是否均衡。6.2 图片、文件夹、视频和摄像头推理对单张图片推理yolo detect predict modelflower_project/run1/weights/best.pt sourcetest_images/rose01.jpg conf0.25 saveTruesource可以是单张图片、图片文件夹、视频文件甚至摄像头。使用摄像头时把source写成0。Python 方式推理from ultralytics import YOLO model YOLO(flower_project/run1/weights/best.pt) results model.predict( sourcetest_images/, conf0.25, saveTrue, ) for result in results: 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:.2f}坐标 {xyxy})conf是置信度阈值低于这个值的检测框会被过滤。毕设里常用 0.25 或 0.3实际报告结果时可以说明“只保留置信度大于 0.25 的检测结果”这样更严谨。6

相关新闻

最新新闻

日新闻

周新闻

月新闻