YOLOv3论文学习笔记

论文:《Yolov3: An Incremental Improvement》(2018CVPR)

代码:https://pjreddie.com/yolo/

目录

1、主要改进点

2、网络结构

Darknet53

多尺度检测

特征金字塔网络(feature parymid network, FPN)

先验框的设计

多标签分类

3、损失函数


1、主要改进点

(1)改进网络结构,更适合于小目标检测;

(2)使用多尺度特征图来预测不同尺寸目标;

(3)更丰富的anchor box:3种scale,每种3个规格,共9个;

(4)将softmax层修改为logistic逻辑分类器,适用于多标签分类。

2、网络结构

目标检测通常分为三步:

(1)Backbone : 主干网络,用于提取特征

        基于常用预训练的Backbone,生成抽象的语义特征,再进行特定任务微调。

        Backbone生成的特征,一般按照stage进行划分,记作C1、C2、C3、C4、C5、C6、C7等,数字与stage的编号相同,表示的是分辨率减半的次数,如C2表示stage2输出的特征图,分辨率为输入图片的1/4,C5表示stage5输出的特征图,分辨率为输入图片的1/32。

(2)Neck : 颈部,利用FPN进行特征融合

        FPN将上一步生成的不同分辨率的特征作为输入,输出融合后的特征。输出特征一般以P作为编号标记。如FPN的输入是 C3、C4、C5、C6,经过融合后,输出为P3、P4、P5、P6。

(3)Head :检测头,利用融合的特征对物体进行检测

        FPN输出融合后的特征后,就可以输入到检测头做具体的物体检测。

Darknet53

        Darknet-53主要由1×1和3×3的卷积层组成,每个卷积层之后包含一个批量归一化层BN和一个Leaky ReLU,目的是为了防止过拟合。卷积层、批量归一化层以及Leaky ReLU共同组成Darknet-53中的基本卷积单元DBL。因为在Darknet-53中共包含53个这样的DBL,所以称其为Darknet-53。

  • DBL: 一个卷积层、一个批量归一化层和一个Leaky ReLU组成的基本卷积单元。
  • res unit: 输入通过两个DBL后,再与原输入进行add;这是一种常规的残差单元。残差单元的目的是为了让网络可以提取到更深层的特征,同时避免出现梯度消失或爆炸。
  • resn: 其中的n表示n个res unit;resn = Zero Padding + DBL + n × res unit 。
  • concat: 将darknet-53的中间层和后面的某一层的上采样进行张量拼接,达到多尺度特征融合的目的。这与残差层的add操作是不一样的,拼接会扩充张量的维度,而add直接相加不会导致张量维度的改变。
  • Y1、Y2、Y3:分别表示YOLOv3三种尺度的输出。

Darknet53的主要改进:

  1. 没有采用最大池化层,转而采用步长为2的卷积层进行下采样。
  2. 去掉了全连接层。
  3. 为了防止过拟合,在每个卷积层之后加入了一个BN层和一个Leaky ReLU。
  4. 引入了残差网络的思想,目的是为了让网络可以提取到更深层的特征,同时避免出现梯度消失或梯度爆炸。
  5. 将网络的中间层和后面某一层的上采样进行张量拼接,达到多尺度特征融合的目的。
  6. 网格大小有三种:V1中网格大小是7×7、V2中网格大小是13×13、V3中网格大小是13×13、26×26、52×52。

多尺度检测

        为了检测多尺度的目标,YOLOv3选择了三种不同shape的Anchors,同时每种Anchors具有三种不同的尺度,一共9种不同大小的Anchors。

特征金字塔网络(feature parymid network, FPN)

        FPN主要解决的是目标检测中的多尺度问题,通过简单的网络连接改变,在基本不增加原有模型计算量的情况下,大幅度提升了小目标检测的性能。FPN包含自底向上、自顶向下、和侧向连接的融合过程。

自底向上的过程:CNN网络一般都是按照特征图大小划分为不同的stage,每个stage之间特征图的尺度比例相差为2。在FPN中,每个stage对应一个特征金字塔的级别,并且每个stage的最后一层特征被选为对应FPN中相应级别的特征。

自顶向下过程:自顶向下的过程通过上采样(up-sampling)的方式将顶层较小的特征图放大到与上一个stage特征图一样的大小。这样的好处是既利用了顶层较强的语义特征(利于分类),又利用了底层较高分辨率的信息(利于定位)。上采样的方法可以用最近邻差值实现。

侧向连接:为了将高层语义特征和底层的精确定位能力结合,作者提出了类似于残差网络的侧向连接结构。侧向连接将上一层经过上采样后和当前层分辨率一致的特征,通过相加的方法进行融合,同时为了修正通道数量,将当前层先经过1x1卷积操作。

        借鉴特征金字塔网的思想,YOLOv3设计了3种不同尺度的网络输出Y1、Y2、Y3,目的是预测不同尺度的目标。由于每个尺度的网格都负责预测3个边界框,且COCO数据集有80个类。所以网络输出的张量应该是: N × N × [ 3 ∗ ( 4 + 1 + 80 ) ]。

        由下采样次数不同,得到的 N 不同,最终Y1、Y2、Y3的shape分别为:[13, 13, 255]、[26, 26, 255]、[52, 52, 255]。

先验框的设计

多标签分类

  • 将YOLOv2的单标签分类改进为多标签分类,一个softmax → 多个sigmoid。
  • YOLOv2中,softmax通常认为一个目标只属于一个类别,根据网络输出类别得分的最大值,将其归为某一类。
  • 在一些复杂的场景中,单一目标可能从属于多个类别,实现多标签分类就需要用逻辑分类器来对每个类别都进行二分类。
  • 逻辑分类器主要用到了sigmoid函数,它可以把输出约束在0到1,如果某一特征图的输出经过该函数处理后的值大于设定阈值,那么就认定该目标框所对应的目标属于该类。

Logistic激活函数:

        logistic函数图像是一条S型曲线,又名sigmoid曲线,以(0,0.5)为对称中心,随着自变量 x不断增大,其函数值不断增大接近1,随自变量x不断减小,其函数值不断降低接近0,函数的取值范围在(0,1)之间,且函数曲线在中心位置变化速度最快,在两端的变化速率较慢。用概率去描述分类器,比单纯的某个阈值要方便很多。

交叉熵损失函数:

        Logistic损失函数只能处理二分类问题,对于两个分类扩展到M个分类,使用交叉熵损失函数(Cross Entropy Loss),其定义如下:

3、损失函数

        对比YOLOv1中的损失函数可以看出:位置损失部分没有改变,仍然采用的是sum-square error的计算方法。但置信度损失和类别预测均由原来的sum-square error改为了交叉熵损失。对于类别以及置信度的预测,使用交叉熵的效果应该更好。

参考:

目标检测——Yolo系列(YOLOv1/2/v3/4/5/x/6/7/8)_yolo目标检测-CSDN博客

详解FPN网络-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值