YOLO系列,持续更新。。。。

YOLO系列

论文

YOLOV1

YOLOV1 + YOLOV2 只会简单说明原理(太久远。。。。)

论文思想

  1. 将一幅图像分成 S*S 个网格(grid cell) 如果某个object的中心落在这个网格中,则这个网格就负责预测这个object

  2. 每个网格要预测Bbounding box 每个bounding box 除了要预测位置**(x,y,w,h)外 还要附带预测一个condfidence**值。

    每个网格还要预测C个类别的分数。

    Tips: x,y 是在网格中的 是相对坐标 ; w,h 坐标轴是整幅图像

    confidence有两种情况,分别是 “0”和“1”,当我们的网格中确实存在目标时,Pr(Object)就是等于 “1” 的,所以我们预测的confidence就直接等于IOU,如果网格中没有目标落在里面,那么Pr(Object)就是等于“0”的,所以confidence就是等于0的。

    其实我们完全可以把confidence理解为IOU,但是这里的IOU是我们预测的bounding box与 真实的bounding box的交并比

PASCAL VOCclasses= 20 use S = 7 B= 2 C= 20 则预测为7 * 7 * 30

image-20220720211915029

网格结构

网络结构也很简单

image-20220721170251344

损失函数LOSS

主要是误差平方和的形式

image-20220720213727872

其中bounding box 中的损失计算中 w,h 是采用先平方根再相减的形式相当于是y = 根号x,这是为了平衡大小目标的检测效果。如果没有根号那就是y = x 即意义是对于同样的x偏移误差造成的y误差也是一样的。但是目标的大小是有差别的,试想,偏移同样的距离小目标的检测效果可能很差但对于大目标而言可能很好。

y = 根号x 随着 x的增大,同样的x误差,对应的y误差是在减小的

image-20220720214308808
  1. 预测框的中心点(x,y) 。其中 l为控制函数,在标签中包含物体的那些格点处,该值为 1 ;若格点不含有物体,该值为 0。也就是只对那些有真实物体所属的格点进行损失计算,若该格点不包含物体,那么预测数值不对损失函数造成影响**(x,y)**数值与标签用简单的平方和误差。
  2. 预测框的宽高(w,h)l的含义一样,也是使得只有真实物体所属的格点才会造成损失。这里对**(w,h)在损失函数中的处理分别取了根号**,原因在于,如果不取根号,损失函数往往更倾向于调整尺寸比较大的预测框。例如,20个像素点的偏差,对于800 * 600的预测框几乎没有影响,此时的IOU数值还是很大,但是对于30*40的预测框影响就很大。取根号是为了尽可能的消除大尺寸框与小尺寸框之间的差异。
  3. 第三行与第四行,都是预测框的置信度C。当该格点不含有物体时,该置信度的标签为0;若含有物体时,该置信度的标签为预测框与真实物体框的IOU数值(IOU计算公式为:两个框交集的面积除以并集的面积)。
  4. 第五行为物体类别概率P,对应的类别位置,该标签数值为1,其余位置为0,与分类网络相同。
  5. 对于λ Yolo面临的物体检测问题,是一个典型的类别数目不均衡的问题。其中49个格点,含有物体的格点往往只有3、4个,其余全是不含有物体的格点。此时如果不采取点措施,那么物体检测的mAP不会太高,因为模型更倾向于不含有物体的格点。λ 的作用,就是让含有物体的格点,在损失函数中的权重更大,让模型更加“重视”含有物体的格点所造成的损失。在论文中,λcoord, λnoobj 的取值分别为5与0.5
  • 一些技巧
  1. 回归offset代替直接回归坐标

We parametrize the bounding box x and y coordinates to be offsets of a particular grid cell location so they are also bounded between 0 and 1

