本文记录一次完整的目标检测实战项目——使用无人机航拍水稻图像数据集(DRPD),基于 YOLOv8 从零训练一个水稻穗检测模型。文章面向计算机视觉初学者,以可复现为目标,所有步骤均经过实际运行验证。

前置知识要求:会 Python 基本语法、会用命令行,其他内容均可边做边学。


一、数据集介绍:DRPD 无人机水稻航拍数据集

1.1 数据集背景

DRPD(Drone Rice Paddy Dataset)是一个用于水稻穗检测的无人机航拍图像数据集,由研究团队在不同飞行高度对水稻田进行拍摄采集。该数据集的优势在于真实场景、多高度覆盖,对研究尺度变化对检测精度的影响有参考价值。

以下是三个不同飞行高度下的图像对比,可以直观看到目标尺度的差异:

7m 低空拍摄 — 水稻穗目标较大,分辨率高,细节清晰

12m 中空拍摄 — 目标中等尺度,开始出现尺度缩小

20m 高空拍摄 — 目标较小,对小目标检测能力要求更高

数据集按飞行高度分为三个子集:

子集 飞行高度 训练集 验证集 测试集
7m 低空 7 米 2286 张 381 张 1140 张
12m 中空 12 米 约 1004 张
20m 高空 20 米 约 558 张
数据集来源说明:该数据集由个人研究者整理并发布,有需要可自行搜索"DRPD 水稻航拍数据集"获取。航拍农业类数据集近年来在各个数据集分享平台上逐渐丰富,有条件的同学也可以关注一些专注于此方向的个人整理者,通常会有更系统的分类和说明文档。

1.2 YOLO 标注格式解析

每张图像对应一个同名 .txt 标注文件,格式为 YOLO 标准格式(目标检测领域最常见的标注规范之一),内容示例如下:

0 0.5146 0.7734 0.3379 0.1016
0 0.0791 0.0820 0.1543 0.1602
0 0.1807 0.5957 0.0801 0.1055

每行含义:类别编号   中心点x   中心点y   宽度   高度

YOLO 标注可视化 — 红色边框为标注框,共标注了 19 个水稻穗目标

注意这里所有坐标值均为相对于图像尺寸的归一化比例(0~1),而非像素绝对值。这是 YOLO 格式的核心特征,理解这一点对后续处理 Pascal VOC、COCO 等其他格式数据集也很重要。

此外,如果某张图像中没有目标,则对应 .txt 文件内容为空文件(大小为 0 字节),这也是正常的,不要误认为是损坏。

上方示例图即为该数据集的标注可视化效果——红色边框即为标注框,共 19 个水稻穗目标。可以对照原始 .txt 文件中的坐标数值,理解 YOLO 格式中"比例坐标"的含义:例如第一行 0 0.5146 0.7734 0.3379 0.1016,表示中心点位于图像 51.46% 处、77.34% 处,框宽高分别为图像的 33.79% 和 10.16%。

1.3 与其他农业数据集的对比

农业领域有多个公开数据集值得关注:

  • UAV-CropRow:无人机棉田行检测数据集
  • DeepWeeds:澳大利亚杂草识别数据集
  • PlantDoc:植物病害图像数据集

相比这些数据集,DRPD 的特点是专注于水稻穗的小目标检测,且覆盖了多飞行高度场景,有助于研究图像分辨率对检测精度的影响,在毕设或课程项目中具有较好的可扩展性。


二、目标检测基础与 YOLOv8 选型分析

2.1 目标检测任务的核心

目标检测(Object Detection)是计算机视觉三大基础任务之一(另外两个是图像分类和图像分割),其目标是同时解决"是什么"和"在哪里"两个问题——即输出图像中目标的类别标签和精确位置(Bounding Box)。

技术演进上,目标检测经历了从传统方法(滑动窗口 + HOG/SIFT 特征 + SVM)到深度学习方法(R-CNN 系列、SSD、YOLO 系列)的重大变革。目前工业界和学术界的主流方案均为深度学习方法。

2.2 主流目标检测框架对比

框架 特点 适用场景
R-CNN / Fast / Faster R-CNN 两阶段(先找区域再分类),精度高但速度慢 对精度要求极高的专业场景
SSD 单阶段,平衡方案 嵌入式部署
YOLO 系列 单阶段,速度快,工程化程度高 工业应用、研究首选
FCOS / CenterNet Anchor-Free 方案 学术研究

YOLO 系列之所以成为首选,原因在于:训练和推理效率高、社区生态成熟、官方工具链完善。Ultralytics 团队出品的 YOLOv8 进一步简化了从数据准备到模型部署的全流程,对初学者极为友好。

