YOLOv8 无人机航拍水稻目标检测实战:从环境配置到模型训练完整流程
本文记录一次完整的目标检测实战项目——使用无人机航拍水稻图像数据集(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 或类似提示,说明数据路径配置正确。如果报错,检查以下几点:
- 路径中是否存在中文字符或空格
- 图片文件和 txt 文件是否数量一致
- 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/
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)