yolov1 - yolov4 深度理解

持续更新中。。。。

文章目录

  • 一、yolov1
    • 1. YOLOv1的核心思想
    • 2. YOLO1的实现方法
    • 3. 目标函数(x,y,w,h,confidence,classes)详解
    • 4. yolov1损失函数
    • 5. yolov1 总结
  • 目标检测的各个组成部分
  • 七、问题:

一、yolov1

1. YOLOv1的核心思想

  • YOLOv1的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别(x,y,w,h,class)。那其他的wanglu哦输出是什么

2. YOLO1的实现方法

  • 将一幅图像分成SxS个网格(grid cell),之后的输出是以单元格为单位进行的,如果某个object的中心落在这个小网格中,则这个小网格就负责预测这个object,也就是在训练中,这个小网格的损失计算是以有物体进行计算的(yolov1中S * S 取值为7 * 7)实际训练中,中心点落在哪个小网格中,是怎么计算的?

  • 每个网格要预测B个bounding box,每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。 (yolov1中B 取值为2)
    这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准(score)两重信息,其值是这样计算的:
    yolov1 - yolov4 深度理解_第1张图片

  • 其中如果有object落在一个grid cell里,Pr(Object)第一项取1,否则取0。(无目标时取0,那此处confidence的取值为0,如果整张图片都没有目标,那还可以训练?loss中xywh没有是否有目标这一项要求,是不是只计算xywh即可,不用进行confidence的loss计算)。 第二项是预测的bounding box和实际的groundtruth之间的IoU值。

  • 每个bounding box要预测(x, y, w, h, confidence)共5个值,每个网格还要预测一个类别信息,记为C类。则SxS个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是S x S x (5*B+C)的一个tensor。
    注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。也就是每个网格grid,只能预测1个类别,每个类别预测2个box。
    此处暴露出了yolov1的问题,如果一个grid中包含了多种类别的物体,那么yolov1是无法进行处理的,只能选择1个类别进行处理。

3. 目标函数(x,y,w,h,confidence,classes)详解

首先看一下每个单元格预测的B个( x , y , w , h , c o n f i d e n c e ) 的向量和C的条件概率中,每个参数的含义(假设图片宽为{wi}高为{hi},将图片分为S×S):
yolov1 - yolov4 深度理解_第2张图片
1.(x,y)是bbox的中心相对于单元格的offset
对于下图中蓝色框的那个单元格(坐标为(Xcol=1,Yrow=4)),假设它预测的输出是红色框的bbox,设bbox的中心坐标为(Xc,Yc),那么最终预测出来的(x,y)是经过归一化(大于0 小于1)处理的 表示的是中心相对于网格的offset,计算公式如下:

在这里插入图片描述
举例:
S=7, wi = 700 ,hi = 700,xc = 110, yc = 420, xcol = 1, ycol = 4
则: x = 110/700 * 7 - 1 = 0.1 y = 420/700 * 7 -4 = 0.2

2.(w,h)是bbox相对于整个图片的比例
预测的bbox的宽高为wb,hb,(w,h)表示的是bbox的是相对于整张图片的占比,计算公式如下:
在这里插入图片描述

3.confidence

这个置信度是由两部分组成,一是格子内是否有目标,二是bbox的准确度。定义置信度为
在这里插入图片描述

其中若bounding box包含物体,则在这里插入图片描述


否则在这里插入图片描述


IOU(intersection over union)为预测bounding box与物体真实区域的交集面积(以像素为单位,用真实区域的像素面积归一化到[0,1]区间)。

4.C类的条件概率
条件概率定义为在这里插入图片描述
,表示该单元格存在物体且属于第i类的概率。

测试的时候每个单元格预测最终输出的概率定义为,如下两图所示(两幅图不一样,代表一个框会输出B列概率值)
在这里插入图片描述
预测时,IOU中的truth是如何取值的????,没有真实框,只有预测框
yolov1 - yolov4 深度理解_第3张图片
yolov1 - yolov4 深度理解_第4张图片
最后将(S×S)×B×20 列的结果送入NMS,最后即可得到最终的输出框结果。

4. yolov1损失函数

​ YOLO全部使用了均方和误差作为loss函数.由三部分组成:坐标误差、IOU误差和分类误差。损失函数的设计目标就是让坐标$(x,y,w,h),confidence,classification $这个三个方面达到很好的平衡。

