前言
代码地址:Github:ultralytics/yolov3
笔者在阅读《YOLOv3: An Incremental Improvement》原文后,根据自身理解及查阅资料,以入门角度尽可能想要还原论文细节,水平有限,欢迎交流。
在上两篇文章中介绍过YOLOv1及YOLOv2,地址如下:
【建议先读】《YOLO 超详细入门(含开源代码)——网络结构、细节、目标损失函数、优点》
【建议先读】《YOLO超详细入门02 零基础看懂 图文详解(含代码及原文)——网络架构,BN,高分辨率,细粒度特征,多尺度训练,Anchor Box,维度聚类,直接位置预测,输出特点,YOLO9000》
背景
YOLOv3 在 YOLOv2 的基础上,改良了网络的 backbone、利用多尺度特征图 (feature map) 进行检测,并且改用多个独立的 Logistic regression 分类器取代softmax 来预测类别分类。YOLOv3,Better,但并不像YOLOv2对YOLO的改进一样,faster,也不stronger。它有点大,但它更好(准确)。
一、网络架构(Darknet-53)
1.1 背景
YOLO v2 使用了一个定制的网络架构 darknet-19,一个最初的 19 层网络,增加了 11 层用于目标检测。
YOLO v2 采用 30 层架构,卷积层对输入进行下采样时,细粒度特征的丢失导致网络难以检测小物体。为了解决这个问题,YOLO v2 使用了passthrough恒等映射,将前一层的特征映射连接起来以捕获低级特征,相当于一次特征融合。
1.2 架构
YOLOv3 提出新的 backbone: Darknet-53,从第0层到74层,一共有53层convolutional layer,其余为 ResNet 层。
❓ 为什么加入Residual block?
跟 Darknet-19 相比,Darknet-53 去除了所有的 maxpooling 层、增加了更多的1x1和3x3的卷积层,但因为加深网路层数容易导致梯度消失或爆炸,所以Darknet-53 加入了 Resnet 网路 (Residual Network) 来解决梯度的问题。由上图的 Darknet-53 架构可以看到共加入了23个 residual block。
❓ 为什么比YOLOv2更慢?
- Darknet-53 的 BFLOP(十亿次浮点运算)比 ResNet-152 少,但却以 2 倍的速度达到相同的分类精度。
- 由于加深网路层数,Darknet-53 比 Darknet-19 慢的许多,但 Darknet-53 处理速度每秒78张图,还是比同精度的 ResNet 快很多,YOLOv3 依然保持了高性能。
1.3 Detect Flow(检测过程)
- 若输入416x416的图片,在79层卷积层后,会先经过32倍的下采样,再通过3x3, 1x1的卷积层后,得到13x13的feature map (第82层)
- 为了实现能够检测小物体,借鉴了 FPN 的方法,将第79层13x13的 feature map 进行上采样,与第61层26x26的 feature map 合并 (Concat) 后,再经过16倍的下采样及3x3, 1x1的卷积层后,得到26x26的feature map (第94层)
- 接著第91层26x26的 feature map 再次上采样,并与第36层26x26的 feature map 合併 (Concat) 后,再经过8倍下採样及3x3, 1x1的卷积层后,得到52x52的 feature map (第106层)
二、YOLOv3的改进
2.1 Bounding Box Prediction(边界框预测)
与 YOLOv2相同,网络为每个边界框预测 4 个坐标,
t
x
,
t
y
,
t
w
,
t
h
t_{x}, t_{y}, t_{w}, t_{h}
tx,ty,tw,th。
t
x
,
t
y
t_{x}, t_{y}
tx,ty为左上角坐标。如果单元格从图像的左上角偏移 (
c
x
,
c
y
c_{x},c_{y}
cx,cy) 并且边界框先验具有宽度和高度
p
w
,
p
h
p_{w}, p_{h}
pw,ph,则预测对应于:
YOLOv3 还使用 Logistic regression (逻辑回归)预测每个边界框的confidence score(置信度)。
- 正例:如果边界框先验与地面实况对象的重叠比任何其他边界框先验多,则该值应为 1。例如,(prior 1)与第一个 ground truth 对象的重叠比任何其他 bounding box (具有最高 IOU)更多,prior 2 与第二个 ground truth 对象的重叠比任何其他 bounding box 都多。
- 忽略样例: 其他不是最高 IOU 的 bounding box 并且 IOU 大于阈值 (threshold,预测为0.5) ,则忽略这些 bounding box,不计算 loss。
- 负例:若bounding box没有与任何一个gound truth对应,那么就应该减少对应的confidence score。
❓ 为什么YOLOv3 要将confidence score 设为1?
💬 对检测小物体而言,confidence score如果仅仅是用bounding box和ground truth的IOU预测,那么confidence score始终很小,无法有效学习,导致检测的recall不高。
❓ 为什么要有忽略样例?
💬由于 YOLOv3 使用了多尺度的 feature map 进行检测,而不同尺度的feature map之间会有重合检测的部分。例如检测一个物体,在训练时他被分配到的检测框是第一个 feature map 的第三个bounding,IOU 达0.98,此时恰好第二个 feature map 的第一个 bouniding box 与该 ground truth 的 IOU 达0.95,也检测到了该 ground truth,如果采用非极大值抑制(NMS)的话,此时给其 confidence score 强行打0的标签,网络学习效果会不理想。
2.2 Multi labels prediction(多标签预测)
在一些数据集中,比如 Open Image Dataset,一个对象可能有多个标签。例如,一个对象可以被标记为一个女人和一个人。
在这个数据集中,有很多重叠的标签。使用 softmax 进行类预测会假设每个框都只有一个类,但通常情况并非如此。
因此,YOLOv3 没有使用 softmax,而是对任何类使用独立的 Logistic classifiers 逻辑分类器。使用独立的逻辑分类器,可以同时将对象检测为女性和人。
因此在训练期间,作者使用binary cross-entropy(二元交叉熵 )*作为 loss function进行类预测,并且准确率不会下降。
2.3 Predictions Across Scales(跨尺度预测)
- 与预测最后一层输出的 YOLO 和 YOLO2 不同,YOLOv3 Feature Pyramid Network (FPN) 的方法,预测 3 个不同尺度的框,从而提高对不同大小物体进行检测,提升小物体的检测能力。
每个尺度的 feature map 会预测出3个 Anchor prior,而 Anchor prior 的大小则采用K-means进行聚类分析 (YOLOv3 延续了 YOLOv2 的作法,具体可以参考《YOLO超详细入门02 零基础看懂 图文详解(含代码及原文)》)。
YOLOv3 通过下采样32倍、16倍、8倍得到3个不同尺度的 feature map,例如输入416x416的图片,则会得到13x13 (416/32)、26x26 (416/16)、52x52 (416/8),这3个尺度的 feature map。
feature map对应Anchor prior
- 13x13 feature map (有最大的感受野) 用于检测大物体,所以用较大的Anchor prior (116x90), (156x198), (373x326)
- 26x26 feature map (中等的感受野) 用于检测中等大小的物体,所以用中等的Anchor prior (30x61), (62x45), (59x119)
- 52x52eature map (较小的感受野) 用于检测小物体,所以用较小的Anchor prior (10x13), (16x30), (33x23)
- YOLOv3 最显着的特点是它可以在三个不同的尺度上进行检测。 YOLO 是一个全卷积网络,其最终输出是通过在feature map(特征图)上应用 1 x 1 kernel生成的。在 YOLO v3 中,检测是通过在网络中三个不同位置的三个不同大小的特征图上应用 1 x 1 来完成的。
- 检测核的形状为1 x 1 x (B x (5 + C) )。这里 B 是特征图上一个单元格可以预测的边界框数量,“5”代表 4 个边界框属性和1个置信度,C 是类别数。在 COCO 上训练的 YOLO v3 中,B = 3 和 C = 80,因此kernel size为 1 x 1 x 255。此kernel生成的特征图与之前的特征图具有相同的高度和宽度,并且深度如上所述。
2.4 Loss Function(损失函数)
bounding box中心点坐标与宽高
- ( b x i 、 b y i ) (b_{xi}、b_{yi}) (bxi、byi)是ground truth的bounding box中心点坐标。 ( b x i ^ 、 b y i ^ ) (\widehat {b_{xi}}、\widehat {b_{yi}}) (bxi 、byi )是预测的bounding box中心点坐标。
- ( b w i 、 b h i ) (b_{wi}、b_{hi}) (bwi、bhi)是ground truth的bounding box宽高。 ( b w i ^ 、 b h i ^ ) (\widehat {b_{wi}}、\widehat {b_{hi}}) (bwi 、bhi )是预测的bounding box宽高。
- 1 i j o b j 1_{ij}^{obj} 1ijobj为第一个网络中第 j j j 个bounding box是否为正例,若是则输出1,否则为0。
- λ c o r d = 5 \lambda_{cord}=5 λcord=5,提高物体定位的权重,以提高定位能力。
bounding box物体confidence score
- 1 i j n o o b j 1_{ij}^{noobj} 1ijnoobj为第为第一个网络中第 j j j 个bounding box是否为负例,若是则输出1,否则为0。
- 如果是忽略样例(既不是正例也不是负例),则都输出0(即没有任何loss)。
- 有物体的系数为1,没有物体的系数 λ n o c o o r d = 0.5 \lambda_{nocoord}=0.5 λnocoord=0.5 ,使得模型专注于只有物体的识别,并降低找不到物体的情况。
三、YOLOv2 vs YOLOv3
3.1 gird size nad Anchor Box
YOLOv3 | YOLOv2 | |
---|---|---|
bounding box坐标与宽高 | 多乘了 ( 2 − w x h ) (2-wxh) (2−wxh)系数来缩小对大bounding box的权重,以及加大对小bounding boux的权重 | |
gird size | 13 x 13 , 26 x 26 , 52 x 52 | 13 x 13 |
Anchor Box个数 | 3 x 3 | 5 |
loss function | confidence score和class的loss function使用binary cross-entropy | 都使用MSE(Mean Squared Error) |
3.2 小物体检测
YOLOv2 采用 passthrough 结构来检测小物体特征,而 YOLOv3 采用3个不同尺度的feature map来进行检测。
3.3 YOLOv1,YOLOv2,YOLOv3输出
- YOLOv1 在 feature map (7x7) 的每一个 grid 中预测出 2个 bounding box 及分类概率值,每个 bounding box 预测出5个值。
- YOLOv2 在 feature map (13x13) 的每一个 grid 中预测出 5个 bounding box (对应5个 Anchor Box),每个bounding box 预测出5个值及分类概率值。
- YOLOv3 在3个 feature map的每一个 grid 中预测出 3个 bounding box (对应3个 Anchor prior),每个 bounding box 预测出5个值及分类概率值 ( YOLOv3 是使用 COCO 资料集有80类)。
四、Evalute(结果)
由下图表可以看到: 若采用COCO AP 做评估标准,YOLOv3 在处理608x608 图像速度可以达到 20FPS;若采用COCO mAP50 做评估标准 (不介意 bounding box 预测的准确性),YOLOv3 的表现达到57.9%,与 RetinaNet 的结果相近,并且速度快4 倍,在实现相同准确度下 YOLOv3 要显著地比其它检测方法快。
若不了解AP,AUC等知识,可以参考《目标检测基础(TP,recall,PR曲线,mAP,NMS》
ps:AP50 threshold 设定为固定的值为 0.5。