cv 方向的 task 2 教程超级详细,在此对其做一个梳理
教程:Datawhale
Task 2
1 . 物体检测算法
物体检测算法主要分为 One-Stage(一阶段)和 Two-Stage(两阶段)模型,它们在检测原理、特点、优势和适用场景等方面存在显著差异。
1 . 1 One-Stage 模型
代表算法:YOLO(You Only Look Once)和 SSD(Single Shot Detection)
检测原理:直接在单次网络评估中预测图像中所有物体的类别和位置信息。它将物体检测视为一个单一的回归问题,从输入图像直接预测边界框坐标和类别概率,无需中间的区域提议步骤。
特点:
1)速度快:由于只进行一次网络评估,能够快速地对图像进行处理,非常适合实时应用场景。例如在视频监控系统中,需要对每一帧图像进行快速检测,以便及时发现异常情况。
2)结构相对简单:相比于 Two-Stage 模型,One-Stage 模型的网络结构通常较为简洁,易于理解和实现。这使得它在资源有限的环境下或者对开发效率有较高要求的情况下具有优势。
优势:
1)实时性强:在对检测速度要求极高的场景中,如自动驾驶、实时视频分析等,One-Stage 模型能够快速地给出检测结果,为后续的决策提供及时的信息。
2)易于部署:由于其结构相对简单,对计算资源的需求相对较低,因此更容易部署在各种设备上,包括嵌入式设备和移动设备。
不足:
1)精度相对较低:与 Two-Stage 模型相比,One-Stage 模型在检测精度上可能稍逊一筹。这是因为它在单次网络评估中同时进行类别和位置的预测,可能会忽略一些细节信息,导致检测结果不够准确。
2)对小目标检测效果不佳:由于网络结构的限制,One-Stage 模型在检测小目标时可能会遇到困难。小目标在图像中所占比例较小,特征不明显,难以被准确检测。
适用场景:对速度要求高而对精度要求相对较低的场景,如实时视频监控、智能交通系统等。在这些场景中,快速检测出物体的大致位置和类别已经能够满足基本需求,而对检测精度的要求可以适当放宽。
1 . 2 Two-Stage 模型
代表算法:Faster R-CNN
检测原理:首先使用区域提议网络(Region Proposal Network, RPN)生成候选区域,这些候选区域可能包含感兴趣的物体。然后,对这些候选区域进行分类和边界框的精细调整。
特点:
1)精度高:通过两个阶段的处理,能够更加准确地确定物体的类别和位置。在第一阶段生成的候选区域为第二阶段的精细调整提供了良好的基础,使得模型能够更加专注于物体的分类和定位,从而提高检测精度。
2)复杂的网络结构:Two-Stage 模型通常具有较为复杂的网络结构,包含多个子网络和模块。这使得它能够处理更加复杂的图像特征,提高检测的准确性,但也增加了计算量和模型的复杂度。
优势:
1)检测准确性高:在对检测精度要求非常高的场景中,如医学图像分析、卫星图像识别等,Two-Stage 模型能够提供更加准确的检测结果。
2)对小目标检测效果较好:由于在第一阶段可以生成大量的候选区域,因此对于小目标的检测有一定的优势。通过对候选区域的精细调整,可以更好地捕捉小目标的特征,提高检测的准确性。
不足:
1)速度相对较慢:由于分为两个阶段进行处理,计算量较大,导致检测速度相对较慢。在实时性要求较高的场景中,可能无法满足需求。
2)模型复杂:复杂的网络结构使得模型的训练和调参难度较大,需要更多的计算资源和时间。同时,模型的部署也相对较为困难,对硬件设备的要求较高。
适用场景:对精度要求高而对速度要求相对较低的场景,如科研领域、专业图像分析等。在这些场景中,准确地检测出物体的类别和位置是至关重要的,而对检测速度的要求可以适当放宽。
教程中只提到这三种典型的代表算法,但其实现在的物体检测及分类方法有很多。在下面对其略作一些扩展:
(一)基于传统机器学习的方法
1 . 特征提取与分类器结合
step 1 : 通过手工设计的特征提取方法,如 SIFT(Scale-Invariant Feature Transform,尺度不变特征变换)、HOG(Histogram of Oriented Gradients,方向梯度直方图)等,从图像中提取特征。
step 2: 使用传统的机器学习分类器,如支持向量机(SVM)、随机森林等,对提取的特征进行分类,判断图像中是否存在特定物体以及物体的类别。
特点:需要专业知识设计特征,计算量相对较小,但对于复杂场景和多样化的物体可能表现不佳。
2 . 滑动窗口法
step 1 : 在图像上以不同的大小和位置滑动一个固定大小的窗口,对每个窗口内的图像区域提取特征并进行分类。
step 2 : 通过遍历整个图像,检测出可能存在物体的区域。
特点:简单直观,但计算量大,效率低,且容易产生大量的冗余检测。
(二)基于深度学习的其他方法
1 . RCNN 系列的变体(除了 Faster R-CNN)
1 )Fast R-CNN:在 R-CNN 的基础上进行了改进,提高了检测速度。它首先对整个图像进行卷积操作提取特征图,然后对于每个候选区域,从特征图中提取相应的特征进行分类和边界框回归。
2 )Mask R-CNN:在 Faster R-CNN 的基础上增加了一个分支用于预测物体的掩码(mask),实现了实例分割和物体检测的统一框架。它不仅可以检测物体的类别和位置,还可以精确地分割出物体的轮廓。
2 . Anchor-Free 方法
不依赖预先定义的锚框(anchor boxes),而是直接预测物体的中心点和边界。例如 FCOS(Fully Convolutional One-Stage Object Detection),它通过预测物体中心点到边界的距离来确定物体的位置,避免了锚框带来的复杂计算和超参数设置问题。
特点:简化了检测过程,减少了计算量和内存占用,同时在一些情况下可以提高检测精度。
3 . Transformer 在物体检测中的应用:
举个例子来说, DETR(Detection Transformer),将 Transformer 架构引入物体检测领域。它使用编码器 - 解码器结构,直接预测物体的类别和边界框,无需传统的锚框机制和非极大值抑制等后处理步骤。
特点:具有全局感受野,能够更好地捕捉图像中的上下文信息,对于复杂场景和遮挡情况有较好的鲁棒性。
关于Transformer推荐文章:
【详细解读DETR,基于transformer的目标检测网络】DETR: End-to-End Object Detection with Transformers-CSDN博客
【Transformer】基于Transformer的目标检测算法综述_transformer目标检测综述-CSDN博客
我在此只是按照我的了解写了一些,在此推荐几篇文章供大家更全面的学习 :
目标检测的各种算法总结_目标检测算法-CSDN博客 (2019年的文章,但写的很全面)
1 . 3 赛题分析——YOLO
在此重温一下上个 task 中我们对赛题的分析
教程教会我们:
一般情况下,拿到一个赛题之后,我们需要明确:
1)这是一个什么场景下的赛题;
2)这个赛题要解决什么问题。
1) 视频物体检测问题
2) 本赛题最终目标是开发一套智能识别系统,能够自动检测和分类城市管理中的违规行为。该系统应利用先进的图像处理和计算机视觉技术,通过对摄像头捕获的视频进行分析,自动准确识别违规行为,并及时向管理部门发出告警,以实现更高效的城市管理。
结合本次教程对赛题的进一步剖析可知:
赛题的本质是选择合适的目标检测模型进行训练,然后用训练后的模型对城市内违规行为进行检测。
在实际应用场景中,需要模型对行为进行快速分析。考虑到这一需求,我们抛弃了二阶段目标检测模型,如 Faster R-CNN、R-CNN 等。原因在于二阶段模型虽然精度较高,但速度相对较慢。相比之下,一阶段目标检测模型,如 YOLO、SSD 等,在速度上更具优势。然而,我们不能仅仅追求速度而忽略精度以及易于实践的实际需求。
经过综合考量,最终我们在众多一阶段目标检测模型中选择了 YOLO 模型。这是因为 YOLO 模型在保持相对高准确度的同时,能够实现高帧率的实时检测,并且其架构相对简单,易于理解和实现。此外,YOLO 自发布以来,经历了多个版本的迭代,每个版本都在性能和效率上有所提升。同时,YOLO 拥有一个活跃的开发者社区,提供了大量的教程、工具和预训练模型,这使得小白也可以快速上手并应用 YOLO。
简单来说:
1)选择 YOLO 模型的原因:速度快、易于实现、版本迭代、社区支持、灵活性。
2)赛题目标是开发智能识别系统检测城市管理中的违规行为,由于实际应用需要快速分析,所以选择一阶段目标检测模型,最终在众多模型中选择了 YOLO。
更多关于YOLO的内容教程中都有具体介绍,在此不做过多赘述。关于YOLO的有关扩展文章上次笔记已经有详细介绍了,在此重新列举一下:
YOLO系列算法精讲:从yolov1至yolov8的进阶之路(2万字超全整理)-CSDN博客
【YOLO系列】YOLOv5超详细解读(源码详解+入门实践+改进)-CSDN博客
目标检测---教你利用yolov5训练自己的目标检测模型_目标检测 教你利用-CSDN博客
YOLO系列详解:YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5、YOLOv6、YOLOv7_算法_AI小白一枚-GitCode 开源社区
2 . 物体检测关键概念和步骤
输入:通常是图像或视频帧。
特征提取:利用深度学习模型(如卷积神经网络 CNN)提取图像特征,为后续物体识别和定位提供基础。
候选区域生成:部分检测算法先生成可能包含物体的候选区域。
区域分类和边界框回归:判断候选区域是否包含特定物体并预测边界框。
非极大值抑制(NMS):去除重叠的边界框,选择最佳的边界框。
3 . YOLO
3 . 1 YOLO算法特点
核心思想:将目标检测视为回归问题,从图像像素直接映射到边界框坐标和类别概率。
显著特点:在单个网络评估中同时预测多个边界框和类别概率。
网络结构:使用卷积神经网络(CNN)提取图像特征,通常包括多个卷积层和池化层。
置信度计算:置信度反映边界框包含目标的概率以及预测的类别,计算公式为 Pr (Object) * IOU (pred, truth)。
3 . 2 YOLO 数据集格式
YOLO 算法使用.txt 文件来存储图像中物体的标注信息,这种格式具有简洁、高效的特点,便于在训练和测试过程中快速读取和处理。
标注信息内容
1)每行代表一个物体的标注,包含了该物体的关键信息,能够准确地描述物体在图像中的位置和类别。
2)具体包括类别索引和边界框坐标,通过这些信息可以确定物体所属的类别以及在图像中的具体位置。
坐标格式详解
采用 [class_index x_center y_center width height] 的格式记录边界框信息。
类别索引(class_index):用一个整数表示物体所属的类别,这个索引对应于预先定义的类别列表。
如果有 “汽车”“行人”“自行车” 三个类别,分别用 0、1、2 表示,那么当一个物体被标注为 “汽车” 时,其类别索引就是 0。
中心点坐标(x_center, y_center):表示边界框中心点在图像中的位置,取值范围在 0 到 1 之间,是归一化到图像宽度和高度的比例值。
如果图像宽度为 1000 像素,一个物体的边界框中心点在水平方向上位于图像的 500 像素处,那么 x_center 的值为 0.5。同理,如果图像高度为 800 像素,一个物体的边界框中心点在垂直方向上位于图像的 400 像素处,那么 y_center 的值为 0.5。
宽度和高度(width, height):同样是归一化到图像宽度和高度的比例值,范围在 0 到 1 之间。表示边界框的宽度和高度占整个图像宽度和高度的比例。
如果一个物体的边界框宽度为 200 像素,图像宽度为 1000 像素,那么 width 的值为 0.2;如果边界框高度为 150 像素,图像高度为 800 像素,那么 height 的值为 0.1875。
举个简单的例子来说:
假设一个图像中有一辆汽车,其类别索引为 0,图像宽度为 800 像素,高度为 600 像素。汽车边界框的中心点坐标为 (400, 300),宽度为 150 像素,高度为 100 像素。那么在标注文件中,这辆汽车的标注信息为 [0 0.5 0.5 0.1875 0.1667]。
标注信息 | 含义 | 示例值 |
---|---|---|
class_index | 物体类别索引 | 0 |
x_center | 边界框中心点横坐标比例值 | 0.5 |
y_center | 边界框中心点纵坐标比例值 | 0.5 |
width | 边界框宽度比例值 | 0.1875 |
height | 边界框高度比例值 | 0.1667 |
关于3 . 2 内容教程对此部分基础配置解释十分详细,推荐观看,在此只举例辅助理解。
3 . 3 YOLO 训练日志
在使用 YOLO 进行训练时,生成的 exp/detect/train 文件夹是训练过程中的关键组成部分,它包含了丰富的信息,可以帮助我们评估模型性能和泛化能力。
在此对教程详细的阐述重新组织一下语言:
文件夹内容概述:
模型权重文件:通常以.pt 或.pth 为后缀,记录了训练过程中模型的参数。这些权重文件可以用于后续的测试或继续训练,是模型的核心部分。
日志文件:一般为.log 文件,包含了训练过程中的所有输出信息,如损失值、精度、速度等。通过分析日志文件,我们可以了解模型在训练过程中的表现,以及是否存在异常情况。
配置文件:可能是.yaml 或.cfg 文件,记录了训练时使用的配置信息,包括数据路径、类别名、模型架构等设置。配置文件使得我们可以方便地重复训练过程,或者在不同的环境中进行相同的训练。
图表和可视化:
1)F1_curve.png、PR_curve.png、P_curve.png、R_curve.png 分别包含了模型性能的不同评估指标曲线图,如 F1 分数、精确率 - 召回率曲线、精确率和召回率曲线。这些曲线图可以直观地展示模型在不同指标上的表现,帮助我们分析模型的优缺点。
2)results.csv 是一个 CSV 文件,包含了模型训练或测试的结果数据。可以通过数据分析工具对这些数据进行进一步的处理和分析,以深入了解模型的性能。
3)results.png 包含了训练结果的汇总图表或图像,提供了一个快速了解训练效果的方式。
4)train_batch*.jpg 包含了训练过程中不同批次的图像和它们的标注,有助于我们观察模型在训练过程中的学习情况。
5)val_batch0_labels.jpg 和 val_batch0_pred.jpg 分别是验证集批次的图像,可能包含真实标签和模型预测的可视化,方便我们对比真实值和预测值,评估模型的准确性。
测试结果:如果训练过程中包括了测试阶段,可能会有测试结果的保存,如检测结果的图片或统计数据。这些结果可以帮助我们了解模型在未见过的数据上的表现,评估模型的泛化能力。
缩写 | 作用描述 |
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 | 模型在验证集上的难易样本平衡损失。 |
上表为教程内容,在此为了使知识更体系对其做引用
评估模型性能和泛化能力的方法:
1)查看损失曲线:通过观察日志文件中的损失值变化,或者查看损失曲线图(如 train_loss.png),可以了解模型在训练过程中的收敛情况。如果损失值逐渐下降并趋于稳定,说明模型在不断学习和优化;如果损失值波动较大或无法下降,可能意味着模型存在过拟合、欠拟合或其他问题。
2)分析精确率和召回率曲线:精确率 - 召回率曲线(PR_curve.png)展示了模型在不同阈值下的精确率和召回率变化情况。通过调整阈值,可以在精确率和召回率之间进行权衡,以满足不同应用场景的需求。例如,在一些对准确性要求较高的场景中,可以选择较高的精确率;而在一些需要尽可能多地检测出目标的场景中,可以选择较高的召回率。
3)观察 F1 分数曲线:F1 分数是精确率和召回率的调和平均数,它综合考虑了模型的准确性和全面性。F1_curve.png 可以帮助我们了解模型在不同阶段的 F1 分数变化情况,F1 分数越高,说明模型的性能越好。
4)对比验证集和测试集结果:通过查看验证集和测试集上的损失值、精确率、召回率等指标,可以评估模型的泛化能力。如果模型在验证集和测试集上的表现相近,说明模型具有较好的泛化能力;如果模型在测试集上的表现明显下降,可能意味着模型存在过拟合问题,需要进行进一步的调整和优化。
5)可视化结果:查看 train_batch*.jpg、val_batch0_labels.jpg 和 val_batch0_pred.jpg 等图像,可以直观地观察模型在训练和验证过程中的预测结果与真实标签的差异。通过对比可视化结果,我们可以发现模型的错误预测情况,从而有针对性地进行改进。
4 . Baseline 优化
首先明确一下之前的Baseline为什么分这么低,从上次 task 1代码分析我们就可以看出来
1 . baseline只用了所有数据中的5个视频作为训练数据集
2 . bs中训练轮数只有2轮
3 . 所用到的预训练模型也是最小的
介于此,我们改进的方向也很明确啦:
1 . 增加训练数据集及训练轮数。
2 . 切换不同的模型预训练权重,通过修改下载预训练模型部分和代码中加载模型部分实现。
实战推荐:目标检测---教你利用yolov5训练自己的目标检测模型_目标检测 教你利用-CSDN博客
yolov5 预训练权重下载网址:Releases · ultralytics/yolov5 · GitHub