2.3 YOLOv8 各子模型选型建议

YOLOv8 提供了 5 个规模的预训练权重:

模型 参数量 mAP@50(参考) 推荐场景
yolov8n.pt 3.2M ~37.3 CPU 训练、快速原型
yolov8s.pt 11.2M ~44.9 通用场景(本文使用)
yolov8m.pt 25.9M ~50.2 精度优先
yolov8l.pt 53.7M ~52.9 高精度任务
yolov8x.pt 68.2M ~53.9 极限性能

对于初学者来说,建议从 yolov8n.pt(nano,最小最快)开始验证流程熟悉度,确认跑通后再切换到 yolov8s.pt 或更大模型以获得更好的检测精度。


三、环境配置:Python + YOLOv8 完整安装

3.1 系统环境准备

  • 操作系统:Windows 10/11、macOS、Linux 均可
  • Python 版本:3.8 ~ 3.11(建议 3.10,兼容性最好)
  • 显存:使用 NVIDIA GPU(CUDA 11.8+)可大幅加速训练;无 GPU 则使用 CPU 训练,速度较慢但流程一致
  • 硬盘空间:建议预留 10GB 以上

Python 安装推荐通过 Anaconda 或 Miniconda 进行版本管理,避免与系统 Python 冲突。

3.2 虚拟环境创建

# 创建虚拟环境
conda create -n yolo python=3.10 -y

# 激活环境
conda activate yolo

为什么要用虚拟环境? 不同项目的依赖包版本可能相互冲突,虚拟环境可以将每个项目的依赖隔离,避免"这个项目能用另一个项目就报错"的困扰。

3.3 安装 PyTorch(支持 GPU 加速)

YOLOv8 底层依赖 PyTorch,安装前建议确认是否使用 GPU:

有 NVIDIA 显卡(推荐):

pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118

无 GPU 或 AMD 显卡:

pip install torch torchvision

安装完成后验证 GPU 是否可用:

import torch
print(torch.cuda.is_available())  # 返回 True 则 GPU 可用
print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else "CPU")

3.4 安装 Ultralytics(YOLOv8 官方库)

pip install ultralytics

Ultralytics 会自动处理 YOLOv8 的所有依赖项,无需手动安装额外包。安装完成后验证:

yolo detect train --help

如果输出帮助信息,说明安装成功。


四、数据集准备:目录结构与配置文件

4.1 数据集目录结构

将数据集按如下结构组织(以 7m 子集为例):

DRPD/
└── 7m/
    ├── train/
    │   ├── 001001.jpg
    │   ├── 001001.txt    ← 同名标注文件
    │   ├── 001002.jpg
    │   ├── 001002.txt
    │   └── ...
    ├── val/
    │   ├── xxxxxx.jpg
    │   └── xxxxxx.txt
    └── test/
        └── ...

关键要求:图片和标注文件必须同名且在同一目录。YOLOv8 通过文件名一一对应来匹配图片和标注。

4.2 创建 data.yaml 配置文件

在 DRPD 根目录下新建 data.yaml

# data.yaml
path: F:/数据/自己收集的数据/水稻航拍数据集/DRPD
train: 7m/train
val: 7m/val
test: 7m/test

nc: 1          # 类别数量(1 = 水稻穗)
names: ['rice']  # 类别名称列表

路径注意:Windows 路径建议使用正斜杠 / 而非反斜杠 \。如果路径包含中文字符,确保文件编辑器保存时使用 UTF-8 编码。

4.3 快速检查数据集是否可用

在开始训练前,可以先用 YOLOv8 自带的验证命令检查数据配置是否正确:

yolo detect val data=F:/数据/自己收集的数据/水稻航拍数据集/DRPD/data.yaml model=yolov8n.pt

如果看到 Data loaded successfully 或类似提示,说明数据路径配置正确。如果报错,检查以下几点:

  1. 路径中是否存在中文字符或空格
  2. 图片文件和 txt 文件是否数量一致
  3. txt 文件格式是否符合 YOLO 规范

五、模型训练:完整参数解析与训练技巧

5.1 命令行训练(最简方式)

yolo detect train \
  data=F:/数据/自己收集的数据/水稻航拍数据集/DRPD/data.yaml \
  model=yolov8n.pt \
  epochs=50 \
  imgsz=640 \
  batch=16 \
  name=rice_detection \
  patience=10 \
  save=True \
  plots=True

参数详解:

参数 含义 默认值 本文设置
data 配置文件路径 必填 data.yaml 完整路径
model 预训练模型 必填 yolov8n.pt
epochs 训练轮数 100 50
imgsz 输入图像尺寸 640 640
batch 批量大小 16 GPU:16 / CPU:4
patience 早停轮数 100 10
save 保存模型 True True
plots 生成训练曲线图 True True