(x,y) 不直接回归中心点坐标数值,而是回归相对于格点左上角坐标的位移值。例如,第一个格点中物体坐标为 (2.3,3.6),另一个格点中的物体坐标为**(5.4,6.3),这四个数值让神经网络暴力回归,有一定难度。所以这里的offset是指,既然格点已知,那么物体中心点的坐标一定在格点正方形里,相对于格点左上角的位移值一定在区间(0,1)**与 **(0.4,0.3)会更加容易,在使用时,加上格点左上角坐标(2,3),(5,6)**即可。

  1. 同一格点的不同预测框有不同作用

At training time we only want one bounding box predictor to be responsible for each object. We assign one predictor to be “responsible” for predicting an object based on which prediction has the highest current IOU with the ground truth. This leads to specialization between the bounding box predictors. Each predictor gets better at predicting certain sizes, aspect ratios, or classes of object, improving overall recall.

前文中提到,每个格点预测两个或多个矩形框。此时假设每个格点预测两个矩形框。那么在训练时,见到一个真实物体,我们是希望两个框都去逼近这个物体的真实矩形框,还是只用一个去逼近?或许通常来想,让两个人一起去做同一件事,比一个人做一件事成功率要高,所以可能会让两个框都去逼近这个真实物体。但是作者没有这样做,在损失函数计算中,只对和真实物体最接近的框计算损失,其余框不进行修正。这样操作之后作者发现,一个格点的两个框在尺寸、长宽比、或者某些类别上逐渐有所分工,总体的召回率有所提升。

  1. 使用非极大抑制生成预测框

However, some large objects or objects near the border of multiple cells can be well localized by multiple cells. Non-maximal suppression can be used to fix these multiple detections. While not critical to performance as it is for R-CNN or DPM, non-maximal suppression adds 2 - 3% in mAP.

通常来说,在预测的时候,格点与格点并不会冲突,但是在预测一些大物体或者邻近物体时,会有多个格点预测了同一个物体。此时采用非极大抑制技巧,过滤掉一些重叠的矩形框。但是mAP提升并没有显著提升。(非极大抑制,物体检测的老套路,这里不再赘述)

  1. 推理时将p * c 作为输出置信度
    在这里插入图片描述

在推理时,使用物体的类别预测最大值 p乘以 预测框的最大值 c,作为输出预测物体的置信度。这样也可以过滤掉一些大部分重叠的矩形框。输出检测物体的置信度,同时考虑了矩形框与类别,满足阈值的输出更加可信。

Yolo v1与其他算法比较

与其他算法比较的结论照搬论文,如下性能的硬件环境都是GPU Titan X。

image-20220721170402545

yolo算法性能比较

backbone同为VGG-16,Yolo比Faster R-CNN少了将近7点mAP,但是速度变为三倍,Fast Yolo和Yolo相比,少11点mAP,但是速度可以达到155张图片每秒。后续的Yolo v3中,准确率和速度综合再一次提升,所以v1的性能不再过多分析。

image-20220721170525649

首先给出图中各个单词的含义:

• Correct: correct class and IOU > .5
• Localization: correct class, .1 < IOU < .5
• Similar: class is similar, IOU > .1
• Other: class is wrong, IOU > .1
• Background: IOU < .1 for any object

其中,Yolo的Localization错误率更高,直接对位置进行回归,确实不如滑窗式的检测方式准确率高。但是Yolo对于背景的误检率更低,由于Yolo在推理时,可以“看到”整张图片,所以能够更好的区分背景与待测物体。作者提到Yolo对于小物体检测效果欠佳,不过在v2与v3中都做了不少改进。

问题:

  1. 小目标性能差(因为分grid cell 每个grid cell 两个bounding box 预测又是同类的,相当于分辨率有限,每个格点只能输出一个预测结果,所以该算法最大的不足,就是对一些邻近小物体的识别效果不是太好)

  2. 如果有新的物体比例,效果也是不好的

    原因就是定位不准(没有faster RCNN anchor机制)

YOLOV2

