YOLOv8 × VisDrone 全流程实战:训练你的无人机识别模型 AI(第二部分:模型训练)

目录

我们在上一篇博客中,目前已经完成了:

接下来我们:正式训练 YOLOv8!

第一步:确认你的 dataset.yaml

第二步:开始训练 YOLOv8 模型

第一轮训练日志简要:

✅ 验证集指标:

📊 怎么看这组指标:

第三步:查看训练结果(可视化)

第四步:推理测试图片

第五步:将模型保存到 Google Drive(可选)

训练指标讲解

第一轮:

训练监控指标:模型学习的"成绩单"

验证集指标:模拟考试的"实战分数"

整体状态:首轮训练的"成长空间"

第十轮:

训练损失的变化​

验证集表现​

资源与效率​​

总结​​

第三十轮:

训练损失的变化​

验证集表现​

​​后续训练建议​​

感谢


我们在上一篇博客中,目前已经完成了:

  1. 在 Colab 安装 ultralytics(YOLOv8)库

  2. 从 Google Drive 解压 VisDrone 数据集

  3. 创建了 YOLO 格式的 images 和 labels 目录结构

  4. 完成了训练集和验证集标签的转换(VisDrone → YOLO)

  5. 验证了标签质量

  6. 准备了 dataset.yaml(data 配置文件)

  7. 用 YOLOv8n 加载过模型并验证过数据结构


接下来我们:正式训练 YOLOv8!

第一步:确认你的 dataset.yaml

放在 /content/data/VisDrone-YOLO/dataset.yaml,内容如下:

这里的内容我根据最后训练集的标注效果修改过,以这个为准。


path: /content/data/VisDrone-YOLO
train: images/train
val: images/val

names:
  0: pedestrian
  1: people
  2: tricycle-people
  3: bicycle
  4: car
  5: van
  6: truck
  7: tricycle
  8: awning-tricycle
  9: bus
  10: motor
  11: large-vehicle

如果你不确定,可以使用以下代码重新生成:

 
yaml_content = """
path: /content/data/VisDrone-YOLO
train: images/train
val: images/val

nc: 12
names: [这里记得修改一下啊'pedestrian', 'people', 'bicycle', 'car', 'van', 'truck', 'tricycle', 'awning-tricycle', 'bus', 'motor', 'others', 'ignore']
"""

with open('/content/data/VisDrone-YOLO/dataset.yaml', 'w') as f:
    f.write(yaml_content.strip())


第二步:开始训练 YOLOv8 模型

这里先训练一百轮试试水,但是大概率一百轮是不够的。

from ultralytics import YOLO

model = YOLO('yolov8n.pt')  # 你也可以用 yolov8s.pt, yolov8m.pt 等

# 开始训练
model.train(
    data='/content/data/VisDrone-YOLO/dataset.yaml',
    epochs=100,
    imgsz=640,
    batch=16,
    name='yolov8_visdrone',
    workers=2
)

 详细的训练过程指标解释在文章下方

第一轮训练日志简要:

Epoch: 1/100
GPU 显存使用:7.69G
box_loss:   1.844
cls_loss:   2.498
dfl_loss:   1.081
Instances:  646
Image size: 640

这是训练集的指标,还好,目前只是第一轮,loss 比较大是正常的。


✅ 验证集指标:

验证图像数: 548
总标注目标数: 40169
Box(P): 0.448   → 预测框的精度(Precision)
R     : 0.133   → 召回率(Recall)
mAP50 : 0.091   → mAP @ IoU=0.5(粗粒度准确率)
mAP50-95: 0.0477 → mAP @ IoU=0.5~0.95(精细准确率)

📊 怎么看这组指标:

指标名称​符号表示​含义说明​​值​​优化方向​
​GPU显存占用​GPU_mem训练时显存使用量(反映硬件负载)7.69G需≤硬件上限
​边界框损失​box_loss预测框与真实框的位置偏差(IoU/GIoU损失)1.844↓ 越低越好
​分类损失​cls_loss类别预测错误程度(交叉熵损失)2.498↓ 越低越好
​分布焦点损失​dfl_loss边界框分布预测的焦点损失(提升小目标检测)1.081↓ 越低越好
​处理目标数​Instances当前批次检测到的目标实例数量646与数据匹配
​输入分辨率​Size图像统一缩放尺寸(影响细节捕捉能力)640×640根据任务调整

