YOLOv3网络学习笔记-萤火
作者直接借用RetinaNet的插图。。。
YOLOv3网络学习笔记-萤火

0x00 The Deal

1. Bounding Box Prediction

  • YOLOv3预测每个bbox的objectness score改为用逻辑回归(sigmoid)
  • 有9个anchor(3个尺度各3各),与gt box的IOU最大的那个anchor box负责拟合该gt box,且置信度为1
    • YOLOv1和v2中,置信度都为预测框与gt box 的IOU,而v3改为了二分类。预测框会分为3类:
      • IOU最大的那个直接为1,即为正样本。正样本会对分类和定位都做出贡献
      • 会有有一个阈值,比如0.5,大于阈值但不是最大IOU的那个都会被忽略
      • 小于上面那个阈值的那些预测框的置信度设为0,为负样本。负样本只对置信度学习做出贡献
      • 即:最好的作为正样本,小于0.5的作为负样本,其他忽略)
    • 每个gt box只会分配一个anchor box(预测框)来进行预测
    • 用IOU作为置信度标签有何不好?
      • 假如很多预测框与gt box的IOU最高只有0.7(最好的学生只有70分,取其中得其下),这样模型就学不到好的效果,如果直接把置信度设为1,就是告诉模型这就是正样本,要好好学习
      • COCO中的小目标,IOU对像素偏移很敏感,无法有效学习

2. Class Prediction

  • YOLOv3对每个预测框使用多类别分类标签
  • 不使用softmax预测分类标签(所有概率加起来为1,各个类别是互斥的)
  • 而是每个预测框的每个类别逐一用逻辑回归输出概率(每个类别输出的概率都为0到1之间,可以有多个类别是高概率,不是互斥的)
  • 在训练过程中,对于类别预测,我们使用二分类交叉熵损失函数
  • 这样就可以用于谷歌Open Image Dataset这样多标签的数据集(例如一个对象的标签既是女人又是人)

3. Predictions Across Scales

多尺度目标检测(网络拓扑结构)

  • YOLOv3在3种不同的尺度上进行预测
  • 受到FPN(特征金字塔网络)的启发
  • 获得3个feature map,每个feature map都有255个通道
    • 255个通道:每个grid cell 有3个anchor,每个anchor有85个数(85:4+1+80)
      • 4:x、y、w、h
      • 1:objectness score
      • 80:类别的条件概率
YOLOv3网络学习笔记-萤火
  • 13×13的经过2倍上采样后和26×26的沿着通道方向进行拼接;同理26×26的经过2倍上采样和52×52拼接
  • 这样既融合了深层抽象特化语义信息,又结合了浅层细粒度像素结构信息
YOLOv3网络学习笔记-萤火
  • 依然是对数据集做k-means聚类来产生anchor,总共产生9个anchor,每个尺度各分配3个anchor

4. Feature Extractor

特征提取backbone骨干网络:Darknet-53

  • 混合了Darknet19和ResNet
  • 采用了连续的3×3和1×1卷积层和shortcut短路连接
  • 总共有52个卷积层+1个全连接层
  • 用步长为2的卷积层做下采样,不使用池化了
  • 在训练结束后会去掉全局平均池化层和全连接层,变成一个全卷积网络
YOLOv3网络学习笔记-萤火

0x01 How We Do

  • 在IOU阈值为0.5的指标下,YOLOv3的表现很不错
  • 但是如果IOU阈值调大,YOLOv3的表现就变差了,它的精确定位性能仍然较差
  • 对小目标/密集目标的改进:
    • grid cell个数增加(可以兼容任意尺寸的图片大小输入,但需要是32的整数倍)
    • anchor机制
    • 多尺度预测(FPN)
    • 损失函数惩罚小框项
    • 网络结构(backbone跨层连接)

0x02 What This All Means

  • diss了mAP.5-.95的不科学的地方:
    • 人很难区分IOU的微小差异,一昧地追求高AP指标不合理
    • 人类视觉对类别敏感,对定位不敏感

0x03 损失函数

YOLOv3网络学习笔记-萤火
  • 正样本对定位、置信度、类别的损失函数都有贡献
  • 负样本只对置信度损失函数有贡献
YOLOv3网络学习笔记-萤火
YOLOv3网络学习笔记-萤火
YOLOv3网络学习笔记-萤火