【论文笔记】YOLO系列
【深度学习】总目录
YOLOv1:《You Only Look Once: Unified, Real-Time Object Detection》one-stage的开山之作,将目标检测看作回归问题,直接从图像像素得到边界框坐标和类别概率。
YOLOv2:《YOLO9000: Better, Faster, Stronger》借鉴了Faster R-CNN中的anchor box策略,使用聚类的方法得到anchor的维度。
YOLOv3:《YOLOv3: An Incremental Improvement》加入了FPN的结构,类别预测时把softmax改为sigmoid,网络结构由darknet19改为darknet53。
YOLOv4:《YOLOv4: Optimal Speed and Accuracy of Object Detection》分别从 Bag of freebies, Bag of specials来讨论了小技巧的改进。
Introduction
当时比较经典的目标检测算法:
- DPM计算梯度方向直方图,用SVM训练得到物体的梯度模板,然后用滑动窗口的方法使得模板和目标匹配。模板需要人工设计,鲁棒性差。
- RCNN首先产生2k多个候选框,然后在候选框上运行分类器并进行边界回归。精度高但由于每部分要单独训练,整个过程运行缓慢,难以优化。Fast-RCNN整张图片送入神经网络,获得共享的特征。Faster-RCNN用单独的RPN网络挑选候选框。但是这都是两阶段,需要先提取候选框。
YOLO无需提取候选区域,正如其名You Only Look Once,只需要看一次就能预测目标是什么,在哪里。YOLO把目标检测看作是回归问题,用单一的卷积网络同时预测回归框和类别可能性,在整张图像上训练并且直接优化检测表现。
YOLOv1
- 任少卿等人提出增加卷积层和全连接层在预训练网络时可以提高表现能力。根据他们的经验,YOLO总共24个卷积层和2个全连接层,并进行随机初始化权重。
- 卷积层在ImageNet数据集224×224上进行预训练,然后增加网络的输入分辨率至448×448,因为目标识别通常需要细粒度的视觉信息。
- 在最后的层用线性激活函数,其他层用leaky ReLU:
1. 将输入图片划分为S×S的网格,
- 在训练阶段,如果物体中心落入一个网格,这个网格就负责预测物体。每个网格预测B个边界框和置信度,以及C个类别概率。
每个边界框包括5个预测值:x, y, w, h和c,其xywh都经过归一化,(x,y)坐标是相对于网格的边界框中心,w,h是相对于整图的宽高。
置信度为Pr(Object)*IOU,如果网格中没有物体,置信度则为0,若有物体置信度就是预测框与真实框之间的交并比。可以看出,置信度既反映了边界框包含物体的可能性,又反映了预测的精确度。
类别概率Pr(Classi|Object)是条件概率,即当网格中有物体时是某一类别的概率。将置信度和类别概率相乘,得到具体某个类别的概率。最大的概率对应的类别就是该网格对应的类别。
- 在测试阶段,每张图直接获得S×S×(5×B+C)个张量,再进行置信度过滤,NMS后处理得到目标检测结果。
2. 每个网格只能检测一个物体,每个网格生成的B个边界框中,与真实框IOU最大的边界框负责预测这个物体。
3. 包含物体的边界框和不包含物体的B-1个边界框分别进行损失计算。obj代表包含物体,noobj代表不包含物体。损失由下面5部分组成,每一项都是平方和误差,将目标检测问题当做回归问题:
(1)负责预测物体的边界框的中心定位误差
遍历S×S×B个边界框,负责预测物体的边界框需满足1)其对应的网格包含物体的中心点,2)在网格对应的B个框中该边界框IOU最大。
(2)负责预测物体的边界框的宽高定位误差
平方差误差将大边界框和小边界框的误差同等看待,求根号能使小框对误差更敏感。
(3)负责预测物体的边界框的置信度误差
其中,Ci是预测的置信度,由模型正向推断结果S×S×(5×B+C)维向量中找到对应边界框的置信度。C^i是标签值,由这个边界框和真实框的IOU计算得到。
(4)不负责预测物体的边界框的置信度误差
不负责预测物体的边界框有两类:1)没有包含物体的网格对应的B个边界框 2)包含物体的网格对应的B-1个IOU较小的边界框。在每幅图像中,许多网格单元不包含任何物体,置信度分数为零,这样过分增强了包含物体的网格的梯度,可能会导致模型不稳定,导致训练在早期出现分歧。通过增加边界框坐标的损失(令λcoord =5),减少不包含物体的置信度的损失(令λnoobj =0.5),来弥补这个问题。
(5)负责预测物体的网格的分类误差
计算包含真实框中心的网格的分类误差,这个pi是由置信度和类别概率相乘得到的。
优点
- 非常快,因为我们把目标检测看作是回归问题,不用再分几步走。在测试时预测物体只需要对一张图做卷积网络。我们的基础网络在TitanX gpu上每秒可以预测45张(with no batch),更快的版本可以做到150fps。这就意味着YOLO可以实时处理视频流,延迟小于25ms。YOLO的平均精确度是其他实时系统的两倍多。
- YOLO在做预测时,会对图像进行全局性的分析。与滑动窗口和区域提取策略不同,YOLO在训练和测试阶段隐式地编码类及其外观的上下文信息。fastrcnn,总是把背景当作目标由于不能分析更大的上下文,而yolo减少了一半背景错误。
- YOLO学习了物体更普遍的特征。在自然图片上训练,在艺术作品上测试,yolo的表现比DPM和R-CNN都要好的多。yolo的高普适性使得它在运用于新领域或者有新的输入时表现更好。
缺点
- 由于将图片分为7×7共49个网格,每个网格只预测一个物体,整个图片只能预测49个物体,因此在预测小目标和密集目标时性能比较差。
- 难以泛化到新的或不寻常的长宽比的目标
- 大量的下采样层使得边界框的特征是较粗粒度的信息
YOLOv2
论文引入了YOLOv2和YOLO9000,YOLOv2对原来的YOLOv1多目标检测框架进行了改进,在保持原有速度的优势之下,精度上得以提升。同时,提出了一种目标分类与检测的联合训练方法,通过这种方法,YOLO9000(略)可以同时在COCO和ImageNet数据集中进行训练,训练后的模型可以实现多达9000种物体的实时检测。
YOLOv1和Fast-RCNN相比,定位误差多且召回率低。如下表所示,在YOLOV2中,作者做出了10点改进,主要分为Anchor,网络结构,训练技巧三个部分:
引入Anchor
YOLOv1在卷积提取特征后利用全连接层直接预测边界框的坐标。YOLOv2移除YOLOv1的全连接层,借鉴Faster R-CNN的思想,引入anchor box。为使卷积层的输出有更高的分辨率,移除池化层。其次,输入从448变为416,因为YOLOv2模型下采样的总步长为32,对于416×416大小的图片,最终得到的特征图大小为13×13,维度是奇数,这样特征图恰好只有一个中心位置。大的目标往往会占据图像的中心,所以最好在中心有一个位置来预测这些物体。输出feature map大小为13×13,每个cell有5个anchor box预测得到5个bounding box,一共有13×13×5=845个box。使用anchor box使得精度损失了一点但是recall提升了,这意味着我们的模型有更多提高的空间。
在使用Anchor box时遇到两个问题:
1. Anchor box的尺寸如何选择?网络可以学习适当地调整方框,但如果我们从网络开始选择更好的优先级,我们可以使网络更容易学习预测良好的检测。我们在训练集边界框上运行k-means聚类来自动找到好的先验值,而不是手动选择先验值。聚类得到的anchor box更多的是高瘦的而不是矮胖的。当k=5时的聚类和9个手动选择Anchor的平均IOU差不多,当k=9时,聚类的效果比手动选择的好很多。这表明,使用k-means生成边界框可以更好地表示模型,并使任务更容易学习。
2. 模型的稳定性(尤其时迭代早期)。在基于region proposal的目标检测算法中,是通过预测tx和ty来得到(x,y)值,也就是预测的是offsets。
这个公式是无约束的,预测的边界框很容易向任何方向偏移。因此,每个位置预测的边界框可以落在图片任何位置,这导致模型的不稳定性,在训练时需要很长时间来预测出正确的偏移。
YOLOv2对每个网格预测5个边界框,每个边界框预测5个坐标,tx,ty,tw,th和to。如果网格距离图像左上角偏移(cx,cy),边界框具有宽度和高度pw,ph,然后这些预测对应于:
当我们限制了坐标预测,参数变得更易学习,网络变得更加稳定。用聚类和直接预测边界框中心位置提高了5%的表现。
网络结构改进
- 大多数目标检测框架以VGG16作为特征提取器,VGG16计算量太大,YOLO是基于Googlenet架构的,Googlenet比VGG16快,但是精度上略逊于VGG,我们提出了新的分类模型Darknet-19。与VGG相似,大量使用3×3的卷积,每次池化后加倍通道数。
- 根据Network in Network,利用全局平均池化做预测,以及在3×3卷积之间用1×1卷积压缩通道数。
- bn可以显著提高收敛性,同时消除对其他形式正则化的需求。增加bn层后提高了2%的mAP,同时起到一定的正则化作用,可以移除Dropout也不用担心模型会过拟合。
- 使用全卷积网络,将YOLOv1中的后两层全连接去掉,换成卷积。一共是19个卷积,5个最大池化层。
- YOLOv2在13×13的特征图上预测目标。这对大物体来说足够了,但小物体用更细粒度的特征图会更好。Faster R-CNN和SSD都在不同特征图上运行区域提议网络以获得一系列分辨率。我们采用一个不一样的方法,简单地将前面层的26×26特征传到后面。这个passthrough层将相邻特征叠加到不同通道而不是空间位置,将高分辨率特征与低分辨率特征连接起来,与ResNet中的恒等映射类似。将26×26×512的特征图转换为13×13×2048的特征图,然后与13×13×1024的特征图concatenate为13×13×3072,这样detector就获得了细粒度的特征。这么做提升了1%的表现。
训练技巧
- hi-res classifier。最初YOLO在224×224的数据集上训练网络的分类部分,提高分辨率至448训练检测部分。这样网络可能难以适应新的输入分辨率。现在YOLOV2先在ImageNet 448×448分辨率训练10epochs,使网络适应更高的输入分辨率,然后再识别时进行微调。
- Multi-Scale Training。每10个batch,网络会随机选择新的尺寸。由于网络下采样倍率为32,我们的图片尺寸为{320, 352, ..., 608},都是32的倍数。resize网络然后继续训练。这使得网络在不同输入维度的时候预测效果好。
目标分类与检测的联合训练
分类训练:先在ImageNet1000分类的标准数据集224×224上训练160个epochs,使用SGD,起始学习率lr=0.1,weight decay=0.0005,momentum=0.9,做随机裁剪,旋转,饱和度等数据增强,然后再微调网络适应448×448的输入,训练10个epoches后lr=10-3.由于高分辨率的输入,top-1准确率增加了3.6%,top5准确率增加了2.1%。
检测训练:将网络最后的卷积层移除,增加1×1的卷积,增加3个3×3的卷积。在VOC数据集中预测5个boxes,每个box5个坐标以及20个分类,一共是5*(5+20)=125个。同时增加passthrough层,到倒数第二个卷积层,以便我们的模型可以使用细粒度特征。训练160epochs,起始lr=10-3,在60和90epochs时除以10。weight decay=0.0005 ,momentum=0.9。
YOLOv3
预测边界框
与YOLOv2相同,利用聚类得到先验框Anchor box,网络为每个边界框预测4个坐标,利用4个坐标+Anchor box可以推算出预测框的坐标,在训练中使用均方误差。
与YOLOv2不同的是,预测框的置信度利用逻辑回归,每个grid cell产生3个Anchor box,有3个尺度的特征图,总共9个Anchor box, 与GT的IOU最大的Anchor负责拟合该GT,作为正样本,此预测框(Anchor)的置信度为1,不再是IOU。正样本会在损失函数中的每一项产生贡献。对于与GT的IOU>0.5,但不是最大的Anchor,忽略,不产生损失。对于与GT的IOU<0.5,作为负例,在置信度一项产生贡献。每个预测框的可能类别预测,我们采用多标签分类,由于softmax不是必要的,因此使用各个类别独立的逻辑回归。在训练时使用二分类交叉熵损失函数。
❓ YOLOv1/v2中使用IOU作为置信度标签有何不好?
💬 对检测小物体而言,confidence score如果仅仅是用bounding box和ground truth的IOU预测,那么confidence score始终很小,无法有效学习,导致检测的recall不高。
❓ 为什么要有忽略样例?
💬由于 YOLOv3 使用了多尺度的 feature map 进行检测,而不同尺度的feature map之间会有重合检测的部分。例如检测一个物体,在训练时他被分配到的检测框是第一个 feature map 的第三个bounding,IOU 达0.98,此时恰好第二个 feature map 的第一个 bouniding box 与该 ground truth 的 IOU 达0.95,也检测到了该 ground truth,如果采用非极大值抑制(NMS)的话,此时给其 confidence score 强行打0的标签,网络学习效果会不理想。
损失函数
损失函数分为三部分,置信度损失和类别置信度损失计算由平方和误差改为交叉熵:
(1)正样本定位误差
其中,(2-wi×hi)是惩罚小框因子,当预测的物体越小越接近于2,当预测的物体越大越接近于1.
(2)正样本置信度和类别误差
其中,^ci为标签值(非0即1),ci是预测值(0-1之间),BCE(^ci,ci)=-^cilog(ci)
(3)负样本置信度误差
多尺度目标检测
受到FPN特征金字塔的启发,从特征提取的骨干网络取出不同尺度的特征,每个尺度的特征都是255通道。其中255是指,3个Anchor对应三个预测框,每个预测框预测5个参数(tx,ty,tw,th,to),COCO数据集有80个类别,3*(5+80)=255。
YOLOv1 输入448×448 输出7×7×(5×2+C)划分为7×7个grid cell,每个grid cell预测2个bounding box 预测框总数 7×7×2=98
YOLOv2 输入416×416 输出13×13×5×(5+C)划分为13×13个grid cell,每个grid cell预测5个Anchor 预测框总数 13×13×5=845
YOLOv3 输入256×256 输出三个尺度 —32×32×3×(5+C)小物体
—16×16×3×(5+C)中物体
—8×8×3×(5+C)大物体
预测框总数 (8×8+16×16+32×32)×3=4032
将不同尺度的特征进行两倍上采样,然后沿通道方向concat。这使我们从上采样的特征中获得更有意义的语义信息,并从早期的特征映射中获得更细粒度的信息。我们增加一些卷积层处理叠加的feature map,最后得到的tensor是之前的两倍。
小目标改进与无用功
yolov3在mAP指标IOU=0.5或者说AP50时,几乎与RetinaNet内不相上下,而远高于SSD变体。然而,随着IOU阈值的增加,性能显著下降。这表明YOLOv3精于找到物体相对应的box,但是很难精准定位。
在小目标上做的改进
1. grid cell个数增加,相应的预测框个数增加,同时兼容任意图片的输入,输入的图片越大,产生的预测框越多
2. Anchor 预先设置的Anchor中有针对小目标的尺寸
3. 多尺度预测(FPN)
4. 损失函数惩罚小框项
5. 网络结构(骨干网络跨层连接)
无用功
1. 我们尝试使用正常的锚定框预测机制,即使用线性激活预测x,y偏移为框宽或高度的倍数。
2. 在预测x,y偏移时用线性激活取代逻辑激活,导致mAP下降了几个点。
3. 尝试使用Focus loss,但mAP下降了两个点。YOLOv3对于Focus loss试图解决的问题具有足够的鲁棒性,因为它有单独的目标预测和条件类别预测。
4. 双IOU阈值和真值分配。Faster R-CNN在训练时使用双IOU阈值,如果预测框和真实框的IOU>0.7,就是正样本,IOU在0.3-0.7之间会被忽略,而小于0.3为负样本。我们用相同的策略没有得到好的结果。
YOLOv4
yolov4并没有对前面存在的问题进行针对性改进,而是对视觉领域的各种图像处理与检测技术进行融合,吸收各处理方法的优点,提出了一个超高检测速度的yolo模型。主要提出两个包 Bag of Freebies(免费包)和Bag-of-Specials(特赠包)
- Bag of Freebies:指的是那些不增加模型复杂度,也不增加推理的计算量的训练方法技巧,来提高模型的准确度
1)数据增强:图像几何变换(随机缩放,裁剪,旋转),Cutmix,Mosaic等
2)网络正则化:Dropout,Dropblock等
3) 损失函数的设计:边界框回归的损失函数的改进 CIOU
- Bag-of-Specials:指的是那些增加少许模型复杂度或计算量的训练技巧,但可以显著提高模型的准确度
1)增大模型感受野:SPP、ASPP等
2)引入注意力机制:SE、SAM
3)特征集成:PAN,BiFPN
4)激活函数改进:Swish、Mish
5)后处理方法改进:soft NMS、DIoU NMS
参考文献
4. YOLO系列论文精读
5. YOLO_v4讲解