YOLOv1和的v2总结与对比
- YOLOv1
- YOLOv2
-
- 算法架构
- 相较之前的优化
-
- [添加Batch Normalization](#添加Batch Normalization)
- [引入锚框(Anchor Boxes)机制](#引入锚框(Anchor Boxes)机制)
- 引入DarkNet-9
- 多尺度输入训练
- 网络训练
-
- 第一阶段:在ImageNet上预训练Darknet-19
- 第二阶段:在ImageNet上调整输入尺寸并finetune
- [第三阶段:将分类模型转换为检测模型,并在检测数据集上fine tune](#第三阶段:将分类模型转换为检测模型,并在检测数据集上fine tune)
- 具体的输出矩阵解释
- 总结
- 优化方向
YOLOv1
YOLOv1是YOLO系列第一个版本,它是单阶段算法的最初实时目标检测系统,对一张图片进行检测只需要进行一次前向传播来同时预测多个物体的类别和位置。
主要思想
- 将图片分成7*7的网格,当物体中心落在某个网格中心,那么该网格就负责预测该物体,这是YOLO系列网络的核心思想(即用网格坐标预测目标位置)。
- 每个网格都会预先生成两个预测框,这样就会有772=98个预测框,框的数目比起Faster R-CNN成百上千的预测框数目要少得多,这是YOLO快速的一个原因。
- 当预测种类数目为20时,每个预测框对应一个30维的向量,具体分析如下。
算法架构
主干网络
- 输入层:输入图像要被调整为输入尺寸大小(448*448像素)。
- 卷积块:基于GoogLeNet结构做了一些调整,共24个卷积层:
- 前20层用于特征提取,每个卷积层后面跟着一个批量归一化层和ReLu激活函数。
- 最后4个卷积层与全连接层组合,进行检测。
- 全连接层:
- 第一个全连接层有4096个神经元,即将卷积输出展开摊平,并通过全连接层处理。
- 第二个全连接层输出检测结果,即S*S(B*5+C),S是网格单元的数量,这里为7。B是每个网格预测的边界框数量,这里是2。C是检测类别的数量。5代表每个边界框预测5个值(x,y,w,h,confidence),其中 x 和 y 是边界框中心相对于网格单元的位置(即相对于每个单元格左上角坐标点的偏移值),w 和 h 是边界框的宽和高(相对于整个图片的宽与高的比例),confidence 是该边界框包含物体的置信度。当预测种类数目C为20时,最后计算出S*S*(B*5+C) = 7*7*30,这也就是为什么一个网格会生成一个30维的向量。
- 所谓置信度其实两方面内容,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为 Pr(object),当该边界框是背景时(即不包含目标),此时 Pr(object) = 0 。而当该边界框包含目标时,Pr(object) = 1 。边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表征,记为 I O U p r e d t r u t h IOU^{truth}{pred} IOUpredtruth 。因此置信度可以定义为 P r ( o b j e c t ) × I O U p r e d t r u t h Pr(object)\times IOU^{truth}{pred} Pr(object)×IOUpredtruth 。很多人可能将Yolo的置信度看成边界框是否含有目标的概率,但是其实它是两个因子的乘积,预测框的准确度也反映在里面。
损失函数
YOLOv1的损失函数主要包括坐标误差,置信度误差,分类误差,公式如下图所示。
- 其中坐标损失中为了减少因为物体尺寸大小对损失的影响,对w和h先取根号再用来计算损失。
- 置信度损失氛围含有目标和不含有目标两种,其中因为不含有目标的背景可能会占据图像的大部分区域影响误差计算,所以需要加上权重参数 λ n o o b j \lambda_{noobj} λnoobj。
训练过程
在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用图8中前20个卷积层,然后添加一个average-pool层和全连接层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。
网络预测
这里再介绍一下非极大值抑制算法(non maximum suppression, NMS),这个算法主要解决的是一个目标被多次检测的问题,因为一个物体可以被多个检测框检测到,但我们只想要置信度最大的框作为输出。那么可以采用NMS算法来实现这样的效果:首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU,如果其值大于一定阈值(重合度过高),那么就将该框剔除;然后对剩余的检测框重复上述过程,直到处理完所有的检测框。
YOLOv1算法相关的处理是这样的:先使用NMS,然后再确定各个box的类别。对于98个boxes,首先将小于置信度阈值的值归0,然后分类别地对置信度值采用NMS,这里NMS处理结果不是剔除,而是将其置信度值归为0。最后才是确定各个box的类别,当其置信度值不为0时才做出检测结果输出。
主要成果
YOLOv1在速度和性能上取得了显著成果,实现了单阶段目标识别网络。
优化方向
YOLOv1对于高度重合的物体识别准确度较低,并且对小物体敏感度不够,也无法完成多标签预测。
YOLOv2
YOLOv1虽然检测速度很快,但是在检测精度上却不如R-CNN系检测方法,YOLOv1在物体定位方面(localization)不够准确,并且召回率(recall)较低。YOLOv2共提出了几种改进策略来提升YOLO模型的定位准确度和召回率,从而提高mAP,YOLOv2在改进中遵循一个原则:保持检测速度,这也是YOLO模型的一大优势。
算法架构
主干网络
- 输入层:输入图像被调整为固定大小(416x416像素)用于网络输入。
- 理由:因为YOLOv2采用了五次下采样,下采样总步长为32。而对于 416x416 大小的图片,最终得到的特征图大小为 13x13 ,维度是奇数,这样特征图恰好只有一个中心位置。对于一些大物体,它们中心点往往落入图片中心位置,此时使用特征图的一个中心点去预测这些物体的边界框相对容易些
- Darknet-19:这是一个包含19个卷积层和5个池化层的深度卷积神经网络,结构如下。
该网络通过逐层的卷积和池化操作提取图像的特征,并且使用了批量归一化(Batch Normalization)和Leaky ReLU激活函数。
- 输出层:13x13x(B×(5+C))
损失函数
W和H分别指的是特征图(13* 13)的宽与高,而 A 指的是先验框数目(这里是5),各个 λ \lambda λ 值是各个loss部分的权重系数。
- 第一项loss是计算background的置信度误差,但是需要先计算各个预测框和所有ground truth的IOU值,并且取最大值Max_IOU,如果该值小于一定的阈值(YOLOv2使用的是0.6),那么这个预测框就标记为background,需要计算noobj的置信度误差。
- 第二项是计算先验框与预测宽的坐标误差,但是只在前12800个iterations间计算,这项应该是在训练前期使预测框快速学习到先验框的形状。
- 第三大项计算与某个ground truth匹配的预测框各部分loss值,包括坐标误差、置信度误差以及分类误差。
- 先说一下匹配原则,对于某个ground truth,首先要确定其中心点要落在哪个cell上,然后计算这个cell的5个先验框与ground truth的IOU值(YOLOv2中bias_match=1),计算IOU值时不考虑坐标,只考虑形状,所以先将先验框与ground truth的中心点都偏移到同一位置(原点),然后计算出对应的IOU值,IOU值最大的那个先验框与ground truth匹配,对应的预测框用来预测这个ground truth。
- 在计算obj置信度时,target=1,但与YOLOv1一样而增加了一个控制参数rescore,当其为1时,target取预测框与ground truth的真实IOU值。对于那些没有与ground truth匹配的先验框(与预测框对应),除去那些Max_IOU低于阈值的,其它的就全部忽略,不计算任何误差。
相较之前的优化
添加Batch Normalization
- 作用:提升模型收敛速度,起到一定正则化效果,降低模型的过拟合。在YOLOv2中,每个卷积层后面都添加了Batch Normalization层,并且不再使用droput。
- 结果:使用Batch Normalization后,YOLOv2的mAP提升了2.4%。
引入锚框(Anchor Boxes)机制
-
对比:在YOLOv1中,输入图片最终被划分为 7x7 网格,每个单元格预测2个边界框。YOLOv1最后采用的是全连接层直接对边界框进行预测,其中边界框的宽与高是相对整张图片大小的,而由于各个图片中存在不同尺度和长宽比(scales and ratios)的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLOv1在精确定位方面表现较差。
-
理由:v2借鉴了Faster R-CNN中RPN网络的先验框(anchor boxes)策略。RPN对CNN特征提取器得到的特征图(feature map)进行卷积来预测每个位置的边界框以及置信度(是否含有物体),并且各个位置设置不同尺度和比例的先验框,所以RPN预测的是边界框相对于先验框的offsets值,采用先验框使得模型更容易学习。所以YOLOv2移除了YOLOv1中的全连接层而采用了卷积和anchor boxes来预测边界框。
-
定义方法:YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标:
d(box, centroid) = 1 - IOU(box, centroid)
-
计算公式:预测边界框中心点相对于对应cell左上角位置的相对偏移值,为了将边界框中心点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度看做1)。总结来看,根据边界框预测的4个offsets t x , t y , t w , t h t_x, t_y, t_w, t_h tx,ty,tw,th ,可以按如下公式计算出边界框实际位置和大小。
- 其中 ( c x , c y ) (c_x, c_y) (cx,cy) 为cell的左上角坐标,在计算时每个cell的尺度为1。由于sigmoid函数的处理,边界框的中心位置会约束在当前cell内部,防止偏移过多。
- p w p_w pw 和 p h p_h ph 是先验框的宽度与长度,它们的值也是相对于特征图大小的,在特征图中每个cell的长和宽均为1。
- t w t_w tw 和 t h t_h th是神经网络输出的一个值,表示锚框宽度和高度的对数偏移量。
- 为了将预测的偏移量转换为实际的宽度,使用指数变换。通过对偏移量取指数,公式能够生成一个正值宽度。这个变换确保了预测的宽度总是正的,因为宽度不能为负数。通过将先验框宽度和长度 p w p_w pw 和 p h p_h ph乘上偏移量,得到预测框宽度和长度 b w b_w bw 和 b h b_h bh。
- 补充理解------从预测值到实际边界框尺寸:
神经网络输出的是相对于锚框的对数偏移量,通过对这个偏移量取指数并乘以锚框的宽度,可以得到实际的边界框宽度。这种方法有助于稳定训练,因为网络只需要预测相对较小的对数偏移量,而不是直接预测绝对尺寸。
- 补充理解------从预测值到实际边界框尺寸:
-
结果:YOLOv1只能预测98个边界框( 7x7x2 ),而YOLOv2使用anchor boxes之后可以预测上千个边界框( 13x13xnum_anchors )。所以使用anchor boxes之后,YOLOv2的召回率大大提升,由原来的81%升至88%。
引入DarkNet-9
- 定义:包括19个3x3的卷积层和5个maxpooling层。采用 2x2 的max pooling层之后,特征图维度降低2倍,而同时将特征图的channles增加两倍(可以从表格里看出来)。Darknet-19最终采用global avgpooling做预测,并且在 3x3 卷积之间使用 1x1 卷积来压缩特征图channles以降低模型计算量和参数。
- 和Batch Norm的关系:Darknet-19每个卷积层后面同样使用了batch norm层以加快收敛速度,降低模型过拟合。
- 结果:在ImageNet分类数据集上,Darknet-19的top-1准确度为72.9%,top-5准确度为91.2%,但是模型参数相对小一些。使用Darknet-19之后,YOLOv2的mAP值没有显著提升,但是计算量却可以减少约33%。
多尺度输入训练
- 定义:在训练过程中每间隔一定的iterations之后改变模型的输入图片大小。在训练过程,每隔10个iterations随机选择一种输入图片大小,然后只需要修改对最后检测层的处理就可以重新训练。
- 结果:在VOC 2007数据集上的效果为:采用较小分辨率时,YOLOv2的mAP值略低,但是速度更快,而采用高分辨输入时,mAP值更高,但是速度略有下降,对于 544x544 ,mAP高达78.6%。
网络训练
第一阶段:在ImageNet上预训练Darknet-19
- 模型输入 :
- 输入尺寸为 ( 224 × 224 ) (224 \times 224) (224×224)。
- 在ImageNet分类数据集上进行训练,共训练160个epochs。
第二阶段:在ImageNet上调整输入尺寸并finetune
-
调整输入尺寸:
- 输入尺寸调整为 ( 448 × 448 ) (448 \times 448) (448×448)。
- 继续在ImageNet数据集上进行finetune,训练10个epochs。
-
分类模型准确度:
- Top-1准确度为76.5%。
- Top-5准确度为93.3%。
第三阶段:将分类模型转换为检测模型,并在检测数据集上fine tune
-
网络结构修改:
- 移除最后一个卷积层、全局平均池化层(global avgpooling layer)以及Softmax层。
- 新增三个卷积层。
- 增加一个passthrough层(用于结合不同尺度的特征)。
-
输出预测结果的卷积层:
- 使用一个 ( 1 × 1 ) (1 \times 1) (1×1) 的卷积层来输出预测结果。
-
输出channels数:
- 由于anchors数为5,对于VOC数据集,输出的channels数为125;对于COCO数据集,输出的channels数为425。
- 具体来说,对于VOC数据集,输出的预测矩阵形状为 ( 13 × 13 × 125 ) (13 \times 13 \times 125) (13×13×125)。
- 其中,125是因为每个网格单元预测5个边界框,每个边界框包括4个位置坐标(x, y, w, h)、1个置信度和20个类别的预测(4 + 1 + 20)× 5 = 125。
具体的输出矩阵解释
-
预测矩阵形状:
- 对于VOC数据集,最终的预测矩阵为 (13 \times 13 \times 125)(假设特征图尺寸为13x13)。
- 可以将其reshape为 (13 \times 13 \times 5 \times 25)。
-
具体含义:
- (25) 表示每个边界框的预测值,分为:4个边界框的位置和大小((b_x, b_y, b_w, b_h)),1个边界框的置信度(confidence),以及20个类别的预测值(classes)。
- 具体来说:
- (b_x, b_y, b_w, b_h) 为边界框的位置和大小。
- confidence 为边界框的置信度。
- classes 为类别预测值。
总结
YOLOv2的训练过程分为三个阶段:
- 在ImageNet上预训练Darknet-19,输入尺寸为 (224 \times 224)。
- 调整输入尺寸为 (448 \times 448),在ImageNet上finetune分类模型。
- 修改分类模型为检测模型,并在检测数据集上finetune,增加新的卷积层和passthrough层,调整输出channels数以适应目标检测任务。
通过这三个阶段,YOLOv2模型能够有效地进行分类和检测任务,适应不同尺度和长宽比的物体,提高检测精度和速度。
优化方向
- 检测不同大小的目标可能不够灵活
- 原因:YOLOv2只在最后一个特征图上进行预测
- 改进建议:在不同尺度的特征图上进行预测,这使得模型能够更好地检测不同大小的目标,特别是小目标。
- 没有充分利用浅层特征,这些特征对检测小物体非常重要
- 改进建议:引入特征金字塔网络(Feature Pyramid Network, FPN),使用了更多层的特征图进行检测。
- 特征提取网络深度较浅,限制了其特征提取能力
- 改进建议:采用更深的特征提取网络和残差连接(ResNet),提高特征提取的能力和模型表现