yolov1/v2/v3学习总结

yolov1的文章建立了yolo整个的模型思路,后面出现的v2/v3/v4都是在v1基础上增加了当时流行的trick进行的修改。yolo属于一阶段的目标检测模型,与rcnn系列相比,牺牲了一定的精度,但是速度更快。

yolov1

首先介绍yolov1。yolo通过将全图作为模型输入,直接在卷积网络后面加分类层得到目标的位置和类别。这个思路是很简单直接的,会起作用主要在于很多实现细节。1. 如何针对整图进行区域划分,来预测目标位置?2. 如何基于区域设计损失函数,使得相应区域预测相应目标?

实现
  1. 首先将图像划分成7*7的网格,以网格为单位来预测目标位置。如果某个目标中心落在某网格中,那这个网格就负责预测这个目标,其余网格则不负责预测该目标。
  2. 假设图像输入为448448,经过卷积网络最后得到大小为771024的特征图,然后经过两个全连接层,假设一个网格负责预测2个回归框,预测类别20类,那么得到7730的特征图,其中30有20+25得到。20即为20个类别,2是指预测了两个回归框,5是指一个框的四个位置和一个置信度。可以看出来每一个网格都有其相应的2个回归框,且有其相应的类别预测。不是每个回归框都预测了20种类别,而是一个网格预测了20种类别。所以这也就导致了一个网格只能得到一种类别的问题。
  3. 位置预测:输出的是xywh,也就是中心坐标和宽高,其中xy和wh都归一化到0-1区间;
  4. 损失函数的设计:(1)公式第一部分:分别循环图中每个网格和每个网格生成的回归框,计算回归框的损失,其中红色圈出的参数是用来判断这个回归框是否需要参与损失,如果这个网格中根本不含目标或者网格不负责预测目标,那么这个位置回归是没有作用的,因此不需要参与损失计算;如果这个网格负责预测某个目标,我们知道该网格会对应得到两个回归框,但不是这两个回归框都参与计算,只取其中与目标iou最大的回归框进行计算;(2)第二部分:对那些需要参与位置损失的回归框,计算置信度损失,目的是使置信度尽量接近1(3)第三部分:对那些不需要参与位置损失的回归框,使其置信度尽量接近0。λ(noobj)设置为0.5,因为一张图中不需要参与位置损失的回归框较多,需要参与位置损失的回归框较少,如果保持两个损失权重相同的话,容易使置信度全部趋向于0,因此需要在这里进行一个权重平衡。(4)对每一个网格进行循环,计算每个网格的类别预测损失;这里同样需要判断这个网格是否是含目标的网格,如果不是则不需要计算类别损失。(5)需要注意的是,这里的wh的计算都开了根号,这是因为作者想要使小目标也得到比较准确的位置预测。相对于大目标来说,小目标的位置偏移对目标预测的影响比较大,从下面那张图可以看出来,在w比较小的时候,固定步长的移动对应的y的变化,比w较大时对应的y的变化要大,因此这里加了开根号的处理就是为了使小目标的位置预测在loss中占据更大的比重。
    在这里插入图片描述
    在这里插入图片描述
训练
  1. 预训练:在ImageNet 1000类的224*224的图像上预训练一个分类网络,网络是Figure3中的前20个卷积网络+average-pooling layer+ fully connected layer 。
  2. 训练检测网络:在分类网络基础上增加卷积和全连接层,随机初始化权重。检测要求细粒度的视觉信息,所以把网络输入也又224224变成448448。
测试
  1. 模型会得到每个网格的分类概率和回归框的置信度,这两个值相乘即得到该回归框对每一种类别的预测信息,整张图会得到772共98个值,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
缺点
  1. 对小物体效果不好;对互相靠的很近的物体效果不好;
  2. 由于损失函数的问题,定位误差是影响检测效果的主要原因;

yolov2

yolov2在v1基础上增加了一些改进策略,主要有:

  1. batch norm:在YOLOv2中,每个卷积层后面都添加了Batch Normalization层,并且不再使用droput。

  2. Anchor:在YOLOv1中,输入图片最终被划分为7*7网格,每个单元格预测2个边界框。YOLOv1最后采用的是全连接层直接对边界框进行预测,其中边界框的宽与高是相对整张图片大小的,而由于各个图片中存在不同尺度和长宽比(scales and ratios)的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的。YOLOv2借鉴了Faster R-CNN中RPN网络的先验框,YOLOv2移除了YOLOv1中的全连接层而采用了卷积和anchor boxes来预测边界框,每个位置的各个anchor box都单独预测一套分类概率值。

  3. anchor大小采用聚类来得到:在Faster R-CNN和SSD中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标。
    在这里插入图片描述

  4. 新的卷积网络:Darknet-19,最终采用全局平均池化做预测。
    在这里插入图片描述

  5. 位置预测:由于加入了anchor机制,所以不能沿用yolov1的位置预测方法。YOLOv2先是借鉴RPN网络,预测边界框相对先验框的位置偏移,但是由于这个偏移可以偏移到图像的任意位置,这导致模型的不稳定性,在训练时需要很长时间来预测出正确的offsets。所以,YOLOv2弃用了这种预测方式,改为预测边界框中心点相对于对应cell左上角位置的相对偏移值,为了将边界框中心点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度看做1)。

  6. 多尺度训练:由于YOLOv2模型中只有卷积层和池化层,所以YOLOv2的输入可以不限于416*416大小的图片。为了增强模型的鲁棒性,YOLOv2采用了多尺度输入训练策略,具体来说就是在训练过程中每间隔一定的iterations之后改变模型的输入图片大小。由于YOLOv2的下采样总步长为32,输入图片大小选择一系列为32倍数的值。

  7. 损失函数:yolov2的损失函数基本上延续了v1的思想,仍采用均方误差的形式进行计算。取目标中心所在位置的网格来负责预测该目标,每个网格会生成5个anchor,anchor的大小形状是根据之前聚类得到的,这时取形状与原始目标形状iou最大的anchor得到的回归框计算位置回归的损失以及分类损失;设定一个iou阈值,这个阈值用来判断某个回归框是否为背景框,将该回归框与所有目标计算iou,如果iou小于该阈值,则该回归框为背景框,所有的背景框的置信度都加入损失计算,目的是使其尽量接近0.
    总结来说,yolov2主要在1.网络结构;2.anchor机制;3.bn层这三个地方做了比较大的优化;

yolov3

yolov3是在v2基础上做的改进,主要有:

  1. 网络结构darknet53:借鉴了残差网络residual network的做法,在一些层之间设置了short-cut;
  2. 利用多尺度特征:借鉴fpn的思想,在第79/91/106层分别获得特征图,这些特征图具有不同的尺度。第79层的特征图将原图进行32倍的下采样,91层的特征图融合了上层特征,因此获得了更细腻的语义特征,第94层的特征图将原图进行了16倍的下采样,同样的,第106层特征图融合了更千层浅层特征,对原图进行了8倍下采样。因不同采用采样尺度的特征图用于预测不同大小的目标。这里延续了anchor的使用,在不同尺度的特征图上生成不同大小的anchor。anchor延续v2中的聚类机制来生成,在每种特征图上生成三个;在这里插入图片描述
  3. 分类由softmax改为logistic:用于支持多标签对象;
    总结:v3中更深的网络层次,以及多尺度检测,提升了mAP及小物体检测效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值