YOLOV2中的尝试

  • Batch Normalization (批归一化 加快收敛,正则化,2%mAp的提升,丢掉dropout层)

  • High Resolutiuon Classifier**(分类网络高分辨率预训练 由YOLOV1输入图像224 变大到 448 4%mAp的提升)**

    在Yolov1中,网络的backbone部分会在ImageNet数据集上进行预训练,训练时网络输入图像的分辨率为224*224。在v2中,将分类网络在输入图片分辨率为448 * 448的ImageNet数据集上训练10个epoch,再使用检测数据集(例如coco)进行微调。高分辨率预训练使mAP提高了大约 4%。

  • Convolution With Anchor Boxes (Anchor Box 替换全连接层 w/o anchor 69.5mAP,81%recall; Anchor 69.2mAP 88%recall,意味模型的提升空间很大)

    v1时提到,每个格点预测两个矩形框,在计算loss时,只让与ground truth最接近的框产生loss数值,而另一个框不做修正。这样规定之后,作者发现两个框在物体的大小、长宽比、类别上逐渐有了分工。在v2中,神经网络不对预测矩形框的宽高的绝对值进行预测,而是预测与Anchor框的偏差(offset),每个格点指定n个Anchor框。在训练时,最接近ground truth的框产生loss,其余框不产生loss。在引入Anchor Box操作后,mAP由69.5下降至69.2,原因在于,每个格点预测的物体变多之后,召回率大幅上升,准确率有所下降,总体mAP略有下降。

    v2中移除了v1最后的两层全连接层,全连接层计算量大,耗时久。文中没有详细描述全连接层的替换方案,这里笔者猜测是利用1*1的卷积层代替(欢迎指正),具体的网络结构原文中没有提及,官方代码也被yolo v3替代了。v2主要是各种trick引入后的效果验证,建议不必纠结于v2的网络结构

  • Dimention Clusters ( 使用k-means聚类的方法选择不同尺寸的anchors,为了适应不同数据集中不同目标的大小差异性,区别于faster RCNN 中的9个 )

    Faster R-CNN中的九个Anchor Box的宽高是事先设定好的比例大小,一共设定三个面积大小的矩形框,每个矩形框有三个宽高比:1:1,2:1,1:2,总共九个框。而在v2中,Anchor Box的宽高不经过人为获得,而是将训练数据集中的矩形框全部拿出来,用kmeans聚类得到先验框的宽和高。例如使用5个Anchor Box,那么kmeans聚类的类别中心个数设置为5。加入了聚类操作之后,引入Anchor Box之后,mAP上升。

    需要强调的是,聚类必须要定义聚类点(矩形框 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ega9fFSs-1658465104333)(https://www.zhihu.com/equation?tex=(w%2Ch)]))之间的距离函数,文中使用如下函数:

    使用(1-IOU)数值作为两个矩形框的的距离函数

  • Direct Location Prediction (绝对位置预测 对预测的坐标进行限制,使其在一个grid cell中移动)

    Yolo中的位置预测方法:就是相对于左上角的格点坐标预测偏移量。这里的Direct具体含义,应该是和其他算法框架对比后得到的。比如其他流行的位置预测公式如下

    image-20220721175826188

    神经网络预测 tx,ty.tx,ty 又需要与先验框的宽高相乘才能得到相较于xa,ya的位置偏移值,在v2中,位置预测公式如下:

    image-20220721180016470

Yolo的天然优势,就是格点的坐标可以作为参照点。此时tx,ty通过一个激活函数(sigmoid),直接产生偏移位置数值,与矩形框的宽高独立开,变得更加直接

  • Fine-Grained Features细粒度特征 结合更底层的信息,图像的细节更多,对于小目标更好,通过passthrough layer 将底层的26 * 26 * 512 融合(concate) 13 * 13 * 1024 模型mAP +1%)

    image-20220721172303632

    416*416 图片输入绘制网络结构(DarkNet-19)

    image-20220721172416197
  • Multi-Scale Training(多尺寸图片训练,增加鲁棒性,将图片缩放到不同尺寸,每迭代10次,就通过缩放因子随机调整输入图像尺寸)

    Yolo v2中只有卷积层与池化层,所以对于网络的输入大小,并没有限制,整个网络的降采样倍数为32,只要输入的特征图尺寸为32的倍数即可,如果网络中有全连接层,就不是这样了。所以Yolo v2可以使用不同尺寸的输入图片训练。

    作者使用的训练方法是,在每10个batch之后,就将图片resize成{320, 352, …, 608}中的一种。不同的输入,最后产生的格点数不同,比如输入图片是320 * 320,那么输出格点是10 * 10,如果每个格点的先验框个数设置为5,那么总共输出500个预测结果;如果输入图片大小是608 * 608,输出格点就是19*19,共1805个预测结果。

    在引入了多尺寸训练方法后,迫使卷积核学习不同比例大小尺寸的特征。当输入设置为544 * 544甚至更大,Yolo v2的mAP已经超过了其他的物体检测算法

    image-20220721173345284