​指标​​含义​​当前值​​理想趋势​
​Images​验证集图像数量548-
​Instances​验证集标注的目标总数40,169-
​Precision(P)​正确检出目标中真实目标的比例(精确率)0.448↑(越高越好)
​Recall(R)​真实目标中被正确检出的比例(召回率)0.133↑(越高越好)
​mAP50​IoU阈值=0.5时的平均精度(各类别AP均值)0.091↑(目标:接近1)
​mAP50-95​IoU阈值从0.5到0.95(步长0.05)的平均mAP,更严格的位置要求0.0477↑(目标:接近1)

第三步:查看训练结果(可视化)

from IPython.display import Image
Image(filename='/content/runs/detect/yolov8_visdrone/results.png')


第四步:推理测试图片

# 加载最好的模型
model = YOLO('/content/runs/detect/yolov8_visdrone/weights/best.pt')

# 对验证集图像进行推理
results = model.predict(
    source='/content/data/VisDrone-YOLO/images/val',
    imgsz=640,
    conf=0.25,
    save=True
)

默认预测图保存在 /content/runs/detect/predict/ 目录。

查看预测结果:

import os
from IPython.display import Image, display

pred_dir = '/content/runs/detect/predict'
for file in os.listdir(pred_dir)[:5]:  # 展示前5张预测结果
    display(Image(filename=os.path.join(pred_dir, file)))


第五步:将模型保存到 Google Drive(可选)

!cp /content/runs/detect/yolov8_visdrone/weights/best.pt /content/drive/MyDrive/yolov8_visdrone_best.pt


训练指标讲解

第一轮:

训练监控指标:模型学习的"成绩单"

        训练时你看到的box_losscls_lossdfl_loss,其实是模型在解题过程中犯错的扣分记录。box_loss(边界框损失)专门盯着模型画框准不准——比如它把一只猫的框画大了半截身子,这个误差就会被记下来。首轮训练中1.844的值说明模型刚开始还不太会定位目标,就像新手司机停车总歪一样正常。

        接着是cls_loss(分类损失),它管的是模型认不认识框里的东西。比如框里明明是狗,模型却说是猫,这个错误就会被记上一笔。你首轮2.498的值,相当于考试时连错好几道基础题,说明模型还没记住各类特征。最后dfl_loss(分布焦点损失)比较特别,它像显微镜一样检查框的位置细节,尤其是小目标的边缘是否对齐。1.081的初始值说明模型对小物体还比较模糊。

验证集指标:模拟考试的"实战分数"

        等模型学完一轮,就要用没见过的验证集考考它。这时候的Precision(精确率0.448)相当于"答对的题里有多少真蒙对了",为什么这里说是蒙对了呢,因为他真是蒙的,第一轮训练下来其他指标那么辣鸡,这里怎么可能有0.4。比如模型说10个是苹果,结果只有4个真是苹果,其他是梨——这说明它有点瞎猜,容易把橘子当苹果。

        而Recall(召回率0.133)则像"该答对的题漏了多少"。比如图里有100只鸟,模型只找到13只,剩下87只完全没看见——这漏检得有点多,可能是目标太小或重叠了。至于mAP50(0.091)和mAP50-95(0.0477)这两个分数,前者是"允许框歪一点"的宽容分,后者是"框必须很准"的严格分。首轮都偏低很正常,就像第一次模拟考不及格,但后续会提升。

整体状态:首轮训练的"成长空间"

        现在这些指标组合起来看:损失值整体偏高但开始下降,验证分数偏低但没异常波动,说明模型正在吸收知识,还没遇到瓶颈。就像新手打游戏,第一关操作生疏但没卡关。特别要注意Recall(0.133)和mAP50-95(0.0477)这两个短板,暗示模型容易漏检小目标或定位粗糙,后续可以针对性加强训练。

        如果接下来几轮cls_loss降得快而box_loss降得慢,可能是模型先学会认物体但还不会精确定位;反过来则说明框画得准但认不清种类。保持观察趋势,比单轮数值更重要。


第十轮:

训练损失的变化

  1. 定位能力(box_loss)​
    从第1轮的1.844降到第10轮的1.606,降了13%。说明模型逐渐理解“目标在哪”,但进步速度偏慢,尤其第3轮还反弹到1.78。就像学画画,轮廓能描了但细节还粗糙,复杂场景(如重叠物体)定位容易出错。

  2. ​分类能力(cls_loss)​
    从2.498狠狠的跌到1.309,降幅47.6%。这是最明显的进步,相当于模型快速记住了“目标是什么”。比如从分不清猫狗,到现在能认出多数常见物体。

  3. ​边缘精准度(dfl_loss)​
    从1.081降到0.976,只优化了9.7%。这部分管小目标边缘定位(比如远处车牌),说明模型对细微位置还不敏感,可能是小目标数据不足或特征提取不够精细。

