当前位置:   article > 正文

YOLOの详细解析_对yolo数据集进行筛选

对yolo数据集进行筛选

由于最近要换一份工作,遂作此文,挖坑,一周以内填满。

YOLO V1

Network

Our network has 24 convolutional layers followed by 2 fully connected layers. Instead of the inception modules used by GoogLeNet, we simply use 1*1 reduction layers followed by 3*3 convolutional layers.

Loss

It is to make the grid points containing objects have more weight in the loss function, so that the model "pays more attention" to the loss caused by the grid points containing objects. λcoord   and λnoob j  are 5 and 0.5, respectively.

Train

Backbone -> ImageNet 1000-class Darknet

Head -> Detection 448*448

We normalize the bounding box width and height by the image width and height so that they fall between 0 and 1. We parameterize the bounding box x and y coordinates to be offsets of a particular grid cell location so they are also bounded between 0 and 1.

Leaky relu 0.1

Infer

Pr⁡Class  i∣ Object )*Pr⁡(  Object )*  IOU  pred truth =Pr⁡Class  i  *  IOU  pred truth 

It divides the image into an S*S grid and for each grid cell predicts B bounding boxes, confidence for those boxes, and C class probabilities. These predictions are encoded as a S×S×B*5+C  tensor.

S×S=Grid

B=x1,y1,x2,y2,confidence

C=0.1,0.2…. all class

NMS, remove the extra boxes.

Evaluation

  • YOLO does not perform well in detecting objects that are close to each other (when they are next to each other and their midpoints fall on the same grid). The same grid cell detects the same object class.
  • When objects appear unusually width and height will hard to detect.
  • YOLOv1 only uses high-level features for positioning, while low-level features are good for positioning and high-level features are good for classification, the effect is not very good.
  • End-to-end training. The back propagation of the loss function can run through the entire network, which is also the advantage of the one-stage detection algorithm
  • In this network, the learning of each grid is carried out separately, which leads to the need for a large number of training images in order for the loss to be transmitted to each grid.

YOLO V2

Network

Darknet-19, We modify this network for detection by removing the last convolutional layer and instead adding on three 3*3 convolutional layers with 1024 filters each followed by a final 1*1 convolutional layer with the number of outputs we need for detection.

Improvement

1. Batch Normalization

The BN layer is added on the basis of V1, which is behind the Conv layer, and the Dropout is removed. After adding the BN layer, it brings a 2% improvement to YOLO's mAP, which also illustrates the important role of BN.

2. High Resolution Classifier 448*448

3. Convolutional With Anchor Boxes

At the same time, in order to further increase the number of candidate frames, the last feature map size used for prediction in YOLO V2 is 1/32 of the original image (YOLO V1 is 1/64). Since 448/32 = 14, the image center point is 4 points, this will cause the center point of the object in the center of the image to fall in the 4 Grid Cells, which is inconvenient to allocate, so the author changed the size of the input image to 416 (416/32 = 13) There is only one center point.  After adding the Anchor concept, mAP was reduced from 69.5% to 69.2%, but Recall increased from 81% to 88%, which also provided the possibility for subsequent optimization.

4 Dimension Clusters

Clustering with k=5 uses a clustering (K-means) strategy to select the most representative 5 sizes as the size of the Anchor candidate frame.

d(box, centroid) = 1 - IOU(box; centroid)

5 Direct Location Prediction

The blue is the position that needs to be predicted, the black dashed line is the Anchor position, the output istx,ty,tw,th , and σ  is the sigmoid function

6. Fine-Grained Features

7. Multi-Scale Training

Selection of scale: from 320 to 608, {320, 352... 608}, select a scale every 32 pixel.

YOLO V3

Network

Improvement

  • Bounding Box Prediction
  • Class Prediction
  • Predictions Across Scales
  • Feature Extractor

Bounding Box Prediction