其中 缩放因子 factor=32 (以输入图像416 * 416 为例,输出特征图为13 * 13 ,缩放因子:416 / 13 = 32,比如输入图像大小320 那么输出特征图就为 320 / 32 = 10,352 / 32 = 11,最大 608 / 32 = 19)

yolov2 与 其他算法的比较

  • Faster——Darknet-19

v2中作者提出了新的分类网络架构——Darknet-19,该架构的网络参数较VGG-16更少,在ImageNet上,仍然可以达到top-1 72.9%以及top-5 91.2%的精度

  • 精度与性能

    image-20220721180652578
image-20220721173547242
Yolo v2精度速度对比(on PASCAL VOC)

YOLOV3

Darknet-53网络架构

  • backbone: Darknet-53

    这里的Residual并不是接着两个Convolutionnal再接Residual; 就是单纯指整个方块 是Residual块

    image-20220721192209824 image-20220721193704743

    这个网络主要是由一系列的1x1和3x3的卷积层组成(每个卷积层后都会跟一个BN层和一个LeakyReLU)层,作者说因为网络中有53个convolutional layers,所以叫做Darknet-53(2 + 12 + 1 + 22 + 1 + 82 + 1 + 82 + 1 + 4*2 + 1 = 53 按照顺序数,最后的Connected是全连接层也算卷积层,一共53个)。下图就是Darknet-53的结构图,在右侧标注了一些信息方便理解。(卷积的strides默认为(1,1),padding默认为same,当strides为(2,2)时padding为valid)

相比yolov2的 Darknet-19, Darknet-53 加深网络层数,引入Residual. 发现这里没有Pooling层(有说法是 卷积层是可学习的 Pooling层并不是 全部卷积 相当于减少了损失)。原文中Darknet与其他网络的对比:

image-20220721192457887

tips: Top-1代表预测准确率 ;Top-5代表预测概率最大的5个中有正确即为正确的概率

YOLOV3模型结构

作者在论文中提到利用三个特征层进行边框的预测,具体在哪三层我感觉作者在论文中表述的并不清楚(例如文中有“添加几个卷积层”这样的表述)。 注意:原Darknet53中的尺寸是在图片分类训练集上训练的,所以输入的图像尺寸是256x256,下图是以YOLO v3 416模型进行绘制的,所以输入的尺寸是416x416,预测的三个特征层大小分别是52,26,13(52 的融合包含更多细节,用来预测小目标效果好)

image-20220721195202129

注意Convolutional是指Conv2d+BN+LeakyReLU,和Darknet53图中的一样,而生成预测结果的最后三层都只是Conv2d。

目标边界框的预测

YOLOv3网络在三个特征图中分别通过**( 4 + 1 + c ) × k**个大小为1 × 1 的卷积核进行预测,k为预设边界框(bounding box prior)的个数(在每个预测特征层中k默认取3),c为预测目标的类别数,其中:

4k个参数负责预测目标边界框的偏移量,

k个参数负责预测目标边界框内包含目标的概率,