​关键​​:损失整体在降,但波动(如第3轮定位退步)暗示​​数据分布不均​​或​​学习率偏高​​。如果后续20轮仍波动,需调低学习率或检查数据标注质量。


验证集表现

  1. ​漏检问题(Recall召回率)​
    从0.133升到0.221,涨了66%,但绝对值依然很低——当前只能找出22%的目标。好比安检机漏掉大量违禁品,尤其小目标(蚂蚁大小物体)、遮挡物(树后的人)最易漏。

  2. ​误检问题(Precision精确率)​
    从0.448降到0.322,说明模型为减少漏检开始“宁可错杀”:框出更多目标但错误率上升。比如把树枝当成人手,第6轮精确率冲到0.423后回落,可能是某批数据干扰。

  3. ​综合精度(mAP)​

    • ​mAP50​​(框不准也容忍):从0.091→0.207(翻倍),说明基础检测框架搭起来了。
    • ​mAP50-95​​(框必须准):从0.0477→0.116,进步大但数值低,反映​​框位置粗糙​​。好比能圈出狗但框住了半条腿。

矛盾​​:模型在​​“多预测”和“少犯错”​​间挣扎——想减少漏检就不得不接受更多误检。


资源与效率​

  • ​显存占用​​:7.69G~11.7G波动,无异常,说明当前batch_size和分辨率设置合理。
  • ​耗时​​:每轮训练约2.5分钟,验证8秒,效率合格。

总结​

        模型正处于​​快速学习初期​​(分类进步快,检测框架初成),但​​基础不牢​​(漏检严重,框不准)。好比驾校学员:能上路但倒库总压线。​​继续训练到30轮​​再看看,重点观察召回率能否破0.3、mAP50-95能否突破0.15。届时若瓶颈仍在,再针对性换策略(如更换YOLO轻量化结构)。


第三十轮:

训练损失的变化

  1. ​定位能力(box_loss)​
    从最早的1.844降到第32轮的1.471,降了20%左右。但特别注意的是,从第15轮开始就卡在1.5左右不动了(1.548→1.471)。这说明模型对“目标在哪”这个基本问题学会了七八成,但复杂场景(比如多个目标挤在一起)的定位能力就上不去了。

  2. ​分类能力(cls_loss)​
    最亮眼的进步,从2.498降到1.109,跌了56%。模型算是把“目标是什么”学明白了,现在认错对象的概率小多了。不过最后几轮(1.116→1.109)也明显放缓,基本到瓶颈了。

  3. ​边缘检测(dfl_loss)​
    从1.081降到0.939,只进步了13%。还是老问题——小目标的边缘定位困难。比如要框一个远处的车牌,模型还是容易框歪一点。


验证集表现

  1. ​漏检情况(Recall召回率)​
    从0.133爬到0.27(翻了一倍),但最后卡在0.27上不去。相当于100个目标里还漏掉73个,特别是小目标和遮挡目标。这说明模型的“发现能力”还是弱项。

  2. ​误检情况(Precision精确率)​
    在0.3~0.44之间摇摆(最终0.405),像坐过山车。第6轮最高到0.423,第5轮最低0.242。说明模型判断“是不是目标”的能力不稳定,阴天容易把树影当成人。

  3. ​综合能力(mAP)​

    • ​mAP50​​:从0.091→0.253(涨了178%),总算有点实用价值了,但0.25的分数相当于100个目标里只能准确保住25个。
    • ​mAP50-95​​:0.0477→0.144,进步最大但绝对值最低。说明模型在“框必须精准”的任务里表现最弱,比如自动驾驶要框准车道线就吃力。

​后续训练建议​

  1. ​资源准备​​:如果再用Colab,建议挑​​非高峰时段​​(避开美国白天),或者用Kaggle的免费GPU(每周限30小时但更稳)。
  2. ​接续训练技巧​​:
    • 接着第32轮训练时,​​降低学习率​​(比如减半),帮助模型微调。
    • 增加​​随机裁剪​​和​​色调扰动​​,相当于给模型出更难但更全面的考题。
  3. ​止损策略​​:如果续训10轮后mAP50还在0.25徘徊,果断停训换模型(比如YOLOv8n)。

感谢

如果您觉得这篇文章对您有所帮助

欢迎点赞、转发、收藏,这将对我有非常大的帮助

感谢您的阅读,我们下篇文章再见~ 👋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WenJGo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值