5.2 Python 代码训练(方便集成)

from ultralytics import YOLO

# 加载预训练模型
model = YOLO('yolov8n.pt')

# 开始训练
results = model.train(
    data='F:/数据/自己收集的数据/水稻航拍数据集/DRPD/data.yaml',
    epochs=50,
    imgsz=640,
    batch=16,
    name='rice_detection',
    patience=10,
    save=True,
    plots=True,
    device=0,        # 使用 GPU;CPU 训练改为 'cpu'
    workers=4,       # 数据加载线程数
    close_mosaic=10, # 前10轮关闭mosaic增强以稳定训练
)

print("训练完成")

5.3 训练过程中的核心指标解读

训练过程中每个 epoch 会输出以下关键指标:

 Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances   Size
   1/50      2.1G      1.843      2.156      1.234        45     640
   5/50      2.1G      1.512      1.724      1.108        38     640
  10/50      2.1G      1.234      1.432      0.987        42     640
  • box_loss(边界框回归损失):预测框与真实框的位置误差,越小越好
  • cls_loss(分类损失):目标类别预测的误差,DRPD 只有一类,该值通常较低
  • dfl_loss(分布焦点损失):边界框内部像素分布的损失
  • Instances:该批次中正样本(有效目标)的数量

随着训练进行,loss 应呈下降趋势。如果 loss 在上升或出现 NaN,可能是学习率过大(可降低 lr0)、batch size 过小(可增大)或数据标注存在问题。

5.4 影响训练效果的几个关键因素

① 图像分辨率(imgsz)

DRPD 数据集原始图像分辨率较高(如 4000×3000),将 imgsz 从 640 提升到 1280 可以显著提升小目标(水稻穗在高空的拍摄中目标较小)的检测精度,但会成倍增加显存消耗。

② 数据增强策略

YOLOv8 默认开启了 Mosaic 数据增强(将4张图拼接成1张),对于小数据集效果显著。如果发现模型在训练集上过拟合(验证集指标下降但训练集指标上升),可以关闭 Mosaic 或降低增强强度。

③ 多高度数据融合训练

DRPD 的三个高度子集可以单独训练,也可以合并训练。由于标注格式一致,只需修改 data.yaml 中的路径指向合并后的目录:

train:
  - 7m/train
  - 12m/train
  - 20m/train
val: 7m/val
test: 7m/test

六、训练结果解读与模型评估

6.1 输出文件说明

训练完成后,结果保存在 runs/detect/rice_detection/ 目录:

runs/detect/rice_detection/
├── weights/
│   ├── best.pt      ← 验证集上 mAP 最高的模型(推荐使用)
│   └── last.pt      ← 最后一轮的模型
├── results.csv      ← 训练曲线原始数据(可用于自定义绘图)
├── results.png      ← 训练 loss 和 mAP 曲线图
├── confusion_matrix.png    ← 混淆矩阵
├── confusion_matrix.json  ← 混淆矩阵数据
├── val_batch0_pred.jpg    ← 验证集预测可视化
├── val_batch0_labels.jpg ← 验证集真实标注可视化
└── args.yaml        ← 训练超参数配置(方便复现)

6.2 核心评估指标

在测试集上运行评估:

from ultralytics import YOLO

model = YOLO('runs/detect/rice_detection/weights/best.pt')

metrics = model.val(
    data='F:/数据/自己收集的数据/水稻航拍数据集/DRPD/data.yaml',
    split='test',
    plots=True,
)

print("mAP@0.5:   ", metrics.box.map50)
print("mAP@0.5:0.95: ", metrics.box.map)
print("Precision: ", metrics.box.mp)
print("Recall:    ", metrics.box.mr)

指标解读:

  • mAP@0.5(mAP50):IoU 阈值设为 0.5 时的平均精度。0.5 是较为宽松的标准,一般认为 >0.5 即可用,>0.7 为良好
  • mAP@0.5:0.95:在 IoU 从 0.5 到 0.95 的范围内取平均,更严格,能更好地反映模型精度
  • Precision(精确率):模型预测为正类的样本中,真正为正类的比例。高精确率意味着误检少
  • Recall(召回率):所有正类样本中,被正确预测出来的比例。高召回率意味着漏检少

对于农业检测场景,召回率通常比精确率更重要——宁可多框一些误检,也不希望漏掉真正的水稻穗。

6.3 混淆矩阵分析

混淆矩阵可以直观看出模型的误检/漏检模式。理想情况下,除了对角线外,其他位置应接近 0。对于只有一类(水稻穗)的检测任务,混淆矩阵会相对简单,重点关注 False Positive(误把背景识别为水稻穗)和 False Negative(漏检)两个数值。


