【算法】YOLOv1,v2,v3的区别

1.损失函数(各分量之间的系数)

损失函数:

《【算法】YOLOv1,v2,v3的区别》 image

三个版本损失函数系数详情:

versionscoordobjclassnoobj
yolov110.515
yolov25111
yolov3111gt相关
2.网络输出形式
  • v1: num_cell * num_cell*(5 * num_box+num_class )
    需要注意的是上述式子中5表示:当前 cell 所有 box 的四个坐标xywh + 当前 cell 所有 box 的confidence,以及当前 cell 所对应的一个 box 的类条件概率(这里当然也可以说是当前 cell 的类条件概率)。
  • v2,v3: num_cell * num_cell *( num_anchor * (num_class + 1 + 4))
    需要注意的是这里引入了anchor机制,和v1版本会有较大差别,但整体网络仍然是回归没有变。上述式子中1,4表示:当前cell预测num_anchor 个bounding box,然后每个bounding box预测5个值:tx,ty,tw,th和to(这里的to类似YOLOv1中的confidence),这里的tx,ty,tw,th和v1中的有点区别(当然前向都是一样的,我说的区别就是更新机制。)
    需要注意的是这是网络预测的输出,最终这几个输出都是要和标签一起根据损失函数的定义来计算loss,更新权重的。
    那么下面几个问题解释了对应的标签都是怎么得到的,因为给定的标签只有目标类别和目标框,需要通过这两个条件来通过一定的逻辑得到我们计算loss需要的标签。

按照损失行数的行数来说明loss需要的标签计算。
一:localization,坐标误差。(标签不用计算,直接从输入中获取)
二:含有object的box置信度误差。(标签需要计算)
三:不含有object的box置信度误差。(标签需要计算)
四:含有object的cell的那个“对应”box计算得到的类条件概率误差。(标签需要计算)

如何计算二,三两个标签,通过以下几个问题来回答~
问:什么是当前cell的所有box的confidence呢?
答:每一个box都会有一个confidence。
每一个box 的confidence计算公式:
Pr(Object)*IOUtruth/pred。
所以根据公式可知,如果当前cell中没有object,那么Pr(Object)=0,所以confidence=0,;如果当前cell中有object,那么Pr(Object)=0,所以confidence=IOUtruth/pred。
最后的confidece_label的标签是0和1,为0的有两种情况,第一就是上面所说的Pr(Object)=0,第二是IOUtruth/pred的阈值小于规定的值。而为1的就是IOUtruth/pred大于阈值。

如何计算四个标签,通过以下几个问题来回答~
问:那么为什么还要说是当前 cell 对应的 box 呢?
答:因为每一个cell在初始化的时候生成的初始化box是大于1个的,而最终参与类条件概率计算的时候只会用到一个 box,所以要说明对应的box。

问:那么怎么样从初始化的多个box中选出这个”对应”的box呢?
答:由于这多个box都是属于当前cell的,而每个cell都会负责小于等于一个目标(ground truth)。这多个初始化box与当前cell负责的ground truth计算IOU,那么拥有max_IOU的那个box就是而这个“对应”的box。因此这一个box就能够代表当前cell了。

问:那要是当前cell负责目标的个数为0,那怎么确定这个“对应”的box呢?
答:我的理解是当,当前cell负责的目标个数为0的时候,这个cell所有的box的confidence都=0,而且类条件概率也都是0。所以这个时候不需要知道这个“对应”的box是谁。

问:怎么确定当前cell是负责目标的,还是不负责目标的呢?
答:如果一个目标的ground truth的中心点坐标在这个cell中,那么这个cell就是包含这个目标,也就是说这个目标的预测就由该cell负责。

问:最后我得到了这个IOU最大的“对应”的box之后,怎么通过这个box计算我所需要的第四个标签呢?
答:这个标签其实就是判断一下当前cell负责的是哪一个object,那么对应的那个类概率就是1,其余都是0。所以。。。。。其实这个标签是直接可以通过类别和cell的位置来得到的,并不需要通过这个对应的box来得到。相当于每一个cell都包含一个类标签。当然和这个标签做loss的时候是要确定这个对应的box的。所以上述的解释对于理解还是有用的。

3.检测框初始化策略(anchor)

v1:随机暴力初始化
v2,v3:设置初始化anchor,在anchor基础上回归(而且这个anchor根据kmean算法进行聚类得到,这样使得初始化的anchor的比例和大小能够和当前的数据特征匹配。)

YOLOv1是利用全连接层直接预测bounding box的坐标,而YOLOv2借鉴了Faster R-CNN的思想,引入anchor。

YOLOv1将输入图像分成77的网格,如果每个cell预测两个box,因此一共只有98个box,但是在YOLOv2通过引入anchor boxes,预测的box数量超过了1千(以输出feature map大小为1313为例,每个cell有9个anchor box的话,一共就是13139=1521个)。

还有一个v1和v2,v3的差别,因为v2,v3有anchor,所以回归anchor坐标有自己的特点,具体查看这:anchor部分

4.yolov3做的一些改进

见csdn博客。

本人csdn博客地址:https://blog.csdn.net/qiu931110/
本人微信公众号:yuanCruise

《【算法】YOLOv1,v2,v3的区别》

    原文作者:yuanCruise
    原文地址: https://www.jianshu.com/p/7cc2e8a465e3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