当前位置: 首页 > article >正文

【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,但通道数已经减少,信息更集中


http://www.kler.cn/a/444899.html

相关文章:

  • 物联网:全面概述、架构、应用、仿真工具、挑战和未来方向
  • 安全算法基础(一)
  • 基于蓝牙通信的手机遥控智能灯(论文+源码)
  • 现代控制理论——自由度
  • 对BG兼并点的理解-不断刷新版
  • Redis篇-19--运维篇1-主从复制(主从复制,读写分离,配置实现,实战案例)
  • 深入解析 Vue 3 源码:原理与学习指南
  • ffmpeg.exe 命令使用
  • 模型优化之知识蒸馏
  • [Unity Shader] 【游戏开发】【图形渲染】Unity Shader的种类2-顶点/片元着色器与固定函数着色器的选择与应用
  • Android OnTouchListener OnTouchEvent OnClickListener三者之间的关系?
  • DDS信号源如何对声光调制器AOM或偏转器AOD进行控制
  • idea中使用git pull或push报错fatal:unable to access “https://xxxxxxx“的一种解决方法
  • python huggingface模型超时的解决方案
  • [java] 简单的熔断器scala语言案例
  • linux网络套接字 | 深度解析守护进程 | 实现tcp服务守护进程化
  • 联合目标检测与图像分类提升数据不平衡场景下的准确率
  • Linux创建普通用户和修改主机名
  • python tif处理 GDAL安装方法
  • Harmonyos多线程之Worker基本使用
  • 前端跨越方式有哪些
  • Jenkins 中 写 shell 命令执行失败,检测失败问题
  • Linux常用命令【真·常用】
  • DGCN论文解读
  • Python读取Excel批量写入到PPT生成词卡
  • 配置免密登陆服务器