本文给大家带来的百面算法工程师是深度学习目标检测YOLOv6面试总结 ,文章内总结了常见的提问问题,旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中,我们还将介绍一些常见的深度学习目标检测面试问题,并提供参考的回答及其理论基础,以帮助求职者更好地准备面试。通过对这些问题的理解和回答,求职者可以展现出自己的深度学习目标检测领域的专业知识、 解决问题的能力以及对实际应用场景的理解。同时,这也是为了帮助求职者更好地应对深度学习目标检测岗位的面试挑战,提升面试的成功率和竞争力。
专栏地址:百面算法工程师------总结最新各种计算机视觉的相关算法面试问题****
YOLOv6论文地址 :点击即可跳转
YOLOv6 官方开源库地址: 官方代码仓库点击即可跳转
目录
[1. 数据增强模块](#1. 数据增强模块)
[2. 网络结构](#2. 网络结构)
[2.1 Backbone](#2.1 Backbone)
[2.2 Neck](#2.2 Neck)
[2.3 Head](#2.3 Head)
[3. 正负样本匹配策略](#3. 正负样本匹配策略)
[3.1 Anchor 设置](#3.1 Anchor 设置)
[3.2 Bbox 编解码过程](#3.2 Bbox 编解码过程)
[3.3 匹配策略](#3.3 匹配策略)
[4. Loss 设计](#4. Loss 设计)
[4.1 分类损失函数 VarifocalLoss](#4.1 分类损失函数 VarifocalLoss)
[4.2 回归损失函数 GIoU Loss / SIoU Los](#4.2 回归损失函数 GIoU Loss / SIoU Los)
文章中部分内容已在YOLOv5中讲过,此处不再赘述,感兴趣的同学可以阅读
百面算法工程师 | YOLOv5面试考点原理全解析_yolov5面试详解-CSDN博客
YOLOv6 提出了一系列适用于各种工业场景的模型,包括 N/T/S/M/L,考虑到模型的大小,其架构有所不同,以获得更好的精度-速度权衡。本算法专注于检测的精度和推理效率,并在网络结构、训练策略等算法层面进行了多项改进和优化。
简单来说 YOLOv6 开源库的主要特点为:
- 统一设计了更高效的 Backbone 和 Neck:受到硬件感知神经网络设计思想的启发,基于 RepVGG style 设计了可重参数化、更高效的骨干网络 EfficientRep Backbone 和 Rep-PAN Neck。
- 相比于 YOLOX 的 Decoupled Head,进一步优化设计了简洁有效的 Efficient Decoupled Head,在维持精度的同时,降低了一般解耦头带来的额外延时开销。
- 在训练策略上,采用 Anchor-free 的策略,同时辅以 SimOTA 标签分配策略以及 SIoU 边界框回归损失来进一步提高检测精度。
YOLOv6 和 YOLOv5 一样也可以分成数据增强、模型结构、loss 计算等组件,如下所示:
1. 数据增强模块
YOLOv6 目标检测算法中使用的数据增强与 YOLOv5 基本一致,唯独不一样的是没有使用 Albu 的数据增强方式:
- Mosaic 马赛克
- RandomAffine 随机仿射变换
- MixUp
- 图像模糊等采用 Albu 库实现的变换
- HSV 颜色空间增强
- 随机水平翻转
关于每一个增强的详细解释,详情请看YOLOv5 数据增强模块
百面算法工程师 | YOLOv5面试考点原理全解析_yolov5面试详解-CSDN博客
另外,YOLOv6 参考了 YOLOX 的数据增强方式,分为 2 种增强方法组,一开始和 YOLOv5 一致,但是在最后 15 个 epoch 的时候将 Mosaic 使用 YOLOv5KeepRatioResize + LetterResize 替代了,个人感觉是为了拟合真实情况。
2. 网络结构
YOLOv6 N/T/S 模型的网络结构由 EfficientRep + Rep-PAN + Efficient decoupled Head 构成,M/L 模型的网络结构则由 CSPBep + CSPRepPAFPN + Efficient decoupled Head 构成。其中,Backbone 和 Neck 部分的结构与 YOLOv5 较为相似,但不同的是其采用了重参数化结构 RepVGG Block 替换掉了原本的 ConvModule,在此基础上,将 CSPLayer 改进为了多个 RepVGG 堆叠的 RepStageBlock(N/T/S 模型)或 BepC3StageBlock(M/L 模型);Head 部分则参考了 FCOS 和 YOLOX 的检测头,将回归与分类分支解耦成两个分支进行预测。
2.1 Backbone
已有研究表明,多分支的网络结构通常比单分支网络性能更加优异,例如 YOLOv5 的 CSPDarknet,但是这种结构会导致并行度降低进而增加推理延时;相反,类似于 VGG 的单分支网络则具有并行度高、内存占用小的优点,因此推理效率更高。而 RepVGG 则同时具备上述两种结构的优点,在训练时可解耦成多分支拓扑结构提升模型精度,实际部署时可等效融合为单个 3×3 卷积提升推理速度,RepVGG 示意图如下。因此,YOLOv6 基于 RepVGG 重参数化结构设计了高效的骨干网络 EfficientRep 和 CSPBep,其可以充分利用硬件算力,提升模型表征能力的同时降低推理延时。
在 N/T/S 模型中,YOLOv6 使用了 EfficientRep 作为骨干网络,其包含 1 个 Stem Layer 和 4 个 Stage Layer,具体细节如下:
- Stem Layer 中采用 stride=2 的 RepVGGBlock 替换了 stride=2 的 6×6 ConvModule。
- Stage Layer 结构与 YOLOv5 基本相似,将每个 Stage layer 的 1 个 ConvModule 和 1 个 CSPLayer 分别替换为 1 个 RepVGGBlock 和 1 个 RepStageBlock,如上图 Details 部分所示。其中,第一个 RepVGGBlock 会做下采样和 Channel 维度变换,而每个 RepStageBlock 则由 n 个 RepVGGBlock 组成。此外,仍然在第 4 个 Stage Layer 最后增加 SPPF 模块后输出。
在 M/L 模型中,由于模型容量进一步增大,直接使用多个 RepVGGBlock 堆叠的 RepStageBlock 结构计算量和参数量呈现指数增长。因此,为了权衡计算负担和模型精度,在 M/L 模型中使用了 CSPBep 骨干网络,其采用 BepC3StageBlock 替换了小模型中的 RepStageBlock 。如下图所示,BepC3StageBlock 由 3 个 1×1 的 ConvModule 和多个子块(每个子块由两个 RepVGGBlock 残差连接)组成。
2.2 Neck
Neck 部分结构仍然在 YOLOv5 基础上进行了模块的改动,同样采用 RepStageBlock 或 BepC3StageBlock 对原本的 CSPLayer 进行了替换,需要注意的是,Neck 中 Down Sample 部分仍然使用了 stride=2 的 3×3 ConvModule,而不是像 Backbone 一样替换为 RepVGGBlock。
2.3 Head
不同于传统的 YOLO 系列检测头,YOLOv6 参考了 FCOS 和 YOLOX 中的做法,将分类和回归分支解耦成两个分支进行预测并且去掉了 obj 分支。同时,采用了 hybrid-channel 策略构建了更高效的解耦检测头,将中间 3×3 的 ConvModule 减少为 1 个,在维持精度的同时进一步减少了模型耗费,降低了推理延时。此外,需要说明的是,YOLOv6 在 Backobone 和 Neck 部分使用的激活函数是 ReLU,而在 Head 部分则使用的是 SiLU。
由于 YOLOv6 是解耦输出,分类和 bbox 检测通过不同卷积完成。以 COCO 80 类为例:
- P5 模型在输入为 640x640 分辨率情况下,其 Head 模块输出的 shape 分别为 (B,4,80,80), (B,80,80,80), (B,4,40,40), (B,80,40,40), (B,4,20,20), (B,80,20,20)。
3. 正负样本匹配策略
YOLOv6 采用的标签匹配策略与 TOOD相同, 前 4 个 epoch 采用 ATSSAssigner 作为标签匹配策略的 warm-up , 后续使用 TaskAlignedAssigner 算法选择正负样本。
3.1 Anchor 设置
YOLOv6 采用与 YOLOX 一样的 Anchor-free 无锚范式,省略了聚类和繁琐的 Anchor 超参设定,泛化能力强,解码逻辑简单。在训练的过程中会根据 feature size 去自动生成先验框。
3.2 Bbox 编解码过程
YOLOv6 的 BBox Coder 采用的是 DistancePointBBoxCoder。
网络 bbox 预测的值为 (top, bottom, left, right),解码器将 anchor point 通过四个距离解码到坐标 (x1,y1,x2,y2)。
3.3 匹配策略
- 0 <= epoch < 4,使用 BatchATSSAssigner
- epoch >= 4,使用 BatchTaskAlignedAssigner
ATSSAssigner
ATSSAssigner 是 ATSS 中提出的标签匹配策略。 ATSS 的匹配策略简单总结为:通过中心点距离先验对样本进行初筛 , 然后自适应生成 IoU 阈值筛选正样本。 YOLOv6 的实现种主要包括如下三个核心步骤:
- 因为 YOLOv6 是 Anchor-free,所以首先将 anchor point 转化为大小为 5*strdie 的 anchor。
- 对于每一个 GT,在 FPN 的每一个特征层上, 计算与该层所有 anchor 中心点距离(位置先验), 然后优先选取距离 topK 近的样本,作为 初筛样本。
- 对于每一个 GT,计算其 初筛样本 的 IoU 的均值 mean与标准差 std,将 mean + std 作为该 GT 的正样本的 自适应 IoU 阈值 ,大于该 自适应阈值 且中心点在 GT 内部的 anchor 才作为正样本,使得样本能够被 assign 到合适的 FPN 特征层上。
下图中,(a) 所示中等大小物体被 assign 到 FPN 的中层,(b) 所示偏大的物体被 assign 到 FPN 中检测大物体和偏大物体的两个层。
TaskAlignedAssigner
TaskAlignedAssigner 是 TOOD中提出的一种动态样本匹配策略。 由于 ATSSAssigner 是属于静态标签匹配策略,其选取正样本的策略主要根据 anchor 的位置进行挑选, 并不会随着网络的优化而选取到更好的样本。在目标检测中,分类和回归的任务最终作用于同一个目标,所以 TaskAlignedAssigner 认为样本的选取应该更加关注到对分类以及回归都友好的样本点。
TaskAlignedAssigner 的匹配策略简单总结为: 根据分类与回归的分数加权的分数选择正样本。
- 对于每一个 GT,对所有的 预测框 基于 GT 类别对应分类分数 与 预测框与 GT 的 IoU 的加权得到一个关联分类以及回归的对齐分数 alignment_metrics。
- 对于每一个 GT,直接基于 alignment_metrics 对齐分数选取 topK 大的作为正样本。
因为在网络初期参数随机, 分类分数 和 预测框与 GT 的 IoU 都不准确,所以需要经过前 4 个 epoch 的 ATSSAssigner 的 warm-up。经过预热之后的 TaskAlignedAssigner 标签匹配策略就不使用中心距离的先验, 而是直接对每一个GT 选取 alignment_metrics 中 topK 大的样本作为正样本。
4. Loss 设计
参与 Loss 计算的共有两个值:loss_cls 和 loss_bbox,其各自使用的 Loss 方法如下:
- Classes loss:使用的是 mmdet.VarifocalLoss
- BBox loss:l/m/s使用的是 GIoULoss, t/n 用的是 SIoULoss
权重比例是:loss_cls : loss_bbox = 1 : 2.5
4.1 分类损失函数 VarifocalLoss
Varifocal Loss (VFL) 是 VarifocalNet: An IoU-aware Dense Object Detector中的损失函数。
VFL 是在 GFL 的基础上做的改进
在上述标签匹配策略中提到过选择样本应该优先考虑分类回归都友好的样本点, 这是由于目标检测包含的分类与回归两个子任务都是作用于同一个物体。 与 GFL 思想相同,都是将 预测框与 GT 的 IoU 软化作为分类的标签 ,使得分类分数关联回归质量, 使其在后处理 NMS 阶段有分类回归一致性很强的分值排序策略,以达到选取优秀预测框的目的。
Varifocal Loss 原本的公式:
其中 𝑞 是预测 bboxes 与 GT 的 IoU,使用软标签的形式作为分类的标签。 𝑝∈[0,1] 表示分类分数。
-
对于负样本,即当 𝑞=0 时,标准交叉熵部分为 −log(𝑝),负样本权重使用 𝛼𝑝^𝛾 作为 focal weight 使样本聚焦与困难样本上,这与 Focal Loss 基本一致。
-
对于正样本,即当 𝑞>0 时,首先计算标准二值交叉熵部分
但是针对正样本的权重设置,Varifocal Loss 中并没有采用类似 𝛼𝑝𝛾的方式降权, 而是认为在网络的学习过程中正样本相对于负样本的学习信号来说更为重要,所以使用了分类的标签 𝑞, 即 IoU 作为 focal weight, 使得聚焦到具有高质量的样本上。
但是 YOLOv6 中的 Varifocal Loss 公式采用 TOOD 中的 Task ALignment Learning (TAL), 将预测的 IoU 根据之前标签匹配策略中的分类对齐度 alignment_metrics 进行了归一化, 得到归一化 𝑡^。 具体实现方式为:
对于每一个 Gt,找到所有样本中与 Gt 最大的 IoU,具有最大 alignment_metrics 的样本位置的 t =max( Iou)
最终 YOLOv6 分类损失损失函数为:
4.2 回归损失函数 GIoU Loss / SIoU Loss
在 YOLOv6 中,针对不同大小的模型采用了不同的回归损失函数,其中 l/m/s使用的是 GIoULoss, t/n 用的是 SIoULoss。
其中GIoULoss 详情请看Loss------ 百面算法工程师 | 损失函数篇-CSDN博客
SIou Loss
SIoU 损失函数是 SIoU Loss: More Powerful Learning for Bounding Box Regression 中提出的度量预测框与 GT 的匹配度的指标,由于之前的GIoU, CIoU, DIoU 都没有考虑预测框向 GT 框回归的角度,然而角度也确实是回归中一个重要的影响因素,因此提出了全新的SIoU。
SIoU 损失主要由四个度量方面组成:
- IoU成本
- 角度成本
- 距离成本
- 形状成本
如下图所示,角度成本 就是指图中预测框 𝐵 向 𝐵𝐺𝑇 的回归过程中, 尽可能去使得优化过程中的不确定性因素减少,比如现将图中的角度 𝛼 或者 𝛽 变为 0 ,再去沿着 x 轴或者 y 轴去回归边界。
Object Loss
在 YOLOv6 中,由于额外的置信度预测头可能与 Aligned Head 有所冲突,经实验验证在不同大小的模型上也都有掉点, 所以最后选择弃用 Objectness 分支。
1.5 优化策略和训练过程
1.5.1 优化器分组
与 YOLOv5 一致,详情请看 YOLOv5 优化器分组
1.5.2 weight decay 参数自适应
与 YOLOv5 一致,详情请看 YOLOv5 weight decay 参数自适应
1.6 推理和后处理过程
YOLOv6 后处理过程和 YOLOv5 高度类似,实际上 YOLO 系列的后处理逻辑都是类似的。 详情请看YOLOv5 推理和后处理过程
再次放上YOLOv5的面试总结,方便大家阅读