yolo的损失函数并不是简单的进行均方差求和,而是对需要求误差的某些值进行了相应的变换,下面详细介绍,公式如下:
yolov1 - yolov4 深度理解_第5张图片

  1. 位置相关误差(坐标)与分类误差对网络loss的贡献值是不同的,这里更重视8维的坐标预测,给这些损失前面赋予更大的loss weight,因此YOLO在计算loss时,使用在这里插入图片描述
    修正coordError。

  2. 在计算IOU误差时,包含物体的grid与不包含物体的grid,二者的IOU误差对网络loss的贡献值是不同的。(注此处的‘包含’是指存在一个物体,它的中心坐标落入到格子内)。

    • 若有物体落入边界框中,则计算预测边界框含有物体的置信度Ci和真实物体与边界框IoUCi_hat的损失,我们希望两差值越小损失越低。
    • 若没有任何物体中心落入边界框中,则Ci_object为0,此时我们希望预测含有物体的置信度Ci越小越好。然而,大部分边界框都没有物体,积少成多,造成loss的第3部分与第4部分的不平衡,为解决这个问题,在loss的三部分使用在这里插入图片描述
      修正iouError。
  3. 对于相等的误差值,大物体误差对检测的影响应小于小物体误差对检测的影响。这是因为,相同的位置偏差占大物体的比例远小于同等偏差占小物体的比例。YOLO将物体大小的信息项(w和h)进行求平方根来改进这个问题。(注:这个方法并不能完全解决这个问题)

    • 对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏相同的尺寸对IOU的影响更大。而sum-square error loss中对同样的偏移loss是一样。
    • 为了缓和这个问题,作者用了一个巧妙的办法,就是将box的width和height取平方根代替原本的height和width。 如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。

yolov1 - yolov4 深度理解_第6张图片
例如,一个同样将一个100x100的目标与一个10x10的目标都预测大了10个像素,预测框为110 x 110与20 x 20。显然第一种情况我们还可以接受,但第二种情况相当于把边界框预测大了一倍,但如果不使用根号函数,那么损失相同,都为200。但把宽高都增加根号时:
在这里插入图片描述
在这里插入图片描述
显然,对小框预测偏差10个像素带来了更高的损失。通过增加根号,使得预测相同偏差与更小的框产生更大的损失。但根据YOLOv2的实验证明,还有更好的方法解决这个问题。

5. yolov1 总结

  1. 训练过程:
    (1)通过模型的参数进行前向传播(计算),得到7 × 7 × 2 = 98 个框
    (2)计算这98个框的loss,也就是代上图中的公式,把有无物体等条件代入公式中,进行loss计算
    (3)反向传播,调节模型参数
    (4)周而复始

  2. 预测过程:
    (1)模型计算,得到98个框,然后在传入到NMS,然后输出。

  3. 每个grid有30维,这30维中,8维是回归box的坐标,2维是box的confidence,还有20维是类别。其中坐标的x,y用对应网格的offset归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。

  4. 输入尺寸固定:由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。其它分辨率需要缩放成改分辨率,实际使用时,也得进行resize,耗时。

  5. 占比较小的目标检测效果不好.虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。

目标检测的各个组成部分

		1. Input
		2. Backbone
		3. Neek
		4. Head
		共包含上面4个部分,其中可以替换的结构如下图所示:
		说明:Dense Prediction:标注出图像中每个像素点的对象类别
				    	Sparse Prediction:稀疏预测

yolov1 - yolov4 深度理解_第7张图片

七、问题:

  1. 什么情况下需要使用nms?
    答:图片中有多个同类目标时。
    同类:最大抑制只能是抑制同一类的框
    多个:当图片中只有1个目标时,直接输出score最高的即可,不需要nms。

  2. yolov1,在构建目标函数时,是如何解决一个图片中有多个目标的问题(也就是有多个cxywh)的?
    答:yolo head的结构。
    进行7 * 7 13 * 13 26 * 26 52 * 52等划分,构建出多个区域,然后进行检测。将整张图片划分为7 × 7 的小方格,也就是一张图片上可以有49个目标。为了防止划分出来的小方格中有多个目标,可以进行52*52的细致划分,以将目标划分到不同的小方格中。形式如下图:
    yolov1 - yolov4 深度理解_第8张图片

  3. yolov1 目标函数是如何解决多类问题的?
    答:yolo head的构建 7730(以voc数据集的种类进行举例),
    77:将图片划分为49个小方格
    30:[c1,x1,y1,w1,h1,c2,x2,y2,w2,h2,onehot],其中onehot是20个类,也就是每个划分的小方格可以有两个框,但因为后面跟着一个onehot,所以这两个框画的都是1个种类的目标。后面再通过NMS去掉重复的框,留下最好的。也就是7
    7的头,共输出 7 × 7 × 2 = 98个框。

  4. yolo系列预测是否需要滑动窗口?
    答:yolov系列,直接拟合,不进行窗口滑动

  5. yolo是否可以预测旋转有角度的物体?
    答:yolo 可以进行检测旋转的物体,但是需要改head和loss,在目标函数中加上角度即可,当然损失loss中也需要添加相应的计算。

你可能感兴趣的:(yolo,v4,计算机视觉,机器学习,深度学习,yolo)