七、模型推理:预测与可视化

7.1 单张图像预测

from ultralytics import YOLO

model = YOLO('runs/detect/rice_detection/weights/best.pt')

results = model.predict(
    source='F:/数据/自己收集的数据/水稻航拍数据集/DRPD/7m/test/001001.jpg',
    conf=0.25,
    iou=0.45,
    save=True,
    show=True,
    line_width=2,
    show_labels=True,
    show_conf=True,
)

for result in results:
    boxes = result.boxes
    print(f"检测到 {len(boxes)} 个目标")
    for box in boxes:
        cls_id = int(box.cls)
        conf = float(box.conf)
        xyxy = box.xyxy[0].tolist()
        print(f"  类别: {model.names[cls_id]}, 置信度: {conf:.3f}, 位置: {xyxy}")

7.2 批量预测整个测试集

from ultralytics import YOLO

model = YOLO('runs/detect/rice_detection/weights/best.pt')

results = model.predict(
    source='F:/数据/自己收集的数据/水稻航拍数据集/DRPD/7m/test/',
    conf=0.25,
    save=True,
    save_txt=True,
    name='test_predictions',
)

print(f"处理了 {len(results)} 张图像")

7.3 置信度阈值的选择

conf 参数对结果影响很大:

  • 低阈值(0.1~0.2):召回率高,误检多,适合需要"不漏检"的场景
  • 中阈值(0.25~0.35):平衡方案,推荐作为初始值
  • 高阈值(0.5~0.7):精确率高,漏检多,适合误检代价高的场景

八、常见问题与解决方案

Q1:没有 GPU,用 CPU 训练需要多久?

CPU 训练 YOLOv8n + DRPD(7m子集,2286张图),50轮大约需要 2~4 小时。可以通过减小 batch 到 4、减少 workers 来优化。

Q2:训练时显示 CUDA out of memory

GPU 显存不足,减小 batch size:batch=8 → batch=4,同时可降低 imgsz 到 416。

Q3:训练过程中 loss 变成 NaN

常见原因:学习率过高、数据标注错误、batch size 过小。对应检查 lr0 参数和标注文件坐标范围。

Q4:模型在验证集上效果好,但在测试集上效果差

可能存在过拟合或数据分布差异。DRPD 三个高度子集拍摄角度不同,7m 训练集可能无法泛化到 20m 测试集。解决方案是使用多尺度融合训练。

Q5:预训练模型下载失败

手动从 GitHub Release 页面下载 yolov8n.pt,放在项目根目录后使用本地路径加载。


九、进阶方向与扩展思路

多尺度融合训练:合并三个高度子集训练,让模型学习不同尺度下的目标特征,泛化能力更强。

模型对比实验:同一数据集上训练 yolov8n/s/m,对比精度-速度权衡,是学术论文中常见的实验设计。

模型导出与部署:训练好的模型可以导出为 ONNX(跨平台)或 TensorRT(GPU 加速推理)格式:

model.export(format='onnx', imgsz=640)
model.export(format='engine', imgsz=640, half=True)

农业场景扩展方向:病虫害检测、水稻穗计数、YOLOv8-seg 实例分割、ByteTrack 追踪等。


十、总结

本文完整记录了使用 DRPD 无人机水稻航拍数据集训练 YOLOv8 目标检测模型的全部流程:

数据理解 DRPD 数据集结构、YOLO 标注格式
环境配置 Python + Conda + PyTorch + Ultralytics
数据准备 目录结构规范、data.yaml 编写
模型训练 完整参数解析、loss 解读、训练技巧
结果评估 mAP/Precision/Recall 指标解读
模型推理 单张/批量预测、置信度调优
部署扩展 ONNX/TensorRT 导出、多尺度融合

整个流程不依赖任何付费服务,有一台普通电脑即可完成。作为计算机视觉入门项目,水稻穗检测任务的场景真实、数据规范、可扩展性强,非常适合作为课程设计或本科毕业论文的起点。

文中涉及的数据集获取,可在相关学术数据平台或 Kaggle 等社区搜索"DRPD"、"rice detection drone"等关键词获取。也可在搜索引擎中输入"DRPD 水稻数据集"查找个人研究者整理发布的资源,通常会有更完整的数据说明。

参考资料

  • Ultralytics YOLOv8 官方文档:https://docs.ultralytics.com/
  • DRPD 水稻航拍数据集相关资源:https://www.dilitanxianjia.com/20906/
  • PyTorch 官方安装指南:https://pytorch.org/get-started/locally/
  • YOLO 格式标注规范:https://docs.ultralytics.com/datasets/detect/
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