ck个参数负责预测这k个预设边界框对应c个目标类别的概率。

下图展示了目标边界框的回归过程。图中虚线矩形框为Anchor模板(这里只用看(pw,ph)信息),实线矩形框为通过网络预测的偏移量(相对Grid Cell的左上角)计算得到的预测边界框。其中:

**(cx,cy)**为对应Grid Cell的左上角坐标,

**(pw,ph)**为Anchor模板映射在特征层上的宽和高,

**(tx,ty,tw,th)**分别为网络预测的边界框中心偏移量(tx,ty)以及宽高缩放因子(tw,th),

**(bx,by,bw,bh)**为最终预测的目标边界框,

从(tx,ty,tw,th)转换到(bx,by,bw,bh)的公式如图右侧所示,其中σ(x)函数是sigmoid函数其目的是将预测偏移量缩放到0到1之间(这样能够将每个Grid Cell中预测的边界框的中心坐标限制在当前cell当中,作者说这样能够加快网络收敛)

image-20220721201902294

下图给出了三个预测层的特征图大小以及每个特征图上预设边界框的尺寸(这些预设边界框尺寸都是作者根据COCO数据集聚类得到的):

img

正负样本匹配

**原论文中:**针对每一个ground truth 分配一个bounding box prior正样本。分配原则就是与GT重合度最高的bounding box prior为正样本;如果bounding box prior与GT重合的不是最大但是超过摸一个阈值(如0.5)既不属于正样本也不属于负样本直接丢弃;如果bounding box prior不是正样本 ,他是没有定位损失也没有类别损失,只有confidence score.

损失函数

image-20220721204914244

目标置信度损失
image-20220721205333297
目标类别损失

目标类别损失同样采用的是二值交叉熵损失(采用二值交叉熵损失的原因是,作者认为同一目标可同时归为多类,比如猫可归为猫类以及动物类,这样能够应对更加复杂的场景),注意论文中作者说了只有正样本才有目标类别损失。其中O i j ∈ { 0 , 1 }表示预测目标边界框i中是否真实存在第j类目标,0表示不存在,1表示存在。C i j ^ \hat表示网络预测目标边界框i内存在第j类目标的Sigmoid概率(将预测值C i j 通过sigmoid函数得到)

image-20220721205429163
import torch
import numpy as np

## pytorch 自带二值交叉熵损失
loss  = torch.nn.BCELoss(reduction='none') # reduction = 'none'  取消算均值的操作  这里到时候只会 返回均值 0.5784

## 每个目标的概率
po = [[0.1,0.8,0.9],[0.2,0.7,0.8]]
p = torch.tensor(po,requires_grad=True)

## 两个目标的真实标签 相当于这两个目标是同一个东西
go = [[0.,0.,1.],[0.,0.,1.]]
g = torch.tensor(go)

l = loss(input = p,target = g)
print(np.round(l.detach().numpy(),5))

# 自己理解的损失
def bce(c,o):
    return np.round(-(o*np.log(c) + (1 - o)*np.log(1 -c)),5)

pn = np.array(po)
gn = np.array(go)
print(bce(pn,gn))

'''
output:
[[0.10536 1.60944 0.10536]
 [0.22314 1.20397 0.22314]]
[[0.10536 1.60944 0.10536]
 [0.22314 1.20397 0.22314]]
'''
定位损失

目标定位损失采用的是Sum of Squared Error Loss,注意只有正样本才有目标定位损失。对应原论文中的图

image-20220721211216277

其中(tx,ty)是网络预测的关于中心坐标的偏移参数,(tw,th)是网络预测的关于目标宽高的缩放因子,(cx,cy)是对应Grid Cell的左上角坐标,(pw,ph)代表对应Anchor模板的宽度和高度,(gx,gy,gw,gh)分别代表GT Boxes中心点的坐标x, y以及宽度和高度(映射在Grid网格中的)。公式中关于中心点偏移的误差计算可能和论文中略有不同

推荐大神:霹雳吧啦Wz

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值