to 公司数据合规同事,本文为在家编写博客后采用定时发送机制发送的博文,没有用到任何公司信息和公司代码
系列文章地址
YOLO系列基础(一)卷积神经网络原理详解与基础层级结构说明-CSDN博客
YOLO系列基础(二)Bottleneck瓶颈层原理详解-CSDN博客
YOLO系列基础(三)从ResNet残差网络到C3层-CSDN博客
YOLO系列基础(四)归一化层(BN层)的前世今生!-CSDN博客
YOLO系列基础(五)从神经元共适应性到模型Dropout层-CSDN博客
YOLO系列基础(六)YOLOv1原理详解原理如此清晰-CSDN博客
YOLO系列基础(七)从数据增强到图像线性变换-CSDN博客
YOLO系列基础(八)从坐标直接预测到锚框偏移量-CSDN博客
YOLO系列基础(九)YOLOv2论文及原理详解(上)-CSDN博客
目录
背景
随着YOLOv11版本的发布,YOLO算法在视觉检测领域独领风骚,本系列旨在从小白出发,给大家讲解清楚视觉检测算法的前世今生,并讲清楚YOLOv11版本算法的所有模块功能!
在YOLO(You Only Look Once)系列算法的演进中,YOLOv1作为开山之作,奠定了实时目标检测的基础框架。但是YOLOv1仍然存在诸多缺陷,且同期的其他检测算法也在蒸蒸日上抢夺最强检测算法的宝座,本文从YOLOv1的缺陷出发,详解YOLOv2的原理和改进措施。
YOLOv1的缺陷
有关于YOLOv1的相关原理可以查看此篇博文:
YOLO系列基础(六)YOLOv1原理详解原理如此清晰-CSDN博客
在之前的博文中,我们针对YOLOv1算法的缺陷有了初步的了解,此处我们详细说明一下
1. 定位精度不足
YOLOv1将输入图像划分为一个7x7的网格(对于448x448的输入图像),每个网格负责预测中心落在该网格内的目标。每个网格预测两个边界框,每个边界框包含5个值:x, y, w, h, 和
confidence。
其中,x和y是边界框中心相对于网格单元左上角的偏移(归一化到0-1之间),w和h是边界框的宽度和高度相对于整个图像宽度的比例(同样归一化到0-1之间),confidence表示边界框内存在目标的概率以及预测的准确度(即目标的存在性置信度乘以预测框与真实框的IOU)。
YOLOv1的检测框检测采用的思路为通过最后的两层全连接层来直接预测检测框w和h的归一化坐标值。
这实际上很不合适,因为物体在不同的距离下大小往往区别甚大,坐标值也大相径庭,而卷积和池化操作本身就是在尽量解耦全局坐标值(每卷积or池化一次,特征图片的size都会大不一样),也就是说针对YOLOv1的网络结构,每一个检测框会输出5个值:x, y, w, h, confidence,其中x,y和confidence都是合理的预测内容,因为随着卷积操作的进行,上诉的3个值都和图片的size和全局坐标脱钩了(x和y是预测的当前cell的偏移量),而问题就在于w和h,这两个值和符号在图像中的大小强相关,而且是直接预测的全局坐标的归一化值。
这也就造成了,YOLOv1在检测框预测上很不准确,就连YOLOv2的官方论文也提出了此点问题:
翻译如下
2. 更好的措施
与最先进的检测系统相比,YOLO 存在多种缺陷。对 YOLO 与Fast
R-CNN 的误差分析表明,YOLO 存在大量定位误差。
2. 网络单元预测数量存在限制
YOLOv1将输入图像划分为S×S的网格,每个网格单元负责预测B个边界框和这些边界框的置信度分数。然而,每个网格单元只能预测一个类别,并且只能生成有限数量的边界框(通常是两个)。这限制了模型在处理多个目标重叠或目标类别多样的情况下的性能。
在YOLOv1的博文中,我也提到此问题:
以cell为检测单位,导致每一个cell仅能针对一个类别进行预测,若两个类别的中心点位同一个cell,那么YOLOv1就会直接开摆~
YOLOv2的原理详解与改进
YOLOv2在基础原理和YOLOv1大致相同,同样采用S*S的网格分割图像,每一个cell负责预测cell内的物体中心点、检测框的宽高。检测和分类任务看成回归问题,一次性输出,依旧是(you only look once!)
改进措施一:BN层的加入
有关于BN层的原理详解内容,可以查看以下博客:
YOLO系列基础(四)归一化层(BN层)的前世今生!-CSDN博客
BN层主要就是通过归一化特征输入以消除内部协变量位移,以解决过拟合问题。
YOLOv2论文对BN层的阐述如下
翻译如下:
批量归一化可以显著提高收敛性,同时消除对其他形式正则化的需求。YOLOv2通过在 YOLO 的所有卷积层上添加批量归一化,使得YOLOv2的mAP 提高了 2% 以上。通过增设BN层,YOLOv2可以在不过度拟合的情况下消除模型中的Dropout层。
各位读者,Dropout层是YOLOv1版本中的一个内容,位于两层全连接层中间,主要内容是通过消除神经元共适应性来消除过拟合,的相关内容可以查看:
YOLO系列基础(五)从神经元共适应性到模型Dropout层-CSDN博客
实际上,Dropout层和BN层的效果存在一定的重叠,故YOLOv2在加入BN层之后果断删除了Dropout层
改进措施二:高分辨率分类器的预训练
YOLO算法把检测和分类任务视作回归问题,在单次运行中一次性输出。但是我们依旧需要针对分类数据集进行预训练。
需要使用分类数据集进行预训练的原因如下:
- 检测数据集实在是太少了……:人为标注的检测数据集过于稀缺,且耗时耗力,在很长一段时间内都没有成型的足够多的检测数据集,当然现在依旧存在该问题,但是已经缓解很多了。所以用分类数据集进行预训练成为了主流
- 分类训练可以获取优质的先验信息:也许很多人会有疑惑,这有啥用啊?实际上神经网络的训练效果很大程度上和神经网络的初始化参数有关,在以前,神经网络的参数的随机的,有时候运气好,初始化参数很接近最终目标,那么就只需要少数epoch就能达到良好效果,而初始化参数和目标差距很大,就需要很多epoch来达成目标。所以当时的检测算法团队往往会先进行分类训练,从而预训练处特征提取的部分,最终可以获取很好的初始化参数。那么模型对检测数据集的规模和质量的依赖就会缓解。
那这就会带来一个问题,分类数据集和检测数据集的图片size不同的问题,如果我们在一个低分辨率的数据集上进行分类器的预训练,然后迁移到高分辨率的数据集上进行正式训练,那这个初始化参数,真的有用吗?
结论:有用是有用的,但是不多
所以这里新功能的引入就很好理解了,简单来说就是直接在高分辨率的数据集下训练,然后用同样高分辨率的检测数据集进行正式训练。
以下是YOLOv2论文中的描述:
High Resolution Classifier.
All state-of-the-art detec tion methods use classifier pre-trained on ImageNet [16]. Starting with AlexNet most classifiers operate on input im ages smaller than 256 256 [8]. The original YOLO trains the classifier network at 224 224 and increases the reso lution to 448 for detection. This means the network has to simultaneously switch to learning object detection and ad just to the new input resolution. For YOLOv2wefirstfinetunethe classification network at the full 448 448 resolution for 10 epochs on ImageNet. This gives the network time to adjust its filters to work better on higher resolution input. We then fine tune the resulting network on detection. This high resolution classification network gives us an increase of almost 4% mAP.
翻译如下:
高分辨率分类器
所有先进的检测方法都使用在 ImageNet 上预先训练好的分类器 [16]。 从 AlexNet 开始,大多数分类器都在小于 256 × 256 的输入图像上运行 [8]。最初的 YOLO 以 224 × 224 的分辨率训练分类器网络,并将检测分辨率提高到 448。这意味着网络必须同时切换到学习对象检测,并适应新的输入分辨率。
对于 YOLOv2,我们首先在 ImageNet 上以完整的 448 × 448 分辨率对分类网络进行 10 次微调。 这样,网络就有时间调整其过滤器,以便在更高分辨率的输入上更好地工作。然后,我们在检测时对由此产生的网络进行微调。这种高分辨率分类网络使我们的 mAP 提高了近 4%。
改进措施三:先验锚框的引入
有关于锚框的问题可以查看下面的博文:
YOLO系列基础(八)从坐标直接预测到锚框偏移量-CSDN博客
简单来说就是通过锚框来降低定位不精确的问题,同时加快模型的拟合过程。
但是Fast CNN的锚框定义和YOLO的锚框定义还不太一样用于YOLO算法本身的特殊性,锚框机制需要进行YOLO版本的移植
YOLO对锚框机制的改进1:尺寸集群算法的改进
传统Kmean算法
传统的Kmean集群算法采用的是欧氏距离的集群,针对锚框的大小w和h,我们将其认定为二维平面上的x,y。那么我们就能针对该部分进行欧氏距离的集群算法,并分出K类。
但是这样的做法并不精确,因为锚框的分类应该使用IoU(交并比)来进行描述。
有何区别?w和h越接近的锚框,其交并比难道不是更近吗?实际上,还是有细微的区别的,尤其体现在锚框尺寸上,锚框的大小会给欧氏距离带来极大的影响。
例如:假设有两类锚框记为A、B两类,A类锚框尺寸小,B类锚框尺寸大。针对A类锚框有a1这个具体的锚框,B类有b1这个具体的锚框,其中a1和A类平均锚框之间的交并比和b1和B类平均锚框之间的交并比数值上是一致的。也就是说下方这个图片的比例是一致的。但是针对w和h的数值却大为不同。
也就是说,如果使用欧氏距离来进行聚类,会造成这样的现象:锚框越小的类,类内间距越小,锚框越大的类,类内间距越大。
如下图,w和h越小的类,类内间距越小,w和h越大的类,类内间距越大:
这样的分布实际上和我们理想的分布差异很大,Kmean的结果自然也不理想。
YOLO改进的Kmean
所以YOLO改进了Kmean的公式,采用了如下的公式来计算:
至此,YOLO的先验锚框的设定也完成了。通过修改后的Kmean进行labels的K聚类,并设定了K个先验锚框。
YOLO论文中对Kmean的原文如下:
Dimension Clusters.
We encounter two issues with an chor boxes when using them with YOLO. The first is that the box dimensions are hand picked. The network can learn to adjust the boxes appropriately but if we pick better priors for the network to start with we can make it easier for the network to learn to predict good detections. Instead of choosing priors by hand, we run k-means clustering on the training set bounding boxes to automatically find good priors. If we use standard k-means with Euclidean distance larger boxes generate more error than smaller boxes. However, what we really want are priors that lead to good IOU scores, which is independent of the size of the box. Thus for our distance metric we use:
We run k-means for various values of k and plot the av erage IOU with closest centroid, see Figure 2. We choose k = 5as a good tradeoff between model complexity and high recall.
翻译如下:
尺寸集群
在将锚框与 YOLO 一起使用时,我们会遇到两个问题。首先,锚点框的尺寸是人工挑选的。网络可以通过学习来适当调整方框,但如果我们一开始就为网络选择更好的先验值,就能让网络更容易学会预测良好的检测结果。
与手工选择先验值不同,我们对训练集的边界框进行 k-means 聚类。
图2:VOC 和 COCO 的聚类框尺寸。我们对边界框的维度进行 k-means 聚类,以便为我们的模型获得良好的先验。左图显示了我们在选择不同 k 时得到的平均 IOU。我们发现,k = 5 在模型的召回率与复杂度之间做出了很好的权衡。右图显示了 VOC 和 COCO 的相对中心点。两组先验都偏向于更薄、更高的方框,而 COCO 的尺寸变化比 VOC 更大。如果我们使用欧氏距离的标准 K-均值法,较大的方框比较小的方框产生的误差更大。然而,我们真正需要的是能带来良好IOU 分数的先验值,这与方格的大小无关。因此,我们在距离度量中使用:
我们对不同的 k 值运行 k-means,并绘制出最接近中心点的平均 IOU,见图 2。我们选择 k = 5
作为模型复杂度与最近中心点的平均 IOU 值之间的良好权衡。
YOLO对锚框机制的改进2:直接位置预测
实际上我更愿意称其为,偏移量归一化预测。
这一步是什么意思呢?我们需要从Fast CNN开始说起……
在Fast CNN算法中的检测框具体坐标针对锚框偏移量的计算公式如下:
其中和指的是锚框的宽和高,和zh指的是锚框的x和y坐标。
例如,预测 tx = 1 将使方框向右移动锚点方框的宽度,预测 tx = 1 将使方框向左移动相同的宽度。
YOLO论文认为这种方法不受约束,因为任何锚点框都可以在图像中的任何一点出现,而不管锚点框的预测位置是什么。在随机初始化的情况下,模型需要很长时间才能稳定下来,预测出合理的偏移量。
啥意思呢?实际上原因是,在YOLO算法看来,图像已经被分成了S*S的网格,网格会负责预测网格内的中心点和对应的锚框和类别概率。也就是说这个中心点再怎么偏移,最多最多也不会超出这个网格。若是超出网格自然也就归别的网格负责,所有YOLO看来,锚框原来的公式给检测框中心点的范围太大了,中心点可以偏移到图像的任意一个位置,显然这耗费很多资源。
所以YOLOv2的每个边界框预测 5 个坐标:tx、ty、tw、th 和 to。如果当前网格左上角坐标为 (cx cy),且锚框的宽度和高度分别为 pw、ph,则预测结果对应于
图解如下:
也就是说YOLO采用的sigmoid函数来使得tx和ty归一化到0,1的范围,使得中心点的范围大大减少从而减少很多不必要的训练。
YOLOv2原文:
由于我们对位置预测进行了限制,因此参数化更容易学习,从而使网络更加稳定。与使用锚点框的版本相比,使用维度集群和直接预测边界框中心位置的方法将 YOLO 提高了近 5%。
改进措施四:直通层的引入
其实我更愿意称其为残差层的引入,因为和残差层实在是太像了。虽然目的不同,但是手段却近乎一致。
基础背景:
YOLO模型在13x13的特征图上进行预测。这对于检测大物体是足够的,因为大物体在特征图上占据较多的像素,因此容易检测。 然而,对于小物体来说,它们在特征图上占据的像素较少,这可能导致检测困难。因此,需要更精细的特征(fine-grained features)来帮助定位这些小物体。
在深层卷积过程中,图像信息一直在不断丢失,这导致13*13的格子对这些小物体来说还是太大了,没办法保留过多的有效信息,更别说还存在池化层这种瞬间少75%信息的信息丢失大杀器……。是的,大家马上想到了残差网络,信息丢失?把之前的特征图暴力concat不就完了?
但是这里稍微有些不同,在残差网络中,输入和输出特征的size是一样的,而在YOLOv2中我们要concat的是26*26*512的特征图和13*13*1024的特征图。size都不一样,这如何concat?
所以YOLO添加一个直通层(passthrough layer)。这个直通层从较早的26x26分辨率的层中提取特征,并将这些特征与后面的深层特征结合起来。 这个过程将26x26x512的特征图转换成了13x13x2048的特征图,这个特征图再与后续13*13*1024的特征图进行拼接成一个大的13*13*3072的特征图。
这是怎么做到的呢?
借用一下示意图,源自:【yolov2模型】-CSDN博客
直通层通过将相邻的特征堆叠到不同的通道中(而不是空间位置),来实现高分辨率特征与低分辨率特征的结合。这与ResNet中的恒等映射(identity mappings)相似。也就是说通过降低size增多通道数的方法适应低size的特征图,通过增多通道数的方式不丢失信息。边长除二,通道数直接乘四。
这个过程将26x26x512的特征图转换成了13x13x2048的特征图,这个特征图可以与后面的特征图进行拼接。
YOLO9000原文如下:
我们的检测器在扩展后的特征图上运行,可以获得更精细的特征。这种改进带来了1%的性能提升
到此为止,我们先休息休息,本篇主要讲解了YOLOv2的一些改进点,虽然还没讲完……
但是敬请期待,YOLOv2论文详解的下篇!
标签:预测,YOLOv1,检测,YOLO,网格,详解,YOLOv2 From: https://blog.csdn.net/qiantianye/article/details/143956202