【YOLO】 YOLOv3原理
YOLOv3模型结构
总体结构
Backbone(特征提取部分)
主要用于从输入图像中提取多尺度的特征图,使用了Darknet-53网络作为特征提取器
- ResNet风格的结构:其中由多个ResX模块组成,其中还包含由多个残差单元,主要用于解决深层网络训练中的梯度消失问题
- 输出不同尺寸的特征图,然后传递给下游的预测部分
Neck(特征融合部分)
主要用于融合不同尺度的特征图,为后续的预测提供更多的尺度信息
上采样模块:通过 上采样(Upsample)操作将低分辨率的特征图还原到更高分辨率,并与前面 Backbone 中的特征图进行 拼接(Concat)
通过该种方式有效结合高层语义信息和底层细节信息,从而提高小目标的检测性能
Prediction Head(输出预测部分)
主要作用则是生成最终的检测结果,包括边界框位置、置信度和类别概率
YOLOv3使用了3个不同尺度的预测头
- 13×13:负责检测大目标
- 26×26:负责检测中等目标
- 52×52:负责检测小目标
核心模块
CBL 模块
组成:CBL = Conv + BN + Leaky ReLU
- Conv:卷积层,用于特征提取
- BN:批量归一化层,加速网络收敛并改善训练稳定性
- Leaky ReLU:激活函数,解决 ReLU 在输入负值时梯度为零的问题,提高模型的表达能力
Res unit(残差单元)
残差单元包含两个连续的CBL模块,然后加上一个跳跃连接
主要作用就是通过残差连接使得网络更容易训练,解决深层网络中的梯度消失和梯度爆炸问题;其次便是保持输入和输出特征一致,增强了特征信息的传递能力
ResX 模块
通过堆积多个残差单元,从而构造深度卷积特征提取器;ResX模块是对残差网络的进一步应用,形成了深度特征提取部分
DarkNet网络
Backbone网络中输出的三个预测特征图分析
三个特征图是在网络不同深度生成的,主要用于多尺度预测
- 第一个预测特征图:从浅层网络输出,特征图分辨率较大(比如
x8
缩放层),主要用于检测小目标 - 第二个预测特征图:从中间层输出,分辨率适中(比如
x16
缩放层),适合检测中等尺寸的目标 - 第三个预测特征图:从深层网络输出,特征图分辨率较小(比如
x32
缩放层),用于检测大目标
结合YOLOv3模型结构理解,特征图都是通过 卷积层 和 残差连接 进行特征提取后产生的
总体了解
Backbone 是整个 YOLOv3 中负责特征提取的部分,它直接采用了 Darknet-53 网络结构
多尺度预测
概念理解
自我理解
类似于在公园找到距离自己不同距离的鸟的位置
- 近处的鸟:你可以清晰看到它们的羽毛、颜色和细节,这些细节类似于神经网络浅层的高分辨率特征图,因为它们包含丰富的细节信息
- 远处的鸟:虽然你看不到羽毛细节,但可以看到一个大致的轮廓,判断出它们是鸟,而不是别的物体。这种信息类似于神经网络深层的低分辨率特征图,因为它们包含的是整体的语义信息
为了找到图中所有的鸟,那么就需要结合多种视角,既需要分析一张图中的具体细节,又需要从全局视角中找鸟,就这样不断的切换视角,确保所有的鸟都可以被找到
核心思想
不同大小的框适合检测不同尺寸的物体(这里的预测框与YOLOv2中的Anchor Boxes不一样,下文详细分析)。在神经网络中,浅层特征图保留细节信息(更加适合小物体),而深层特征图保留语义信息(更加适合大物体)。通过融合这些特征图,网络就可以同时预测大中小不同尺寸的物体
Backbone输出的特征图与Predictiontion输出特征图
理解
例如我们开始准备画一幅风景画
Backbone 阶段:你先用铅笔画出粗略的草图(提取基础信息),这一步类似于 Backbone 输出的预测特征图
- 草图1:画近处的花草细节
- 草图2:画中距离的建筑轮廓
- 草图3:画远处的山脉结构
Prediction 阶段:你在基础草图的基础上进一步加工
- 将花草(小目标)和背景(大目标)用不同颜色精细填充(特征融合)
- 对所有部分进行微调,使画面更清晰和协调(进一步卷积优化)
最终输出的风景图就是网络Prediction阶段的最终预测结果,其是基于Blackbone输出的初始信息,但是经过了融合和优化,最终的结果也就更精准全面
分析
Backbone阶段(特征提取)
主要任务就是多尺度的特征提取,输出的三个预测图也是来自不同的网络深度,代表着不同的特征信息,参考上文内容
Prediction阶段(特征进一步融合与预测)
- 上采样:将深层小分辨率的特征图上采样,恢复到较大的尺寸,与浅层特征图进行融合
- 拼接(Concatenate):融合不同尺度的信息(将细节与语义信息结合起来)
- 卷积调整:通过 1x1 卷积等操作,进一步提炼特征,确保预测精度
分析:为什么浅层图适合小物体,而深层特征图适合大物体?
针对于浅层特征图
想象通过放大镜观察一颗小珠子,放大镜的视野有限,但能够捕捉到细小的细节(如珠子表面的凹凸)。这类似于浅层特征图的作用
浅层卷积层通常提取低级特征,例如边缘、角点、纹理等。这些特征通常保留了原图的细节信息,分辨率较高,因此它们更适合检测小物体。例如,小物体的边缘、纹理等细节非常关键,而浅层网络能够很好地捕捉这些信息
针对深层特征图
类似于我们用一只普通的眼镜看整个房间时,你无法看到细节,但能够看到整个房间的布局、物体的相对位置和大致形状,这就类似于深层特征图在捕捉大物体时的作用
随着网络的深入,卷积层会提取更抽象的特征,这些特征开始关注更大的图像区域,并且能够综合低层次特征来捕捉更复杂的图像信息。深层特征图通常包含较少的空间细节信息(分辨率较低),但包含了更多的语义信息。这使得它们能够识别大物体,尤其是那些占据较大图像区域的物体。深层特征图能够将图像的整体语义理解融入到目标检测中,适合用来检测大物体
综上所述,浅层特征图可以保留更多的细节,适合捕获小物体,深层特征图可以保留更多的语义消息,从而适合捕获大物体
多尺度预测与Anchor Boxes
YOLOv2中的Anchor Boxes
在YOLOv2中,Anchor Boxes是预定义的框,用于匹配图像中不同大小和长宽比的物体。每个Anchor Box表示一个特定的物体框的预期形状和尺寸。网络根据这些Anchor Boxes预测物体的位置和类别
具体来说,YOLOv2通过k-means聚类算法计算出一组最合适的Anchor Boxes,然后在每个格子(grid cell)上预测物体相对于这些Anchor Boxes的偏移量和置信度。这样,模型可以更精确地预测不同尺寸和形状的物体
OLOv3及以后的多尺度预测
YOLOv3通过不同层级的特征图来检测不同尺寸的目标。这些特征图通常来自网络的不同深度(浅层和深层)。浅层特征图对小物体敏感,深层特征图对大物体敏感。通过这种多尺度的设计,YOLO能够在一个图像中同时检测不同尺寸的目标
在YOLOv3及后续版本中,虽然Anchor Boxes依然存在,但它们的作用与多尺度预测框是互补的。Anchor Boxes帮助网络在特定尺度上进行目标预测,而多尺度的特征图让网络能够从多个尺度的角度来优化目标检测。因此,YOLOv3及以后的版本实际上结合了Anchor Boxes和多尺度特征图来实现更加灵活和高效的目标检测
YOLOv3的具体实现步骤分析(重点)
输入图像:首先,输入图像会通过YOLOv3的卷积神经网络(CNN)进行特征提取,得到多个特征图
生成Anchor Boxes:YOLOv3使用Anchor Boxes来进行预测,每个特征图上的格子会有多个Anchor Boxes,这些Anchor Boxes具有不同的长宽比和尺寸
预测目标信息:
- 每个网格会输出每个Anchor Box的位置(相对于网格的位置)、尺寸(宽高)以及该框内是否存在物体(置信度)和物体类别
- 这些信息会通过网络的输出层计算得到,最终通过非极大值抑制(NMS)去除重复的框,留下最准确的检测框
目标检测:根据预测框和实际物体之间的交并比(IoU),YOLOv3会过滤掉不合格的框,最终在图像中绘制出框住物体的结果
预测头(prediction Head)
理解
预测头的主要目标就是检测模型中负责输出物体信息的部分,根据网络中提取的特征图信息,生成每个预测框(Anchor Box)的位置、类别和置信度,这个就类似于在摄像头中输出物体的具体信息
预测头就是相当于这个商场的“安保监控系统”。每个摄像头(grid cell)通过多个Anchor Box来监视不同的区域,预测是否有物体出现,以及物体的具体位置和种类
- 摄像头监控:安保人员利用监控摄像头,捕捉商场不同区域的动态信息,预测并识别出每个区域内的物体
- 目标检测:当一个包裹出现在商场时,预测头类似于摄像头的功能,负责判断包裹是否存在,在哪里,并且识别出它是一个包裹
- 多目标监控:摄像头能够在同一时间检测到多个物体
原理了解
预测头的核心任务就是生成每一个Anchor Box对应的输出
- 边界框的位置(Bounding Box):框的中心坐标(x, y)、宽度(w)和高度(h)
- 物体的类别(Class Probabilities):对于每个框,预测该框内属于哪个类别的物体
- 置信度分数(Confidence Score):框内是否存在物体的置信度,表示网络对该框是否包含物体的信心
具体实现(重点)
因为每个单元都有3个边界框
接收来自Neck层的三个不同尺度中的特征图
- 13x13 特征图:对应深层的语义特征,适合检测大目标
- 26x26 特征图:对应中间层的特征,适合检测中目标
- 52x52 特征图:对应浅层的细节特征,适合检测小目标
卷积操作
- 通过 CBL 卷积操作,对特征图进行进一步的特征提取
- 最后使用 1x1 卷积 调整输出的通道数,确保输出满足目标检测的要求
输出张量
- 每个网格单元都会输出一个向量
- tx,ty:边界框中心坐标的偏移量(相对网格单元)
- tw,th:边界框的宽度和高度
- pobj:置信度分数,表示该框是否包含目标
- p1,p2,...,p80:分类概率(针对 80 类 COCO 数据集)
- 对于每个特征图,预测头会输出3×(4+1+80)=255 个通道
- 其中的3表示网格单元中有3个预设的Anchor Box
- 4表示边界框的中心坐标和尺寸
- 1表示置信度分数
- 80表示分类概率
输出尺度(针对三个不同尺度的特征图)
- 13x13x255:检测大目标
- 26x26x255:检测中目标
- 52x52x255:检测小目标
整体角度理解预测头
1. 特征图生成与初步预测框输出
首先输入的图像经过Backbone和Neck层进行处理后,输出多个尺度的特征图,52*52对应小目标、26*26对应中等目标、13*13对应大目标
每个单元在特征图上会输出多个预测框,每个框又有相应的参数,参考上文
2. 边界框坐标还原(中心点计算)(下面的步骤都属于后处理阶段)
因为预测框中的坐标是相对于网格单元的偏移量,需要还原到原始输入图像的坐标系中
边界框中心点坐标 (bx,by) 通过 Sigmoid 函数计算
界框宽高(bw,bh) 通过指数函数计算
3. 置信度分数计算
对于生成的每个预测框需要计算置信度分数,也就是表示预测框真实存在目标的概率
4. 筛选低置信度的预测框
通过设置信度阈值,丢弃置信度低的预测框,从而保留其中有可能包含目标的预测框
5. 非极大值抑制(NMS)
通过NMS的主要目的在于多个预测框中可能对同一个目标进行检测,导致框之间存在重叠,需要筛选出最佳的预测框
- 排序:根据置信度分数对预测框进行排序
- 框间重叠运算:计算框与框之间的交并比
- 抑制重叠框:
- 设置 IoU 阈值(例如 0.50.50.5)
- 对于每个置信度最高的框,去除与其 IoU 大于阈值的其他框
- 继续重复该过程,直到所有框被处理完毕
最终保留置信度最高且不重叠的边界框,同时去除多余框
6. 最终输出边界框
经过 NMS 筛选后,剩余的预测框被作为最终的检测结果输出,其中包括边界框坐标(x,y,w,h)、置信度分数、目标类别
预测框全局整合
通过拼地图的例子进一步理解
假设你将一幅地图分成多个小方块(网格),每个方块上有局部的地标信息
如果一个地标(目标)横跨多个方块
- 每个方块可能会记录地标的一部分信息(预测框)
- 中心点所在的方块负责记录地标的整体位置(主框)
当你重新拼接地图时
- 合并重叠的部分(通过 NMS),只保留一个完整的地标信息(最终目标框)
- 最终,地图上的地标是一个完整的实体
分析:一个网格中的预测框是如何延展到其他网络的?
多个网络是可以同时预测同一个物体,因为图片中一定有一个目标占据了多个网格单元的情况,所以,因此,多个网格单元可能会对同一个物体进行预测,它们的预测框可能会部分重叠甚至完全覆盖目标,例如一张图中的狗就会覆盖多个网格单元,多个网格单元分别生成自己的预测框,预测框的中心点可能位于不同的网格中
非极大值抑制(NMS)实现将重叠的预测框合并成一个完整的框。首先每个网格单元都会生成对应的预测框,并且会计算置信度和类别概率,预测框中的坐标最后还会还原到图像中的坐标。接下来就是对重叠的预测框进行去重和合并,如果预测框的重叠程度(IOU)比较高,NMS会保留置信度高的框,然后丢弃掉其他重叠框,最终NMS输出的框是基于多个网格单元综合预测的饥饿狂
NMS 会自动将来自不同网格的重叠框合并为一个完整的目标框,从而覆盖整个目标物体,而不是仅局限于一个网格单元
分析2:最终如何保证目标框覆盖到图像中完整的物体?
每个网格单元只会负责预测中心点范围内的物体,也就是说如果目标的中心点如果不在某个网络中,该网络就不会预测这个目标。注意目标的其他部分虽然可能会在其它网络中,但是这些网络不会生成新的预测框,而是由中心点所在的网格负责
Anchor Box的尺寸需要和目标大小匹配,因为每个网格单元的预测框尺寸都是基于预设好的Anchor Box调整,锚框的多样性(多种尺寸和比例)确保能够很好地拟合目标的实际大小,从而使预测框能够完整覆盖整个物体
即使多个网格单元对同一个目标进行了预测,最终通过 NMS 筛选,会保留最优的框,并将重叠框整合为一个,合并后的框就是目标的完整预测框,覆盖整个物体
分析3:单元网络中如何区分物体是一个完整的还是部分呢?
实现原理是目标中心点规则,因为每个网络只负责预测中心点落在该网格范围内的目标,这意味着,物体的其他部分(如狗腿)虽然可能出现在该网格中,但如果中心点不在该网格范围内,该网格不会预测它为目标
具体如何判断不是完整物体思路
- YOLO 的预测框基于 卷积特征提取。卷积操作会聚合周围的上下文信息,形成一个感受野,这样如果网格中只有狗的部分特征,那么最终就会输出低置信度,也就是认为该处的局部特征不足以构成目标
- 在训练时,只有目标中心点落入某个网格单元的区域内,才会给该网格单元分配预测该目标的任务
- 假设某网格中出现了一个狗腿,但没有完整的狗,该网格预测的类别概率(如狗的类别概率)会非常低,会降低最后的最终置信度
中心点判断
分析1:经过 Prediction Head 时是否还原到整个图像的坐标
在Prediction Head中特征图输出的还是相对坐标,参考上图职工框住的区域,经过conv1*1卷积后,输出的仍然是相对坐标
- 中心点偏移量:(tx,ty)(t_x, t_y)(tx,ty) 是相对于网格左上角的坐标偏移量,范围在 [0,1][0, 1][0,1]
- 宽高比例:(tw,th)(t_w, t_h)(tw,th) 是通过对锚框宽高进行缩放得到的比例值
坐标还原操作真正发生在后处理阶段中,也就是说在经过 Prediction Head 输出后,坐标还原到整张图像的实际位置是在后处理阶段完成的,还原公式参考上面章节的“整体角度理解预测头”
后处理阶段
坐标还原与合并特征图
参考上文中“整体角度理解预测头中的公式分析”
坐标还原可以类比为 GPS 坐标的全球定位(理解)
每个网格单元相当于地图中的一个小区域(城市)
网络输出的偏移量(tx,ty) 类似于城市内街道的位置(局部坐标),也就是以这个城市为整体参照物,设置的坐标
还原坐标的过程类似于将街道位置映射到全球 GPS 坐标(全局坐标),这样才能知道这条街道在地图的整体位置上在哪里
合并三张特征图
此时并不是输出了结果,而是整合三张特征图中的所有预测框,最终形成一个统一的预测框集合,注意此时的集合中包含数千个预测框,也就是图中的第二阶段
置信度分析
理解
类似于评估学生考试过程中,在坐标还原中,每个考生都有两项得分(目标置信度和类别概率)
- 计算综合得分(对应置信度分数):根据每个考生的能力计算其综合分数,参考对应的公式
- 筛选考生(置信度阈值):设置一个阈值,只要分数高于该分数线的考生才可以进入下一个阶段
- 去重和最终选择(NMS)
置信度分析存在的意义
减少无关框,网络输出的预测框中,大量框可能对应背景或无效区域(如框住背景的一部分),这些框通常具有低置信度分数,通过置信度分析,就可以剔除这些无效的预测框
后处理阶段的计算复杂度与预测框数量成正比。通过置信度分析剔除无效框,可以大幅减少后续需要处理的预测框数量,提升计算效率
非极大值抑制(NMS)
参考上文中的内容详细理解
非极大值抑制是一种基于置信度分数和 IoU 的后处理算法,用于从预测框中去除冗余框,保留每个目标的唯一最佳框
NMS主要就有两种作用,其一是去重,可以避免目标被多个预测框检测到;其二可以实现只保留最优预测框,提升检测结果的准确性
Neck层
该层的主要作用就是将Backbone输出的多尺度特征图进行进一步处理,最终用于检测的特征图
上采样与下采用
YOLOv3中上采样和下采样是配合使用的,其中下采样是在BackBone中完成的,上采样则是在Neck层中完成,该处进行整合一同学习
理解下采样与上采样
下采样就类似于如何我们想要在电子地图上看到这个城市的全貌,我们此时需要会使用一张缩略图(类似于深层特征图),因为缩略图能快速提供全局信息(大目标的语义信息),但是通过缩略图会失去一些细节,也就是会忽略小目标的信息
上采样则是想要了解城市中的某个街道,那么就需要将图片放大到跟高的分辨力,放大后,你还需要结合更详细的原始地图(类似于拼接浅层特征),才能获得准确的细节信息
下采样的实现
通过Backbone多次卷积核池化操作对输入的图像进行下采样,每次下采样都会将特征图尺寸缩小一半,最终得到13*13的深层特征图
- 13×13(下采样 32 倍):深层语义特征,用于检测大目标
- 26×26(下采样 16 倍):中层特征,用于检测中目标
- 52×52(下采样 8 倍):浅层特征,用于检测小目标
上采样
- 13×13 的深层特征图 → 上采样到 26×26 → 与 Backbone 输出的 26×26 特征图拼接
- 26×26 的特征图 → 上采样到 52×52 → 与 Backbone 输出的 52×52 特征图拼接
上采样的主要目的是将低分辨率特征图放大到更高分辨率,从而能够与浅层的高分辨率特征图进行融合,这样非常有利于检测小目标,因为小目标在低分辨率特征图中可能已经失去了关键信息
上采样后,与中层或浅层特征图进行拼接(Concat),融合语义信息和空间细节信息,从而提升对不同尺度目标的检测能力
特征拼接
理解
深层特征图类似于全局地图,适合宏观看全局,知道整体布局,但是缺乏细节;浅层特征图则类似于一个局部放大镜,更加适合观察细节,但是难以观察全局
比如你在找一座城市中的某个建筑物(目标检测),全局地图告诉你大概在哪个区域(深层特征图的语义信息),放大镜帮助你找到建筑物的具体位置和形状(浅层特征图的细节信息),将两者结合后,你既能快速找到建筑物的区域,又能精确确定它的形状和位置
特征图拼接实现分析
低分辨率的深层特征图和高分辨率的浅层特征图都来自于Backbone中
通过按通道维数进行拼接,也就是在特征图的通道上进行连接,例如上采样和下采样都是13*13的图,最后拼接后的只会是通道数增加,但是其图片的分辨率不变
拼接后的特征图通过卷积操作(CBL,卷积 + BN + Leaky ReLU)进一步提取信息,最终用于检测中目标
特征拼接的优点
提升网络对小目标的检测能力,小目标的信息通常在深层特征图中被稀释甚至丢失,特征拼接通过引入浅层特征图中的高分辨率信息,弥补了深层特征图的不足
同时可以提高目标定位的准确性,深层特征图中虽然包含语义信息,但定位能力较弱,拼接浅层特征图后,网络可以结合细节信息,更精确地定位目标的位置
卷积调整
理解
主要作用是优化,对合并后的信息进行归纳总结,去掉多余的噪声和重复部分,从而使得信息更加的准确
从Neck层整体理解该处的作用,例如一个团队项目正在整理与优化
- 假设两个小组
- 一个小组提供高层次的战略规划(深层特征图)
- 另一个小组提供具体的实施细节(浅层特征图)
- 拼接相当于将两个小组的报告合并成一份综合报告
- 卷积调整相当于一个总负责人对这份报告进行整理和提炼,最终生成一份清晰简洁的方案,供领导决策(目标检测)
具体实现分析
输入
- 拼接后的特征图(例如,来自上采样后的 26×26 特征图和浅层的 26×26 特征图拼接)
- 假设拼接后特征图的通道数为 512
卷积操作
- 1×1 卷积:用于减少通道数,降低计算量
- 3×3 卷积:用于捕捉局部空间特征
- 最终将特征图的通道数调整到适合输出的形状(如 256)
输出
- 调整后的特征图仍然是 26×26,但通道数已经减少,信息更集中