YOLOv2(论文原名《YOLO9000: Better, Faster, Stronger》)作为该系列的第二个版本,对原始YOLO进行了显著的改进,进一步提高了检测速度和准确度。在精度上利用一些列训练技巧,在速度上应用了新的网络模型DarkNet19,在分类任务上采用联合训练方法,结合wordtree等方法,使YOLOv2的检测种类扩充到了上千种。作者在论文中称可以检测超过9000个目标类别,所以也称YOLO9000。分几个点来详细介绍:
1、网络结构
论文下载地址:
https://openaccess.thecvf.com/content_cvpr_2017/papers/Redmon_YOLO9000_Better_Faster_CVPR_2017_paper.pdf
GitHub源码地址:https://github.com/philipperemy/yolo-9000
项目地址:YOLO: Real-Time Object Detection
YOLOv2使用Darknet-19作为其基础网络结构。Darknet-19是一个深度卷积神经网络,它包含19个卷积层和5个最大池化层。Darknet-19的设计哲学是减少计算量,同时保持足够的特征表达能力。以下是Darknet-19的关键特点:
深度可分离卷积:减少参数数量和计算量。
跨层连接:允许从深层网络直接传递梯度,缓解梯度消失问题。
批量归一化:提高训练速度,稳定学习过程。
Darknet-19顾名思义,有19个卷积层,如下图:
YOLO-V2的主框架是基于Darknet-19搭建的,我们来看下YOLO-V2的结构,如下图:
2、检测原理
从整体上来看,其核心原理是将目标检测问题视为一个单个的回归问题,通过在图像上划分网格并在每个网格上预测边界框和类别概率来实现目标检测。相比于传统的目标检测方法,YOLOv2在速度和准确性方面取得了较大的改进。
可以分为以下几个步骤:
- 图像划分网格: 首先,将输入图像分成固定大小的网格。每个网格负责检测图像中的物体。
- 预测边界框: 对于每个网格,模型预测多个边界框(bounding boxes)。每个边界框由5个值组成:边界框的中心坐标、边界框的宽度和高度以及目标的置信度。置信度表示模型认为该边界框包含物体的概率。
- 类别预测: 同时,模型还会对每个边界框预测所属物体的类别。这些类别包括图像中可能出现的各种物体,如人、车、狗等。
- 输出处理: 最后,通过筛选置信度高的边界框,并采用非极大值抑制(Non-Maximum Suppression,NMS)来移除冗余的边界框,最终得到最终的检测结果。
3、模型性能
对于YOLO-V2的性能,直接看下YOLOV2和其他常见的框架在pascal voc2007数据集上测试结果性能比对表,如下表:
首先可以看到随着训练尺寸的尺寸变大,YOLOv2算法的mAP是逐渐上升的,FPS相应的逐渐下降。在554x554尺寸上的训练mAP达到78.6。
4、损失函数
YOLOv2定义了一个复合损失函数,用于同时优化定位和分类误差。
YOLOv2的损失函数主要由三部分组成,分别是边界框坐标损失、目标置信度损失和分类损失。这些损失函数共同用于衡量模型的预测与真实标签之间的差异,并通过反向传播算法来优化模型参数。下面是对每个部分的详细介绍:
- 边界框坐标损失(Bounding Box Coordinates Loss):(YOLOv2使用平方误差损失(Mean Squared Error,MSE)来衡量预测边界框的坐标与真实边界框坐标之间的差异。具体来说,对于每个网格,模型预测边界框的中心坐标和宽高的偏移量,然后计算这些预测值与真实标签之间的平方差,并求和。这部分损失函数主要负责调整边界框的位置和大小,使其更好地与目标对齐。)
坐标损失:(负责检测物体的bbox中心点定位误差):
宽高坐标损失:(负责检测物体的bbox宽高定位误差)
损失计算中加上平方根的目的是拉大不同预测位置的得到的损失预测值差距,使小框对误差更敏感一点。这样做是为了更加重视较大的边界框的位置误差,可以使算法更加关注边界框的位置准确性,从而更好地优化它们的预测结果。
- 目标置信度损失(Object Confidence Loss):(YOLOv2使用逻辑回归损失(Binary Cross-Entropy Loss)来衡量模型对于每个边界框是否包含目标的置信度预测与真实标签之间的差异。对于每个网格,模型会预测一个置信度分数,表示该边界框中是否包含目标。如果该网格中存在目标,则置信度损失计算预测置信度与1之间的差异;如果该网格中不存在目标,则置信度损失计算预测置信度与0之间的差异。)
通过对置信度进行损失计算,可以鼓励模型在包含目标的网格中预测高置信度。
- 分类损失(Class Loss):(对于每个边界框,YOLOv2还会预测物体类别的概率分布。分类损失采用交叉熵损失(Cross-Entropy Loss)来衡量模型对于每个类别预测的概率分布与真实标签之间的差异。具体来说,对于每个网格,模型会预测一个包含所有类别的概率分布,然后计算预测概率分布与真实标签之间的交叉熵损失。)
5、模型改进(better、faster、stronger)
更好(better):
通过使用批归一化(Batch Normalization, BN)、基于卷积的锚点机制等一系列技术手段,使得目标检测精度较YOLO-V1有了大幅度提高。
更快(faster):
通过改进网络结构,在小幅降低精度的情况下,大幅减少浮点运算次数以提高模型速度(针对224×224尺寸图像输入的单趟前向传播,由VGG16网络的300亿次浮点运算降低至80亿次)。
更强(stronger):
基于YOLO-V2构建YOLO-9000模型,通过采用联合训练(jointly training)机制,综合发挥目标检测任务数据集和图像分类任务数据集的综合优势(目标检测数据集图像数量少、目标类别少但提供精确的目标位置信息,而分类数据集无目标位置信息,但类别数多且图像数量庞大),使得支持的检测目标类别数从原来的20类大幅扩展至9000类,大大提高了模型的适用性。
改进之处:
(1)批规范化(Batch Normalization):
Batch Normalization的作用是提高了网络模型的鲁棒性,缓解了Covariant Shift问题,有一定的正则化(regularization)作用,在这里也不例外。通过在YOLO所有的卷积层中加入Batch Normalization,可以使得mAP提高2%,并且dropout的部分也可以丢掉.
(2)高分辨率分类器(High Resolution Classifier):
从AlexNet开始,大多数的分类器都在分辨率小于的图像上执行分类。YOLO一代在训练分类网络的时候用的是分辨率,检测网络的时候用的是分辨率,这就意味着网络需要同时切换到目标检测并且适应新的分辨率。在YOLO二代中,直接使用的分辨率微调(fine tune)了网络,训练了10个epoch。可以使得mAP提高大概4%。
(3)使用全卷积网络结构并引入锚点(Anchor Boxes):
为了预测不同尺寸的目标,YOLOv2引入了锚点(Anchor Boxes)的概念。每个网格单元不再只预测一个边界框,而是预测多个与锚点尺寸相关的边界框。这些锚点是预先定义的,基于训练数据集中目标尺寸的分布。使用多个锚点可以提高对不同尺寸目标的检测能力。
原来的YOLO算法将输入图像分成的网格,每个网格预测两个bounding box,因此一共只有98个box,但是在YOLOv2通过引入anchor boxes,预测的box数量超过了1千(以输出feature map大小为为例,每个grid cell有9个anchor box的话,一共就是个,最终每个grid cell选择5个anchor box)。在Faster RCNN在输入大小为时的boxes数量大概是6000,在SSD300中boxes数量是8732。显然增加box数量是为了提高object的定位准确率。实验证明:虽然加入anchor使得MAP值下降了一点(69.5降到69.2),但是提高了recall(81%提高到88%)。
(4)维度聚类:
通过K-means来学习出anchor box。在Faster R-CNN中anchor box的大小和比例是按经验设定的,然后网络会在训练过程中调整anchor box的尺寸。但是如果一开始就能选择到合适尺寸的anchor box,那肯定可以帮助网络越好地预测detection。所以作者采用k-means的方式对训练集的bounding boxes做聚类,试图找到合适的anchor box。如果采用标准的k-means(即用欧式距离来衡量差异),在box的尺寸比较大的时候其误差也更大,而我们希望的是误差和box的尺寸没有太大关系。所以通过IOU定义了如下的距离函数,使得误差和box的大小无关,K-means主要用与预测anchor box的长跟宽。:
聚类结果如图,左图代表Avg IOU与聚类数目K的关系,在权衡Avg IOU和模型复杂度以后,作者选择了K=5。右图代表了VOC和COCO数据集的box的聚类结果。可以看出聚类所得到的anchor box与手动选择相比,更倾向于选择高瘦的anchor box。
(5)细分类特征(Fine-Grained Features):
Faster F-CNN、SSD都使用不同尺寸的Feature Map来取得不同范围的分辨率,而YOLOv2采取了不同的方法,YOLOv2加上了一个跳跃层(Passthrough Layer)来获取之前的26*26分辨率的层的特征。这个Passthrough layer能够把高分辨率特征与低分辨率特征连结(concatenate)起来,这种方式看起来与ResNet很像,但是略有不同,因为ResNet采用的是summation,而YOLOv2的Fine-Grained Features采用的是concatenate。
(6)多尺度训练(Multi-ScaleTraining):
作者希望YOLO v2能鲁棒地运行于不同尺寸的图片之上,所以把这一想法用于训练model中。 区别于之前的补全图片尺寸的方法,YOLO v2每迭代几次都会改变网络参数。每10个Batch,网络会随机地选择一个新的图片尺寸,由于使用了下采样参数是32,所以不同的尺寸大小也选择为32的倍数{320,352…..608},最小,最大,网络会自动改变尺寸,并继续训练的过程。 这一方法使得网络在输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,下图为YOLOv2和其他的目标检测网络的对比。
特征金字塔网络(FPN)
YOLOv2通过特征金字塔网络(FPN)来捕捉不同尺度的特征,从而提高对小目标的检测能力。FPN的核心思想是将深层网络中的高语义信息和浅层网络中的高分辨率信息结合起来。这样,YOLOv2能够在不同尺度的特征图上进行检测,从而检测到不同大小的目标。
其主要步骤如下:
- 自底向上构建: 首先,通过一个通用的深度卷积神经网络(如ResNet、VGG等)从输入图像中提取特征。这些特征具有不同的分辨率,随着网络的深度逐渐减小。FPN利用这些特征构建一个自底向上的特征金字塔,即从底层到顶层逐步上采样特征图。
- 自顶向下融合: 接下来,FPN从高级语义层次(低分辨率)开始,通过上采样(如双线性插值)将低分辨率的特征图上采样到更高的分辨率。然后,将相邻层次的特征图进行融合,以获得更丰富的语义信息。这种自顶向下的融合过程可以帮助模型在不同尺度上更好地理解图像。
- 特征融合: 在自顶向下的过程中,FPN还会进行特征融合,将来自不同层次的特征图进行逐元素相加,以获得更加丰富和细致的特征表示。这样可以使得最终的特征金字塔更具有表征能力。
通过自底向上和自顶向下的特征提取和融合过程,FPN能够生成具有多尺度信息的特征金字塔,从而有效地应对不同尺度目标的检测需求。这使得FPN成为了许多目标检测器(如Faster R-CNN、RetinaNet等)的核心组件,极大地提升了检测模型在多尺度场景下的性能。
(6)passthrough层的引入:
YOLOv1仅在网络输出的最后一个feature map上去检查输入图像中的所有目标:
①最后一张feature map的低分辨率就意味着网格划分的很粗糙,不够精细,这不仅对于密集物体检测的效果会较差,小物体的检测效果也不够理想。
②特征图的分辨率越高,所划分的网格也就越精细,能够更好地捕捉目标的细节信息。相较于YOLOv1只在一张7×7的过于粗糙的网格上做检测,2016年的SSD使用多种不同分辨率的特征图自然会更好。
YOLO作者借鉴了SSD的这一思想。将Backbone的第17层卷积输出的26×26×512特征图拿出来,做一次特殊的降采样操作,得到一个13×13×2048特征图。然后将二者在通道的维度上进行拼接,得到更厚的13×13×3072的特征图。最后在这张融合了更多信息的特征图上去做检测。
这里需要注意的是,实际上在作者代码中,在特殊的降采样之前先做了降维由26×26×512降维至26×26×64,然后做特殊的降采样变为13×13×256,然后拼接得到13×13×1280的特征图。特殊的降采样操作(reorg)如下图所示:
特征图在经过reorg操作的处理后,特征图的宽高会减半,而通道则扩充至4倍
这种特殊降采样操作的好处就在于降低分辨率的同时,没丢掉任何细节信息,信息总量保持不变。
加上该操作后,在VOC 2007测试集上的mAP从74.4%再次涨到了75.4%。
以今天的眼光看,最终的检测还是在13×13的网格中进行检测,并不是真正的类似SSD的多级检测。
6、模型缺限
- 小目标检测:YOLOv2在检测小目标方面的表现不如一些其他先进的目标检测算法,如RetinaNet和YOLOv3。
- 类别不平衡:在处理类别不平衡的数据集时,YOLOv2的性能可能会受到影响。
参考文章:
https://blog.csdn.net/festaw/article/details/138125259
https://cloud.tencent.com/developer/article/1670582