YOLO系列的整理之YOLOV1

YOLOV1

  • 网络结构
  • 网络输出/数据标注(这里以VOC2012数据集(20个类别)为例)
  • 损失函数(每一项参数详细讲解)
  • 后记

其实之前准研一的暑假就接触目标检测分割系列了也整理了一些资料,那会一直放在自己电脑中,后来研究方向转成了红外可见光图像融合,也就没有了后续,现在研二想将红外可见光图像融合应用在目标检测与分割中,所以又重新温习了起来并把自己整理的资料发布出来。非常希望大家提出疑问,批评,我们一起讨论。
另外,由于网上以已经有很多关于YOLO系列文章的讲解了,所以本文重点在于讲解细节部分,希望能够帮助一些没搞懂细节的读者,故需要读者已经了解了深度学习的基础知识,以及知道YOLO是干嘛用的。
注:这里面有些图片是自己画的,有些图片来源请看水印哈,在此特别感谢CSDN以及CSDN之外的所有大佬

’ ’ ’
标注一下文章中的英文说明:
bbox表示网络生成的bounding box。
cell表示最终特征图的每个像素点,由于感受野的存在,映射回原图像也就是一个个区域网格grid
GT表示真实框。
’ ’ ’

网络结构

YOLO系列的整理之YOLOV1_第1张图片
如上图为YOLOV1的网络结构,并不复杂,简单说一下流程:
图片输入给一个特征提取网络 (实现中其实可以拿那些预训练的著名网络去掉全连接层就行) ,然后接上几个卷积层和全连接层,接着重新训练一下。最后把全连接层在reshape成7x7x30。
如何训练:YOLOV1首先用大小为224x224的图片训练分类网络,然后将图片扩大至448x448训练并将分类网络调整成检测网络。

网络输出/数据标注(这里以VOC2012数据集(20个类别)为例)

1、输出7x7x30的张量
7x7:表示特征图的尺寸,即有49个像素点cell,也就是将原图像划分成了49个网格grid。
30:表示类别数有20类,给两个bbox共享,每个bbox有5个数据:中心点坐标2个、bbox高宽2个、置信度1个。20+5+5
上面是网络的输出,所以我们也要制作对应的标签才能去做损失:
真实框中心落在哪个cell中,就把该真实框的中心坐标高宽均写入该cell中的两个bbox的对应位置,两个bbox的置信度根据下面的匹配,匹配到哪个bbox,那个bbox就对应置为1,最后20个类别在对应的类别上标注1,其他标0。其中中心点坐标与高宽见下面处理。
2、以VOC2012数据集的真实框标注格式讲解如何标注bbox的中心点坐标与形状高宽
VOC2012数据集是xml格式文件,文件中存放各个bbox的左上角点和右下角点的坐标。
中心位置标注:将左上角与右下角坐标转化为相对于真实框所在网格的归一化。问题:为什么不转化为相对于整幅图像的归一化呢?答:我们希望真实框由其中心点所落网格负责,也就是希望预测出来的bbox中心位置在一个网格中波动,而不是图片任意位置在这里插入图片描述
形状高宽标注:我们是看真实框占了整张图像多大从而来确定形状。所以标注是相对于整幅图像大小。
在这里插入图片描述
上面的变量可结合下图理解:
YOLO系列的整理之YOLOV1_第2张图片

3、两个bbox与GT匹配
计算真实框映射到7x7x30时是落在哪个cell中,那么这个cell两个bbox就会拿出来一个预测该真实框。具体来说,在训练时,网络输出reshape成7x7x30之后在每个cell中就会出现两个bbox,拿着这两个bbox分别与真实框做IOU,取最大IOU对应的bbox来预测这个真实框。
被匹配到的bbox每次就拿它的中心点坐标和形状高宽来与真实框作差。
注意:匹配时,包括YOLOV2、V3、SSD这些都是只看高宽形状不看中心位置的 (即计算IOU之前先把中心坐标移到同一位置),但预测时的IOU既看高宽形状也看中心位置。还有下面计算损失函数时的IOU,我觉得这时也需要用到中心点坐标

损失函数(每一项参数详细讲解)

YOLO系列的整理之YOLOV1_第3张图片
上面的B表示bbox个数即2个,S表示最后的尺寸即7。所以在实现时就是遍历7x7个cell,i=49,每个cell遍历2次,j=2,一次1个bbox。
第一、二行表示位置形状误差,第三、四行表示置信度误差。第五行表示类别误差。
接下来看几个系数,这几个系数将每个cell遍历的两个bbox分成两种执行模式:
先看上面第一、二、三行都有的参数:在这里插入图片描述
该参数要么等于1,要么等于0。等于1时表示:当前执行的第i个cell第j个bbox在前面匹配时匹配到了物体,所以需要算中心位置误差、形状误差和置信度误差。等于0时表示:当前执行的这个bbox没有匹配到物体,没有匹配到物体,那这个bbox应该干啥?我们看上面第四行的参数:

在这里插入图片描述
很直观了吧,就是一个相反的操作,所以没有匹配到物体的bbox就只计算置信度误差。
好的,那接下来说一说第五行的这个参数:
在这里插入图片描述
这个参数其实跟第一个讲解到的参数是一模一样滴,因为类别数是共享的,所以没有 j 这个参数来指定bbox。当没有匹配到物体时,那么这个参数等于0,匹配到物体时,这个参数等于1,也就是要计算类别误差。
下面这个流程图应该就很直白了吧!!!这个流程图对所有网格均适应,没有真实框中心点落入的网格和落入后没能取到最大IOU的bbox全都是按NO的支路走。
在这里小小歪一下楼:一张图片里面物体的真实框个数肯定远远小于所有bbox,所以大多数执行都是走NO的支路,这就导致了损失函数主要来源于NO支路,也就造成了正负样本不均匀。

YOLO系列的整理之YOLOV1_第4张图片
好了看完两个大分支,我们现在单独看一下匹配到物体的这个分支里面的各项细节:
现在这个分支还有一个参数:在这里插入图片描述
由于一幅图像中真正的框会很少,但我们有7x7x2=98个框,所以大多数框只计算没有匹配物体的置信度误差,所以就会出现正负样本不均匀的情况,于是我们就要加入这个参数调高位置与形状误差的权重。作者定了等于5。这个分支第三行的置信度也是有一个权重的,权重为1
上面这两个权重是与另外那个分支(λnoobj=0.5)的权重相互制衡。
继续!
第一行没什么可说的,就是中心坐标均方差。
第二行中的每个值都加了根号,这是为啥?答:考虑小目标
我们知道,小目标的特征就是高宽比较小,所以取个根号,由于前面的归一化使得高宽的范围是(0,1),所以高宽越小,根号之后的数值就会越大。因为CNN提取特征到最后,往往分辨率变得很小了,小物体甚至只占了几个像素点而已了,这对于小物体检测不利。写到这里就想到Focal loss,Focal loss是看训练结果来判断难训练,这里是直接从本质出发。后续整理损失函数时再细讲。
第三行要说的是置信度:
置信度 = 存在目标的概率 x IOU。由于IOU需要GT与bbox的IOU,所以这个置信度的期望需要在训练中确定且会变化的,对于匹配到物体的bbox,存在目标概率为1,没有匹配到物体的bbox,就为0。
在这里插入图片描述
所以我们综合起来就是如下这个式子:
在这里插入图片描述

后记

记得当时研一那会刚看到YOLOV1时挺蒙的,感觉细节好多。但按这样的梳理方式(网络结构、网络输出(数据标注)、损失函数。)之后就觉得简单明了,对于每一种深度学习算法,我觉得都可以这样去做。当然事实上对于工业应用,重点是前期繁杂的数据处理,那个我觉得是单独的一大块了,而且根据实际应用实际处理,所以就没有加入进来。下面回答一些之前自己的疑问,如果你们有什么疑问,请尽情提出来哈,我会好好尽我所能回答。
第一:看到有人问过一个问题,为什么YOLO-V1用了两个bbox,最后却只使用一个来预测而已?
答:个人理解,网络第一次输出时是随机的生成不同长宽的bbox(有一丢丢丢丢anchor box的感觉),然后在根据IOU去决定哪个bbox来预测。作者这是想利用网络一开始的随机性。生成不同的bbox,然后选取最符合真实框的。这样相对于只用一个bbox去预测一个物体会更有优势。所以如果用三个甚至5 6 7 8个bbox去预测一个物体,单看效果可能会更好(假设不考虑正负样本不均匀的情况),但是计算量肯定也上升。所以YOLO-V2就不是这么干的了,而是让网络有目的性地生成相应的符合真实框形状的bbox (通过标注绑定和前12800轮的训练)。
第二:YOLO系列都是只能一个网格预测一个物体而已嘛?
答:YOLOV1确实是这样,因为他只有一套类别。但从YOLOV2开始因为引入ancher box就可以一个网格预测多个不同形状物体(至多5个物体),但如果同一个网格多个同样形状的物体,那就有点为难咯,这些后面进行讲解。

你可能感兴趣的:(目标检测,笔记,计算机视觉,深度学习,卷积神经网络,人工智能,机器学习)