YOLO v3学习笔记

前言

前面学习了YOLO v1和v2,今天终于可以看完了YOLO v3论文,作者的第三篇YOLO论文可以说是写的非常随意,一些表达看得英语水平不是很高的我也是一脸懵逼。本来看完论文对YOLO v3的结构不是很清晰,作者也没有在文章中清楚地给出,不过后来看了一个博客的结构示意图(博主使用的网络可视化工具是:Netron),再结合先前看的基于pytorch实现的YOLOv3,对它的结构清晰了许多。
YOLO v3论文地址:https://arxiv.org/abs/1804.02767

YOLO v3

作者在YOLO v3上使用了比YOLO v2更深的网络结构作为特征提取,作者称他为:Darknet-53,虽然它比v2的Darknet-19层数更深、参数更多,所以它的检测速度没有v2那么快,但是据实验结果发现,它的检测速度还是能够达到real time 的要求的,而且检测精度比v2有了一定的提升。
相比v2,v3不仅对特征提取网络进一步的加深,而且通过上采样的操作,在网络中输出不同大小的特征图,这思想有点像特征金字塔,从而实现多尺度特征的提取。

Bounding Box Prediction

v3和v2一样,先使用聚类得到9个不同的先验anchor boxes,不过v3中这9个先验anchor boxes是分为三种不同的scale,分别对应不同的尺度,然后基于网络 的输出(t_x,t_y,t_w,t_h,t_o)和先验anchor boxes的宽和长、特征图上所在网格的左上角坐标,计算的得到真正的预测bounding boxes的坐标和长宽:
YOLO v3学习笔记_第1张图片

  • . 每个bounding boxes都是经过逻辑回归得到的,介于0和1之间,而且在训练过程中,只计算与训练样本ground truth boxes的IOU即交叉最大的bounding boxes的误差,对于IOU高于阈值而又不是最大的bounding boxes忽略处理。

  • . 在预测bounding boxes目标类别的时候不是使用softmax操作,作者发现它并不是必须的,而是分别使用独立的逻辑回归,在计算loss function的时候使用binary cross-entropy。这么做的好处是避免了使用softmax时默认的目标类别相互排斥的情况,作者举了个例子,比如woman和person并不是两个相互排斥的类别,而使用后者的做法符合多标签的实际情况。

YOLO v3结构

YOLO v3学习笔记_第2张图片

  1. backbone
    YOLO v3学习笔记_第3张图片
    在v3结构里面,是没有池化层和全连接层的。前向传播过程中,张量的尺寸变换是通过改变卷积核的步长来实现的,比如stride=(2, 2),这就等于将图像边长缩小了一半(即面积缩小到原来的1/4)。在yolo_v2中,要经历5次缩小,会将特征图缩小到原输入尺寸的1/(2^5)即1/32。输入为416x416,则输出为13x13(416/32=13)。yolo_v3也和v2一样,backbone都会将输出特征图缩小到输入的1/32。yolo_v2中对于前向过程中张量尺寸变换,都是通过最大池化来进行,一共有5次。而v3是通过卷积核增大步长来进行,也是5次。
    v3用上采样的方法来实现多尺度的feature map,YOLO v3结构图中concat连接的两个张量是具有一样的尺度的,作者没有像SSD那样直接采用backbone中间层的处理结果作为feature map的输出,而是和后面网络层的上采样结果进行一个concat拼接操作,通过一定的卷积层,输出不同尺度的feature map。

总结

看完了YOLO 系列三个版本的算法,后面再结合代码进行更近一步的了解。

参考链接

https://blog.csdn.net/leviopku/article/details/82660381

你可能感兴趣的:(cv,object,detection,cv)