YOLOv3

YOLOv3的总体网络架构图 可根据官方代码中的yolov3.cfg进行一一对应,标号$0$是第一个[convolutional]

Darknet-53

和DarkNet-19一样,同样下采样32倍。但是darknet-19是通过最大池化来进行,一共有5次。而darknet-53是通过尺寸2,步长为2的卷积核来进行的,也是5次。darknet-19是不存在残差结构(resblock,从resnet上借鉴过来)的,和VGG是同类型的backbone(属于上一代CNN结构),而darknet-53是可以和resnet-152正面刚的backbone,并且FPS大幅提升,看下表:

Neck层

YOLO v3中的Neck层采用FPN(feature pyramid networks)的思想,会输出了3个不同尺度的特征,然后输入到YOLO Head头中进行预测。采用多尺度来对不同大小的目标进行检测。

  • 在YOLO v3的总体架构图中可以看出,Neck层输出的特征图空间尺寸为$13 \times 13$是第81层;

  • 然后它后退2层,然后将其2倍上采样。然后,YOLOv3将第61层网络输出的具有更高分辨率的特征图(尺寸为$26 \times 26$),并使用concat将其与上采样特征图合并。YOLOv3在合并图上应用卷积滤波器以进行第二组预测

  • 再次重复上一步骤,以使得到的特征图层具有良好的高级结构(语义)信息和目标位置的好的分辨率空间信息。

在YOLO v3中采用类似FPN的上采样和多尺度融合的做法(最后融合了3个尺度),在多个尺度的特征图上做检测,对于小目标的检测效果提升还是比较明显的。

Head头

为确定先验框priors,YOLOv3仍然应用k均值聚类。然后它预先选择9个聚类簇。对于COCO,锚定框的宽度和高度为$(10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90),(156×198),(373×326)$。这应该是按照输入图像的尺寸是$416×416$计算得到的。这9个priors根据它们的尺度分为3个不同的组。在检测目标时,给一个特定的特征图分配一个组。

YOLO v3输出了3个大小不同的特征图,从上到下分别对应深层、中层与浅层的特征。深层的特征图尺寸小,感受野大,有利于检测大尺度物体,而浅层的特征图则与之相反,更便于检测小尺度物体。每一个特征图上的一个点只需要预测3个先验框,YOLO v2中每个grid cell预测5个边界框,其实不然。因为YOLO v3采用了多尺度的特征融合,所以边界框的数量要比之前多很多,以输入图像为$416 \times 416$为例:

13×13+26×26+52×52)3>>13×13×513 \times 13 + 26 \times 26 + 52 \times 52)* 3 >> 13 \times 13 \times 5

YOLO v3的先验框要比YOLO v2产生的框更多。

如果使用coco数据集,其有80个类别,因此一个先验框需要80维的类别预测值、4个位置预测及1个置信度预测,3个预测框一共需要3×(80+5)=255维,也就是每一个特征图的通道数

类别预测(Class Prediction)

YOLO v3的另一个改进是使用了Logistic函数代替Softmax函数,以 处理类别的预测得分。原因在于,Softmax函数输出的多个类别预测之间会相互抑制,只能预测出一个类别,而Logistic分类器相互独立,可以实现多类别的预测。 实验证明,Softmax可以被多个独立的Logistic分类器取代,并且准确率不会下降,这样的设计可以实现物体的多标签分类,例如一个物体如果是Women时,同时也属于Person这个类别。 值得注意的是,Logistic类别预测方法在Mask RCNN中也被采用, 可以实现类别间的解耦。预测之后使用Binary的交叉熵函数可以进一步 求得类别损失。

边界框预测和代价函数计算 (Bounding box prediction & cost function calculation)

YOLOv3 使用逻辑回归Sigmoid预测每个边界框的置信度分数 YOLOv3改变了计算代价函数的方式。

  • 如果边界框先验(锚定框)与GT目标的IOU比其他先验框大,则相应的目标性得分应为1。

  • 对于重叠大于预定义阈值(默认值0.5)的其他先验框,不会产生任何代价。

  • 每个GT目标仅与一个先验边界框相关联。 如果没有分配先验边界框,则不会导致分类和定位损失,只会有目标性的置信度损失。

  • 正样本:与GT的 IOU最大的框

  • 负样本:与GT的 IOU<0.5的框

  • 忽略的样本:与GT的 IOU>0.5但不是最大的值

一些YOLO的代码库都是使用配置文件配置网络结构,先提供一种使用pytorch实现的YOLOv3的code

  • darknet53.py

  • yolo_fpn

  • yolo_head

  • loss

Last updated