0. 写在前面
YOLO系列博客,紧接上一篇Yolo系列算法-理论部分-YOLOv2-CSDN博客
1. YOLOv3-定型之作
2018年,Redmon团队推出YOLOv3的网络模型,将骨干网络(backbone)由darknet-19替换成darknet-53网络,加入特征金字塔网络结构,解决多尺度检测的问题,在分类模块中使用逻辑回归代替了softmax,在兼顾实时性的基础上还保证目标检测的准确性。
同时作者也提供了轻量级tiny-darknet,YOLO系列开始走向工程化的路线,轻量化的模型让目标检测算法在计算性能弱一些的芯片中运行成为了可能。
2. 网络结构
YOLOv3的骨干网络有了较大的升级,将ResNet残差网络思想,将darknet-19改进为darknet-53;卷积层主要使用1×1和3×3的卷积核,每个卷积层之后都会加上批量归一化和Leaky ReLU(主要是为了防止过拟合)。卷积层、批量归一化层以及Leaky ReLU共同组成darknet-53中的基本卷积单元DBL,其中包含53个DBL,网络结构细节如下图所示。
说明:
- DBL:Conv(卷积)+BN(批量归一化)+LeakyReLU组成基本卷积单元;
- 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三种尺度的输出。
改进:
- 没有采用最大池化层,转而采用步长为2的卷积层进行下采样;
- 为了防止过拟合,在每个卷积层之后加入BN+Leaky ReLU;
- 引入残差网络的思想,让网络可以提取深层的特征,同时避免出现梯度消失或爆炸;
- 网络的中间层和后面某一层的上采样进行张量拼接,实现多尺度特征融合的功能。
3. 核心提升详解
1. 多尺度Anchors
YOLOv3选择三种不同shape的Anchors,同时每种Anchors具有三种不同的尺度,一共9种不同大小的Anchors,(10×13)、(16×30)、(33×23)、(30×61)、(62×45)、(59×119)、(116×90)、(156×198)、(373×326)。
借助特征金字塔的思想,三种不同尺度的网络输出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]。
2.损失函数
损失函数中,位置损失部分并没有改变,置信度损失和类别预测损失改为了交叉熵的损失计算方法。
3. 多标签分类
将YOLOv2网络结构中用于分类的softmax层修改为逻辑分类器,v2中算法认定一个目标只会从属于一个类别,根据网络输出类别得分最大值,将其归为某一类。然而在一些复杂场景中,单一目标可能从属于多个类别。
例如,在交通场景中,目标既是汽车又是卡车,单标签分类的方法就满足不了要求。
逻辑分类器是对每一个类别都进行二分类,使用sigmoid函数,将其约束到0-1,如果某一个特征图输出经过该函数处理后的值大于设定的阈值,那么就认定目标框所对应的目标属于该类。
4. 性能表现
YOLOv3在COCO数据集上测试结果,在满足检测精度差不多的情况下,有着更快的推理速度。