目录
我们在上一篇博客中,目前已经完成了:
-
在 Colab 安装
ultralytics
(YOLOv8)库 -
从 Google Drive 解压 VisDrone 数据集
-
创建了 YOLO 格式的 images 和 labels 目录结构
-
完成了训练集和验证集标签的转换(VisDrone → YOLO)
-
验证了标签质量
-
准备了
dataset.yaml
(data 配置文件) -
用 YOLOv8n 加载过模型并验证过数据结构
接下来我们:正式训练 YOLOv8!
第一步:确认你的 dataset.yaml
放在 /content/data/VisDrone-YOLO/dataset.yaml
,内容如下:
这里的内容我根据最后训练集的标注效果修改过,以这个为准。
path: /content/data/VisDrone-YOLO
train: images/train
val: images/valnames:
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_loss
、cls_loss
和dfl_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
降得慢,可能是模型先学会认物体但还不会精确定位;反过来则说明框画得准但认不清种类。保持观察趋势,比单轮数值更重要。
第十轮:
训练损失的变化
-
定位能力(box_loss)
从第1轮的1.844降到第10轮的1.606,降了13%。说明模型逐渐理解“目标在哪”,但进步速度偏慢,尤其第3轮还反弹到1.78。就像学画画,轮廓能描了但细节还粗糙,复杂场景(如重叠物体)定位容易出错。 -
分类能力(cls_loss)
从2.498狠狠的跌到1.309,降幅47.6%。这是最明显的进步,相当于模型快速记住了“目标是什么”。比如从分不清猫狗,到现在能认出多数常见物体。 -
边缘精准度(dfl_loss)
从1.081降到0.976,只优化了9.7%。这部分管小目标边缘定位(比如远处车牌),说明模型对细微位置还不敏感,可能是小目标数据不足或特征提取不够精细。
关键:损失整体在降,但波动(如第3轮定位退步)暗示数据分布不均或学习率偏高。如果后续20轮仍波动,需调低学习率或检查数据标注质量。
验证集表现
-
漏检问题(Recall召回率)
从0.133升到0.221,涨了66%,但绝对值依然很低——当前只能找出22%的目标。好比安检机漏掉大量违禁品,尤其小目标(蚂蚁大小物体)、遮挡物(树后的人)最易漏。 -
误检问题(Precision精确率)
从0.448降到0.322,说明模型为减少漏检开始“宁可错杀”:框出更多目标但错误率上升。比如把树枝当成人手,第6轮精确率冲到0.423后回落,可能是某批数据干扰。 -
综合精度(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轻量化结构)。
第三十轮:
训练损失的变化
-
定位能力(box_loss)
从最早的1.844降到第32轮的1.471,降了20%左右。但特别注意的是,从第15轮开始就卡在1.5左右不动了(1.548→1.471)。这说明模型对“目标在哪”这个基本问题学会了七八成,但复杂场景(比如多个目标挤在一起)的定位能力就上不去了。 -
分类能力(cls_loss)
最亮眼的进步,从2.498降到1.109,跌了56%。模型算是把“目标是什么”学明白了,现在认错对象的概率小多了。不过最后几轮(1.116→1.109)也明显放缓,基本到瓶颈了。 -
边缘检测(dfl_loss)
从1.081降到0.939,只进步了13%。还是老问题——小目标的边缘定位困难。比如要框一个远处的车牌,模型还是容易框歪一点。
验证集表现
-
漏检情况(Recall召回率)
从0.133爬到0.27(翻了一倍),但最后卡在0.27上不去。相当于100个目标里还漏掉73个,特别是小目标和遮挡目标。这说明模型的“发现能力”还是弱项。 -
误检情况(Precision精确率)
在0.3~0.44之间摇摆(最终0.405),像坐过山车。第6轮最高到0.423,第5轮最低0.242。说明模型判断“是不是目标”的能力不稳定,阴天容易把树影当成人。 -
综合能力(mAP)
- mAP50:从0.091→0.253(涨了178%),总算有点实用价值了,但0.25的分数相当于100个目标里只能准确保住25个。
- mAP50-95:0.0477→0.144,进步最大但绝对值最低。说明模型在“框必须精准”的任务里表现最弱,比如自动驾驶要框准车道线就吃力。
后续训练建议
- 资源准备:如果再用Colab,建议挑非高峰时段(避开美国白天),或者用Kaggle的免费GPU(每周限30小时但更稳)。
- 接续训练技巧:
- 接着第32轮训练时,降低学习率(比如减半),帮助模型微调。
- 增加随机裁剪和色调扰动,相当于给模型出更难但更全面的考题。
- 止损策略:如果续训10轮后mAP50还在0.25徘徊,果断停训换模型(比如YOLOv8n)。
感谢
如果您觉得这篇文章对您有所帮助
欢迎点赞、转发、收藏,这将对我有非常大的帮助
感谢您的阅读,我们下篇文章再见~ 👋