文章目录
- 前言
- 一、YOLO是什么?
- 二、YOLO的历史
- 三、性能指标
- 四、 性能指标计算公式
- 五、性能优化
- 总结
前言
本文的Task2是对Task1的baseline代码进行优化的过程。
一、YOLO是什么?
首先简单介绍一下YOLO模型:
物体检测算法主要分为两类:One-Stage(一阶段)和Two-Stage(两阶段)模型。
- One-Stage模型,如YOLO(You Only Look Once)和SSD(Single Shot Detection),直接在单次网络评估中预测图像中所有物体的类别和位置信息。这种方法的优点是速度快,适合实时应用,但可能在精度上不如Two-Stage模型。
- Two-Stage模型,如Faster R-CNN,首先使用区域提议网络(Region Proposal Network, RPN)生成候选区域,然后对这些区域进行分类和边界框的精细调整。这种方法的优点是精度高,但速度相对较慢 。
其中YOLO就是一种经典常用的One-Stage模型。
YOLO,全称为"You Only Look Once",是一种流行的实时目标检测算法,由Joseph Redmon等人于2015年首次提出。YOLO的核心思想是将目标检测任务视为一个单一的回归问题,直接从图像像素到边界框坐标和类别概率的映射。这种设计使得YOLO能够以非常快的速度进行目标检测,同时保持较高的精度,特别适合需要实时处理的应用场景。
二、YOLO的历史
YOLO(You Only Look Once)是一种革命性的目标检测算法,以其快速和高效的性能而闻名。自2015年YOLOv1的首次推出以来,YOLO系列已经经历了多次迭代,每一次迭代都在速度、准确性和计算效率方面做出了显著的贡献。
版本号 | 年份 | 主要贡献与特点 |
---|---|---|
YOLOv1 | 2015 | 实时端到端物体检测,将检测视为回归问题,单次网络评估预测位置和类别。 |
YOLOv2 | 2016 | 引入批量归一化,高分辨率分类器,全卷积网络,能检测超过9000个类别。 |
YOLOv3 | 2018 | 使用更深的Darknet-53网络,引入特征金字塔网络提高多尺度目标检测能力。 |
YOLOv4 | 2020 | 结合CSPNet、PANet、SAM等技术,提高特征提取和检测效率。 |
YOLOv5 | 2020 | 使用Pytorch框架,不同大小模型版本适应不同环境,易用性和性能显著改进。 |
YOLOv6 | 2021 | 多种不同尺寸模型适应工业应用,继续在YOLO系列基础上改进。 |
YOLOv7 | 2022 | 架构变化和一系列免费包提高准确率,保持实时性。 |
YOLOv8 | 2023 | 新功能和改进,包括新的骨干网络、Anchor-Free检测头和新损失函数,提升性能和灵活性。 |
YOLOv9 | 2023 | 引入可编程梯度信息(PGI)和基于梯度路径规划的通用高效层聚合网络(GELAN)架构。 |
YOLOv10 | 2024 | 通过消除非最大抑制(NMS-Free)和优化各种模型组件,实现了最先进的性能。 |
三、性能指标
YOLO代码在训练和验证的时候会自动计算出loss值以及mAP等性能指标,如下表所示。
缩写 | 作用描述 |
---|---|
epoch | 表示模型在整个训练数据集上进行了一次前向和后向传播的完整周期。 |
train/box_loss | 衡量模型预测的边界框与真实边界框之间差异的损失值。 |
train/cls_loss | 衡量模型预测的类别与真实类别之间差异的损失值。 |
train/dfl_loss | 衡量模型对难分类样本的关注程度,减少易分类样本的影响。 |
metrics/precision(B) | 在训练过程中,预测为正类别中实际为正类别的比例。 |
metrics/recall(B) | 在训练过程中,所有实际正类别中被模型正确预测为正类别的比例。 |
metrics/mAP50(B) | 在50%的IoU阈值下计算,衡量模型的整体性能。 |
metrics/mAP50-95(B) | 在0.5到0.95的IoU阈值范围内计算,提供更全面的模型性能评估。 |
val/box_loss | 模型在未见过的验证集上的边界框损失,用于监控模型的泛化能力。 |
val/cls_loss | 模型在验证集上的分类损失,用于监控模型的泛化能力。 |
val/dfl_loss | 模型在验证集上的难易样本平衡损失。 |
四、 性能指标计算公式
-
Precision (精确率)
精确率衡量的是模型预测为正类别中实际为正类别的比例。计算公式为:
Precision = True Positives (TP) True Positives (TP) + False Positives (FP) \text{Precision} = \frac{\text{True Positives (TP)}}{\text{True Positives (TP)} + \text{False Positives (FP)}} Precision=True Positives (TP)+False Positives (FP)True Positives (TP)
-
Recall (召回率)
召回率衡量的是所有实际正类别中被模型正确预测为正类别的比例。计算公式为:
Recall = True Positives (TP) True Positives (TP) + False Negatives (FN) \text{Recall} = \frac{\text{True Positives (TP)}}{\text{True Positives (TP)} + \text{False Negatives (FN)}} Recall=True Positives (TP)+False Negatives (FN)True Positives (TP)
-
mAP (Mean Average Precision)
平均精度 (AP) 是针对每个类别的精度-召回曲线下面积,mAP 是所有类别的平均值。对于 mAP@50 (IOU=0.5) 和 mAP@50:95 (IOU从0.5到0.95) 的计算公式为:
AP = ∫ 0 1 Precision ( r ) d r \text{AP} = \int_{0}^{1} \text{Precision}(r) \, dr AP=∫01Precision(r)dr
mAP = 1 N ∑ i = 1 N AP i \text{mAP} = \frac{1}{N} \sum_{i=1}^{N} \text{AP}_i mAP=N1i=1∑NAPi
其中,(N) 是类别的总数,(\text{AP}_i) 是第 (i) 类别的平均精度。
五、性能优化
最后就是最重要的优化baseline,我一开始看到代码的时候的想法就是换用更大的模型,然后跑几十个epoch(原来的是2个epoch),并且使用更多的数据作为训练集和验证集。
所以我选择了yolov8系列中最大的yolov8x。
!wget http://mirror.coggle.club/yolo/yolov8x-v8.2.0.pt -O yolov8x.pt
model = YOLO("yolov8x.pt")
results = model.train(data="/mnt/sdb1/yolo-dataset/yolo.yaml", epochs=2, imgsz=1080, batch=16, device="0,1,2,3,4,5,6,7")
然后为了训练大模型,我租用了8块4090显卡,但是训练的epoch为了节省时间仍然保持原来的2个不变,最后得到的Model summary如下:
Ultralytics YOLOv8.2.82 🚀 Python-3.10.13 torch-2.2.2+cu118 CUDA:0 (NVIDIA GeForce RTX 4090, 24217MiB)
CUDA:1 (NVIDIA GeForce RTX 4090, 24217MiB)
CUDA:2 (NVIDIA GeForce RTX 4090, 24217MiB)
CUDA:3 (NVIDIA GeForce RTX 4090, 24217MiB)
CUDA:4 (NVIDIA GeForce RTX 4090, 24217MiB)
CUDA:5 (NVIDIA GeForce RTX 4090, 24217MiB)
CUDA:6 (NVIDIA GeForce RTX 4090, 24217MiB)
CUDA:7 (NVIDIA GeForce RTX 4090, 24217MiB)
Model summary (fused): 268 layers, 68,127,420 parameters, 0 gradients, 257.4 GFLOPs
然后是训练的各类违章行为识别统计:
all 2595 19658 0.566 0.279 0.344 0.205
非机动车违停 2591 12666 0.992 0.607 0.754 0.438
机动车违停 2591 5737 0.792 0.314 0.434 0.352
垃圾桶满溢 791 791 0.48 0.196 0.189 0.0299
违法经营 232 464 0 0 0 0
以及训练输出的一些数据图表:
总结
最后的评分为0.1325094937099511。
可以看出虽然对于垃圾桶满溢和违法经营识别的不是很好,但是相比于之前的baseline(评分0.004)有了巨大的提升。