其中,cx , cy 是feature map中grid cell的左上角坐标,yolov3中每个grid cellfeature map中的宽和高均为1 这也就解释了为什么用sigmoid的原因。如下图1的情形时,这个bbox边界框的中心属于第二行第二列的grid cell,它的左上角坐标为(1,1),故cx =1, cy =1.公式中的pwph 是预设的anchor box映射到feature map中的宽和高

bx&=σtx+cxby&=σty+cybw&=pwetwbh&=pheth

最终得到的边框坐标值是bx,by,bw,bh即边界框bbox相对于feature map的位置和大小,是我们需要的预测输出坐标。但我们网络实际上的学习目标是tx,ty,tw,th这4个offsets,其中tx,ty是预测的坐标偏移值,tw,th是尺度缩放,在第一步的缩放是有灰度填充的。(128, 128, 128

YOLO3为每种FPN预测特征图(13*13,26*26,52*52)设定3种anchor box,总共聚类出9种尺寸的anchor box。在COCO数据集这9个anchor box是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。这些坐标是相对于(416,416)来说的。

在Fast-RCNN中公式如下,

tx&=Gx-Px/Pwty&=Gy-Py/Phtw&=logGw/Pwth&=logGh/Ph

Pw、Ph是预设的anchor box的在feature map上的宽和高。至于Gx、Gy、Gw、Gh自然就是ground truth在这个feature map的4个坐标了Gx-Px/Pw 而大的anchor box肯定更能容忍大点的偏移量,小的anchor box对小偏移都很敏感,故除以宽和高可以权衡不同尺度下的预测坐标偏移量。

这里就有个重要的疑问了,一个尺度的feature map有三个anchors,那么对于某个ground truth框,究竟是哪个anchor负责匹配它呢?和YOLOv1一样,对于训练图片中的ground truth,若其中心点落在某个cell内,那么该cell内的3anchor box负责预测它,具体是哪个anchor box预测它,需要在训练中确定,即由那个与ground truthIOU最大的anchor box预测它,而剩余的2anchor box不与该ground truth匹配。

YOLOv3需要假定每个cell至多含有一个grounth truth,而在实际上基本不会出现多于1个的情况。与ground truth匹配的anchor box计算坐标误差、置信度误差(此时target为1)以及分类误差,而其它的anchor box只计算置信度误差(此时target为0)。在训练过程中划分正负样本是非常重要的,因为anchor很多,只有对一大堆anchor box划分了正负样本,才能有效地用正样本参与损失函数训练。

但问题是三个检测层,那么多anchor box,如果只把gt匹配一个anchor,那么正样本数量会极其稀少,训练会极为不利。那么究竟是如何划分正负样本呢?假设iou阈值为0.7,所有瞄点框与真实标签进行匹配,需要构造 IOU 矩阵,每一行代表一个瞄点框,行数代表anchor box数量,每一列代表一个真值框,列数代表gt的个数。

然后执行 3 个标准:1.对于任何一个瞄点框,与所有标签的最大 IOU 小于 0.3,则视为负样本;2.对于任何一个真值,与其有最大 IOU 的瞄点框视为正样本;3.对于任何一个瞄点框,与所有真值框的最大 IOU 大于 0.7 则视为正样本。这样的三个标准顺序不能变动,保证了多个瞄点框对应一个真值,而一个真值框不能对应多个瞄点框。

有了平移(tx,ty)和尺度缩放(tw,th)才能让anchor box经过微调与grand truth重合。如图3,红色框为anchor box,绿色框为Ground Truth,平移+尺度缩放可实线红色框先平移到虚线红色框,然后再缩放到绿色框。边框回归最简单的想法就是通过平移加尺度缩放进行微调嘛。

边框回归为何只能微调?当输入的 Proposal 与 Ground Truth 相差较小时,,即IOU很大时(RCNN 设置的是 IoU>0.6), 可以认为这种变换是一种线性变换, 那么我们就可以用线性回归(线性回归就是给定输入的特征向量 X, 学习一组参数 W, 使得经过线性回归后的值跟真实值 Y(Ground Truth)非常接近. 即Y≈WX )来建模对窗口进行微调, 否则会导致训练的回归模型不work(当 Proposal跟 GT 离得较远,就是复杂的非线性问题了,此时用线性回归建模显然就不合理了)

Log函数明显不满足线性函数, 但是为什么当Proposal Ground Truth相差较小的时候, 就可以认 为是一种线性变换呢? 大家还记得这个公式不? 参看高数 1 .

limz=0 log⁡(1+x)=x

现在回过来看公式:

tw=log⁡Gw/Pw=log⁡Gw+Pw-PwPw=log⁡1+Gw-PwPw

当且仅当 Gw-Pw=0  的时候, オ会是线性函数, 也就是宽度和高度必须近似相等。那么训练时用的ground truth的4个坐标去做差值和比值得到tx,ty,tw,th,测试时就用预测的bbox就好了,公式修改就简单了,把Gx和Gy改为预测的x,y,Gw、Gh改为预测的w,h即可。

网络可以不断学习tx,ty,tw,th偏移量和尺度缩放,预测时使用这4个offsets求得bx,by,bw,bh这个公式tx,ty为何要sigmoid一下啊,因为yolo设定一个物体的中心只能落在一个cell中。

Loss

而在yolov2和v3里,损失函数进行了改进,不再简单地加根号了,而是用scale = 2 - groundtruth.w * groundtruth.h加大对小框的损失。

Confidence

confidence是什么,Pr(Object) ∗ IOU(pred&groundtruth)如果某个grid cell无object则Pr(Object) =0,否则Pr(Object) =1,则此时的confidence=IOU,即预测的bbox和ground truth的IOU值作为置信度。因此这个confidence不仅反映了该grid cell是否含有物体,还预测这个bbox坐标预测的有多准。

YOLO V4

CSP

论文提出Cross Stage Partial(CSP)结构,其初衷是减少计算量并且增强梯度的表现。主要思想是:在输入block之前,将输入分为两个部分,其中一部分通过block进行计算,另一部分直接通过一个shortbut进行concatenate。

Network

Improvement

  • 输入端:采用Mosaic数据增强
  • Backbone:采用了CSPDarknet53、Mish激活函数、Dropblock等方式
  • Neck:采用了SPP(按照DarknetAB的设定)、FPN+PAN结构
  • 输出端:采用CIOU_Loss、DIOU_Nms操作

A complete Object detection framework

Input: Image, Patches, Image Pyramid

Backbones: VGG16, ResNet-50, SpineNet, EfficientNet-B0/B7 [75], CSPResNeXt50, CSPDarknet53

Neck:

Additional blocks: SPP, ASPP, RFB, SAM

Path-aggregation blocks: FPN, PAN, NAS-FPN, Fully-connected FPN, BiFPN, ASFF, SFAM

Heads:

Dense Prediction (one-stage):

  1. anchor based

RPN, SSD, YOLO, RetinaNet

  1. anchor free

CornerNet, CenterNet, MatrixNet, FCOS

Sparse Prediction (two-stage):

  1. anchor based

Faster R-CNN, R-FCN, Mask RCNN

  1. anchor free

RepPoints

YOLO V5

FPN, PAN

Feature Pyramid Networks for Object Detection自顶向下,将高层的强语义特征传递下来

Path Aggregation Network for Instance Segmentation 路径聚合网络 自底向上的,对FPN补充,将低层的强定位特征传递上去

Network

Improvement

  1. Data Augmentation

YOLO V4使用了多种数据增强技术的组合,对于单一图片,使用了几何畸变,光照畸图像,遮挡(Random Erase,Cutout,Hide and Seek,Grid Mask ,MixUp)技术,对于多图组合,作者混合使用了CutMix与Mosaic 技术。除此之外,作者还使用了Self-Adversarial Training (SAT)来进行数据增强。

YOLOV5会通过数据加载器传递每一批训练数据,并同时增强训练数据。数据加载器进行三种数据增强:缩放,色彩空间调整和马赛克增强。据悉YOLO V5的作者Glen Jocher正是Mosaic Augmentation的创造者

  1. Backbone

YOLO V5和V4都使用CSPDarknet作为Backbone从输入图像中提取丰富的信息特征。CSPNet解决了其他大型卷积神经网络框架Backbone中网络优化的梯度信息重复问题,具体做法是:将梯度的变化从头到尾地集成到特征图中,减少了模型的参数量和FLOPS数值,既保证了推理速度和准确率,又减小了模型尺寸。

CSPNe思想源于Densnet,复制基础层的特征映射图,通过dense block 发送副本到下一个阶段,从而将基础层的特征映射图分离出来。这样可以有效缓解梯度消失问题(通过非常深的网络很难去反推丢失信号) ,支持特征传播,鼓励网络重用特征,从而减少网络参数数量。CSPNet思想可以和ResNet、ResNeXt和DenseNet结合,目前主要有CSPResNext50 and CSPDarknet53两种改造Backbone网络。

  1. Neck

Yolov5Yolov4不同点在于,Yolov4中只有主干网络使用了CSP结构,而Yolov5中设计了两种CSP结构,以Yolov5s网络为例,以CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中。

YOLO V5和V4都使用PANET作为Neck来聚合特征。Neck主要用于生成特征金字塔,增强模型对于不同缩放尺度对象的检测,从而能够识别不同大小和尺度的同一个物体。

在PANET之前,一直使用FPN(特征金字塔)作为对象检测框架的特征聚合层,PANET在借鉴 Mask R-CNN 和 FPN 框架的基础上,加强了信息传播。

PANET基于 Mask R-CNN 和 FPN 框架,同时加强了信息传播。该网络的特征提取器采用了一种新的增强自下向上路径的 FPN 结构,改善了低层特征的传播。第三条通路的每个阶段都将前一阶段的特征映射作为输入,并用3x3卷积层处理它们。输出通过横向连接被添加到自上而下通路的同一阶段特征图中,这些特征图为下一阶段提供信息。同时使用自适应特征池化(Adaptive feature pooling)恢复每个候选区域和所有特征层次之间被破坏的信息路径,聚合每个特征层次上的每个候选区域,避免被任意分配。

  1. Head

最后三个特征图是不同缩放尺度的Head被用来检测不同大小的物体,每个Head一共(80个类 + 1个概率 + 4坐标) * 3锚定框,一共255个channels。

  1. Activation Function

yolo5的作者使用了 Leaky ReLU 和 Sigmoid 激活函数。yolo5中中间/隐藏层使用了 Leaky ReLU 激活函数,最后的检测层使用了 Sigmoid 形激活函数。而YOLO V4使用Mish激活函数。

  1. Optimization Function

YOLO V5的作者提供了两个优化函数Adam和SGD(默认),并都预设了与之匹配的训练超参数。YOLO V4使用SGD。

YOLO V5的作者建议是,如果需要训练较小的自定义数据集,Adam是更合适的选择,尽管Adam的学习率通常比SGD低。但是如果训练大型数据集,对于YOLOV5来说SGD效果比Adam好。

  1. Cost Function

YOLO 系列的损失计算是基于 objectness score, class probability score,和 bounding box regression score. YOLO V5使用 GIOU Loss作为bounding box的损失。YOLO V5使用二进制交叉熵和 Logits 损失函数计算类概率和目标得分的损失。同时我们也可以使用fl_gamma参数来激活Focal loss计算损失函数。

YOLO V4使用 CIOU Loss作为bounding box的损失,与其他提到的方法相比,CIOU带来了更快的收敛和更好的性能。

YOLO X

YOLOX: Exceeding YOLO Series in 2021

Yolox-Nano,网络参数只有0.91M。Yolox-Tiny,Yolox-Darknet53是在Yolov3-SPP的基础上进行的改进Yolox-s

是在Yolov5-s的基础上进行的改进,Yolox-m,Yolox-l,Yolox-x

Network

Improvement SPP

  • 添加了EMA权值更新、Cosine学习率机制等训练技巧
  • 使用IOU损失函数训练reg分支,BCE损失函数训练cls与obj分支
  • 添加了RandomHorizontalFlip、ColorJitter以及多尺度数据增广,移除了RandomResizedCrop

Data Augmentation Mosaic+Mixup

通过随机缩放、随机裁剪、随机排布的方式进行拼接,对于小目标的检测效果提升

主要来源于2017年,顶会ICLR的一篇论文《mixup: Beyond Empirical Risk Minimization》

先读取一张图片,图像两侧填充,缩放到640*640大小,即Image_1,人脸检测框为红色框。再随机选取一张图片,图像上下填充,也缩放到640*640大小,即Image_2,人脸检测框为蓝色框。然后设置一个融合系数,比如上图中,设置为0.5,将Image_1和Image_2,加权融合,最终得到右面的Image。从右图可以看出,人脸的红色框和蓝色框是叠加存在的。

我们知道,在Mosaic和Mixup的基础上,Yolov3 baseline增加了2.4个百分点。

在训练的最后15epoch,这两个数据增强会被关闭掉。而在此之前,MosaicMixup数据增强,都是打开的,这个细节需要注意。

Neck

如下图所示,FPN自顶向下,将高层的特征信息,通过上采样的方式进行传递融合,得到进行预测的特征图。

Decoupled Head

我们先来看一下Decoupled Head,目前在很多一阶段网络中都有类似应用,比如RetinaNet、FCOS等。而在Yolox中,作者增加了三个Decoupled Head,俗称“解耦头”作者想继续改进,比如输出端改进为End-to-end的方式(即NMS的形式)。

而在2020年12月份,旷视科技发表的《End-to-End Object Detection with Fully Convolution Network》中。在对FCOS改进为无NMS时,在COCO上,达到了与有NMS的FCOS,相当的性能。为什么在Yolo上改进,会下降这么多?在偶然间,作者将End-to-End中的Yolo Head,修改为Decoupled Head的方式。

不单单是精度上的提高。替换为Decoupled Head后,网络的收敛速度也加快了。目前Yolo系列使用的检测头,表达能力可能有所欠缺,没有Decoupled Head的表达能力更好。

从图上可以看出,Concat前总共有三个分支:

  • cls_output:主要对目标框的类别,预测分数。因为COCO数据集总共有80个类别,且主要是N个二分类判断,因此经过Sigmoid激活函数处理后,变为202080大小。
  • obj_output:主要判断目标框是前景还是背景,因此经过Sigmoid处理好,变为20201大小。
  • reg_output:主要对目标框的坐标信息(x,y,w,h)进行预测,因此大小为20204。

最后三个output,经过Concat融合到一起,得到20*20*85 的特征信息。当然,这只是Decoupled Head①的信息,再对Decoupled Head②和③进行处理。Decoupled Head②输出特征信息,并进行Concate,得到40*40*85 特征信息。Decoupled Head③输出特征信息,并进行Concate,得到80*80*85 特征信息。再对①②③三个信息,进行Reshape操作,并进行总体的Concat,得到8400*85 的预测信息。这里的8400,指的是预测框的数量,而85是每个预测框的信息(reg,obj,cls)。

Anchor Free

在前面Anchor Based中,每个Feature map的单元格,都有3个大小不一的锚框。Yolox-Darknet53,将前面Backbone中,下采样的大小信息引入进来。比如上图中,最上面的分支,下采样了5次,2的5次方为32。当有了8400个预测框的信息,每张图片也有标注的目标框的信息。

这时需要做的,就是将8400个锚框,和图片上所有的目标框进行关联,挑选出正样本锚框。而相应的,正样本锚框所对应的位置,就可以将正样本预测框,挑选出来。这里采用的关联方式,就是标签分配。

SimOTA

① 初步筛选

初步筛选的方式主要有两种:根据中心点来判断、根据目标框来判断;

这部分的代码,在models/yolo_head.py的get_in_boxes_info函数中。

② 精细化筛选

而在精细化筛选中,就用到论文中提到的SimOTA了

cij=LijclsLijreg

然后,对于gt gi,我们选择固定中心区域内成本最低的前k个预测作为其正样本。 最后,这些正预测的相应网格被指定为正,而其余的网格是负。 请注意,k 值因不同的真实情况而异。

Multi Positives

问题:对于每个object,如果只将其center location视为正样本,那就只有1个正样本而忽略了其它高质量的prediction。

潜力:对这些高质量prediction进行优化,可能带来beneficial gradient,这可能会缓解training过程中正/负采样的极端不平衡

center sampling:如FCOS的center sampling,本文将每个object的center region3×3中的所有location作为正样本

Label Assignment

第一步:设置候选框数量

首先按照cost值的大小,新建一个全0变量matching_matrix,这里是[3,1000]。通过上面第二行代码,设置候选框数量为10。再通过第三行代码,从前面的pair_wise_ious中,给每个目标框,挑选10个iou最大的候选框。因为前面假定有3个目标,因此这里topk_ious的维度为[3,10]。

第二步:通过cost挑选候选框

下面再通过topk_ious的信息,动态选择候选框。代码如dynamic_k_matching函数中,下图所示这里的topk_ious,是3个目标框和预测框中,最大iou的10个候选框:

经过torch.clamp函数,得到最终右面的dynamic_ks值。我们就知道,目标框1和3,给他分配3个候选框,而目标框2,给它分配4个候选框。那么基于什么标准分配呢?这时就要利用前面计算的cost值,即[3,1000]的损失函数加权信息。在for循环中,针对每个目标框挑选,相应的cost值最低的一些候选框。

比如右面的matching_matrix中,cost值最低的一些位置,数值为1,其余位置都为0。因为目标框1和3,dynamic_ks值都为3,因此matching_matrix的第一行和第三行,有3个1。而目标框2,dynamic_ks值为4,因此matching_matrix的第二行,有4个1。

第三步:过滤共用的候选框

不过在分析matching_matrix时,我们发现,第5列有两个1。这也就说明,第五列所对应的候选框,被目标检测框1和2,都进行关联。因此对这两个位置,还要使用cost值进行对比,选择较小的值,再进一步筛选。

首先第一行代码,将matching_matrix,对每一列进行相加。

这时anchor_matching_gt中,只要有大于1的,说明有共用的情况。上图案例中,表明第5列存在共用的情况。再利用第三行代码,将cost中,第5列的值取出,并进行比较,计算最小值所对应的行数,以及分数。我们将第5列两个位置,假设为0.4和0.3。

经过第三行代码,可以找到最小的值是0.3,即cost_min为0.3,所对应的行数,cost_argmin为2。

经过第四行代码,将matching_matrix第5列都置0。再利用第五行代码,将matching_matrix第2行,第5列的位置变为1。最终我们可以得到3个目标框,最合适的一些候选框,即matching_matrix中,所有1所对应的位置。

Loss

a. 在前面精细化筛选中,使用了reg_loss和cls_loss,筛选出和目标框所对应的预测框。因此这里的iou_loss和cls_loss,只针对目标框和筛选出的正样本预测框进行计算。而obj_loss,则还是针对8400个预测框。

b.在Decoupled Head中,cls_output和obj_output使用了sigmoid函数进行归一化,但是在训练时,并没有使用sigmoid函数,原因是训练时用的nn.BCEWithLogitsLoss函数,已经包含了sigmoid操作。而在推理过程中,是使用Sigmoid函数的。

Improvement Darknet53

  • 输入端:Strong augmentation数据增强
  • BackBone主干网络:主干网络没有什么变化,还是Darknet53
  • Neck:没有什么变化,Yolov3 baseline的Neck层还是FPN结构
  • Prediction:Decoupled Head、Anchor-free、Multi positives、SimOTA
  • 终于结束【本文参考了江大白的blog 十分感谢】!!!
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/665845
推荐阅读
相关标签
  

闽ICP备14008679号