YOLO1-3

0 引言

Yolov1(You Only Look Once: Unified, Real-Time Object Detection)是2015年。
Yolov2(YOLO9000: Better, Faster, Stronger)是2017年文章。
Yolov3(YOLOv3: An Incremental Improvement)是2018年文章。
Yolo系列是一个集其他网络优点于一身的检测网络。

YoloV1

在这里插入图片描述

方法

图像被划分为S×S的格子(S=7),每个格子设置B(B=2)个bounding box,因此输出为 S × S × ( ( 4 + 1 ) B + C ) S \times S \times ((4+1)B +C) S×S×((4+1)B+C)维向量,其中的1为置信度。C为类别数目。与fasterrcnn中region proposal network不同的是bounding box的大小以及形状并不是预先设定好的,需要训练过程中不断学习。回归网络部分使用全连接层作为输出,直接输出边框的坐标及宽高,最后对所有的bounding box使用NMS并按照置信度(confidence)排序,生成检测结果。

损失函数

在这里插入图片描述
将分类也作为回归问题看待,损失函数由三部分组成:回归损失函数、置信度损失函数和类别损失函数,都是使用的均方误差损失函数。

  • 第一二行为坐标损失函数, 1 i , j o b j 1_{i,j}^{obj} 1i,jobj为真值表达式,在一个grid内,当存在对象时,按照一个bounding box对一个对象负责的原则,选取IOU最大值的bounding box的 1 i , j o b j 1_{i,j}^{obj} 1i,jobj设为1,另一个设为0 。宽或高直接相减的话,小物体比大物体更加敏感,因此使用先取根号想减在平方的方式。当 1 i , j o b j 1_{i,j}^{obj} 1i,jobj为1时预测的坐标及宽高的值选取bounding box中IOU最大的一个。
  • 第三行为bounding box中存在对象(属于前景)的损失函数。
  • 第四行为bounding box中不存在对象(属于背景)的损失函数, 1 i , j n o o b j 1_{i,j}^{noobj} 1i,jnoobj 1 i , j o b j 1_{i,j}^{obj} 1i,jobj正好相反,因为背景的格子相当多容易导致模型跑偏所以使用 λ n o o b j \lambda_{noobj} λnoobj控制样本不平衡问题。
  • 第五行为分类损失函数, 1 i o b j 1_i^{obj} 1iobj为真值表达式,当格子对对象负责时也就是说对象的中心点落在当前格子中时,值为1,否则为0。

优点

  1. 速度快。

缺点

  1. 定位不够准确、准确率不高、召回率低(bounding box太少)。
  2. 因为设置的是S=7,一个格子只能预测一个对象,所以一张图像中最多能识别7×7=49个对象,对于数量很多的图像如鸟群则效果不好。
  3. 因为bounding box是从训练数据中学习到的,因此很难检测新的或不寻常形状的物体。也就是说物体的形状与训练数据的形状差别很大。
  4. 小bounding box与大bounding box权重相同,然而一个小的误差对小bounding box的影响要大于对大bounding box的影响。

YOLOv2

获得2017年最佳论文。yolov2也叫yolo9000, yolo2与yolo9000是两个模型,结构相同只是训练方法不同,后者采用联合训练的方式使得检测物体超过9000种。yolov2主要是借鉴了许多优秀成果然后在yolov1上的改进,yolov2与其他优秀算法在数据集VOC2007上的比较如图1和图2所示。
在这里插入图片描述

图1 yolov2与其他优秀算法在数据集VOC2007的比较

在这里插入图片描述

图2 yolov2与其他算法在数据集VOC2007上的比较

图2中yolov2 288 × \times × 288表示测试图像的分辨率为288 × \times × 288,依次类推,模型本身是相同的。
从图1和图2中可以看到当测试图片的分辨率为416 × \times × 416及以上时,yolov2与faster-rcnn、ssd512的map相当,但是速度要快很多。在coco数据集上的比较如图3所示。
在这里插入图片描述

图3 yolov2与其他优秀算法在数据集coco的比较

注:
coco数据集:包含80个类别,20多万张图片,评价指标中S:<32, M:32-96, S:>96,检测指标如下图所示。
voc2007和voc2012:包含20个类别,总共3万多张图片。
在这里插入图片描述

从图3中可以看到在coco数据集上yolov2的检测效果甚至不如ssd300,说明了当需要检测的类别数量很多时,只从map的角度看SSD512>Faster-rcnn>SSD300>YOLOV2.

1 创新点

创新点不多,大部分都是借鉴了其他优秀成果。

  1. 提高了yolov1的速度与精度。
  2. 提出一种联合训练的方法,提高检测物体的种类数。当测试图像的大小为416时,yolov2的预测种类数为 13 × 13 × 5 = 845 13\times13\times5=845 13×13×5=845个,yolo9000则能够预测9000多种。

2 优点

  1. 在VOC数据集上无论是速度还是精度都优于ssd、faster-rcnn。

3 缺点

  1. 在coco数据集上,AP和AR均低于ssd、faster-rcnn。

4 方法

yolov2的思想是在保证速度的前提下通过使用一堆技术提升map,使用的技术如下图3所示.
在这里插入图片描述

图3 从yolo过渡到yolov2

4.1 batch norm

在每一个卷积后加入batch norm,规范化数据,可以提升收敛速度也可以降低模型过拟合。MAP提升了2.4%

4.2 High Resolution Classifier

解决预训练输入图片分辨率与训练图片分辨率不同的问题。首先在ImageNet分类数据集训练主体网络(特征提取器),数据集的分辨率为224 × \times × 224,小分辨率不利于检测,所以yolov1的办法是将检测图片的分辨率增加到448,微调模型。在不同的数据集上微调模型显然不如都在分类数据集上微调模型,yolov2具体的做法是在分类数据集上训练完模型后,将图片的分辨率调至448,微调模型10epoch。然后直接在检测模型上训练。MAP提高4%

4.3 Convolutional With Anchor Boxes

借鉴了faster-rcnn的anchor,去掉了全连接层,使用卷积层代替,去掉一个pool层,检测网络的输入不是448 × \times × 448,而是采用416 × \times × 416,输出为13 × \times × 13,输出要尽可能为奇数,因为作者认为大的物体的中心落在特征图中心,奇数的特征图中心只有一个,正好负责预测该物体。因为网络下采样为32倍,所以输入为32的倍数。在yolov1中,一个格子(两个bounding box)负责类别预测,而yolov2中一个bounding box负责一个类别预测。召回率提升了7%而MAP略有下降,有可能是召回率提升了,所以MAP略有下降。

4.4 Dimension Clusters

在数据集VOC和COCO上对图像边框聚类。结果如图4所示。
在这里插入图片描述

图4 VOC和COCO数据集上聚类边框结果

4.5 New Network: Darknet-19

使用新的主体网络架构。MAP几乎不变,但是计算量减少约33%

4.6 Direct location prediction

回归网络中,在faster-rcnn中的预测方法为:给定anchor的宽为 w a w_a wa(其他类似),预测的宽为 w w w,宽的偏移值为 t w t_w tw,GT为 w g w_g wg,目的是使预测值 w w w接近GT值 w g w_g wg,对anchor进行平移和缩放,有(原论文中减号写错了):
x = ( t x ∗ w a ) + x a x=(t_x *w_a)+x_a x=(txwa)+xa y = ( t y ∗ h a ) + y a y=(t_y *h_a)+y_a y=(tyha)+ya w = w a ∗ e t w w=w_a*e^{t^w} w=waetw h = h a ∗ e t h h=h_a*e^{t^h} h=haeth 只要预测出偏移值 t x t y w a h a t_x t_y w_a h_a txtywaha即可,但是这种方法对x和y的值没有约束,因此x、y可以出现在图中的任意位置,而yolov2想要将坐标的最终预测值与anchor的坐标在同一个格子里,所以在回归中心坐标时采用的方法为预测格子左上角与gt的距离,网络输出值经过函数sigmoid函数 σ ( x ) \sigma(x) σ(x) 转化为0-1的值。注意到此时并没有使用anchor中心点坐标值。在回归边框宽和高时采用的方法与faster-rcnn相同。
c x c_x cx表示格子左上角x坐标, b x b_x bx表示预测的边框x坐标, p w p_w pw表示anchor的宽。计算方法如下:
在这里插入图片描述
位置关系如图5所示。黑线为anchor,蓝线为最终预测的检测框。
在这里插入图片描述

图5 anchor和预测值的位置关系

4.7 Fine-Grained Features

当输入图像大小为416时输出大小为13,此时不能检测小物体,还需要更加精细特征,yolov2提出passthrough层来做获得图像细粒度特征。思想是将前面大的特征图连接到后面小的特征图当中,因此小的特征图就获得了更加精细的特征。比如将 26 × 26 × 512 26\times26\times512 26×26×512大小的特征图经过passthrough处理后变成 13 × 13 × 2048 13\times13\times2048 13×13×2048大小的特征图,特征图大小减小4倍通道增加4倍,如图6所示,然后再与后面的 13 × 13 × 512 13\times13\times512 13×13×512的特征图连在一起。MAP提升1%
在这里插入图片描述

图6 passthrough演示

4.8 Multi-Scale Training

由于yolov2中只有卷积和池化,因此可以输入不同尺寸的图片,采用的方法是每隔10 iteration后,改变输入图片的大小,因为yolov2下采样总共为32倍,因此图片大小为32的倍数(320…352…608…),当输入图片为320时,输出的特征图大小为10,不是奇数了,这个是一个疑问,

5 训练

  1. 训练提取特征的分类网络:在ImageNet分类数据集上训练,此时输入分辨率为224,训练160epochs,然后微调网络将图片分辨率调至448,训练10epochs。
  2. 修改分类网络:移除最后一个卷积层、global avgpooling层以及softmax层,并且新增了三个 3 × 3 × 1024 3\times3\times1024 3×3×1024卷积层,同时增加了一个passthrough层,最后使用 1 × 1 1\times1 1×1卷积层输出预测结果,输出的通道为 n u m s _ a n c h o r × ( 5 + n u m s _ c l a s s e s ) nums\_anchor\times(5+nums\_classes) nums_anchor×(5+nums_classes)

5.1 损失函数

损失函数原文中并没有给出,参考链接:yolov2的原理与实现知乎,框的匹配原则与yolov1相同,只有一个框对对象负责,与yolov1不同点在于yolov2每一个anchor都有一个类别的预测,因此每一个框都可以检测一个对象,而yolov1中每一个格子预测一个类别概率,格子中的边框共享同一个类别概率,因此yolov2能够预测更多的对象。
在这里插入图片描述
与YoloV1损失函数公式相似,都是正例贡献所有三个部分的损失值,负例只贡献置信度部分的损失值,不同点在于

  • 分类部分损失值:YoloV1分类损失函数只计算对象中心点所在的格子,而YoloV2计算IOU最大值的bounding box。
  • 位置部分损失值:一样。
  • 置信度部分损失值:YoloV1中IOU最大值为正例,另外一个为负例。YoloV2中IOU最大值为正例,IOU<0.6为负例。

yolo9000

1 创新

  1. 提出一种分类和检测联合训练的策略。

YoloV3

1 创新

  1. 多个网络优点的叠加。

2 优点

Yolov3的推理时间及精度如图1.1所示。
图1.1 推理时间与ap图

图1.1 推理时间与ap图
  1. 由图1.1可知,与SSD、RetinaNet及之前的网络相比,ap都为33.0%左右时,推理时间更快。
  2. 多尺度的实现:使用三个特征图,有利于检测小物体。
  3. 没有正负样本不平衡问题,作者认为是因为将置信度损失与分类损失分开的原因,使得负例只在置信度部分而分类损失部分没有负例。
  4. 使用带残差块的网络Darknet-53,相比yolov2网络结构更深。

3 缺点

  1. 由图1.1可知,Yolov3网络的最高ap为33.0%,而RetinaNet为37.8%,但是RetinaNet的推理时间增加好几倍。

4 方法

  1. 输出三个特征图:8 × 8 × 255、16 × 16 × 255、32 × 32 × 255,每个特征图每个grid包含3个先验框,共9种先验框((10×13),(16×30),(33×23),(30×61),(62×45),(59× 119), (116 × 90), (156 × 198),(373 × 326) ,顺序为w × h),这些先验框由k-means算法在coco数据集中(resize to(416×416))聚类带标签的框而求得。分类回归网络在第一个特征图上输出8 × 8 × 255(3 x(4+80+1)),以此类推。
  2. 训练时所有的先验框都参与训练。推理时去掉低阀值的先验框,然后经过NMS,得到最后的结果。
  3. 与ground truth的IOU值最大的先验框为正例,大于某阀值(论文取0.5)为忽略样例不贡献损失值,小于该阀值为负例只贡献objectness部分损失(正例为1,其他为0,判断为前景还是背景)。

5 训练

5.1 backbone网络

darknet网络结构如下图所示。
在这里插入图片描述

5.2 损失函数

在这里插入图片描述
与YoloV2损失函数公式相似,都是正例贡献所有三个部分的损失值,负例只贡献置信度部分的损失值,不同点在于

  • 分类部分损失值:yolov3没有使用softmax损失函数,而是使用多标签分类损失函数binary cross-entropy loss,也可以在多标签任务中使用。
  • 位置部分损失值:yolov3中并没有使用根号的方式,采用 ( 2 − w i ∗ h i ) (2-w_i*h_i) 2wihi的方式,作用效果相似,类似于focal loss的形式。
  • 置信度部分损失值:YoloV3中IOU<0.5为负例,yolov2中IOU<0.6为负例。

6 作者使用不成功的方法

  1. 使用focal loss后,ap值下降。作者认为可能是由于不存在正负样本不均衡问题导致。
  2. 正负样本划分标准为:>0.7为正[0.7, 0.3]忽略,<0.3为负,但是不work作者认为可能是因为训练不稳定所致。

7 U版代码阅读

通过阅读代码发现其中用到了许多技巧。

7.1 rectangle training

长方形训练,常见的训练方法是将训练图片裁剪到比如416*416的正方形,作者使用长方形的训练方法可以使检测速度提高1/3,具体的做法是按照原图像的比例缩放为最长边为416的图片,作为batch_shape(选择最大的),计算方法为

self.batch_shapes = np.ceil(np.array(shapes) * img_size / 32. + pad).astype(np.int) * 32

同样地缩放图片最长边为416,但是短边的计算方法为:

w=w0*416/max(h0,w0)
h=h0*416/max(h0,w0)

8 模型结构

下面图片来源自博客
在这里插入图片描述
下图展示了U版yolov3-spp的结构图细化。
其中cat表示连接操作。Conv(channels, size, stride, pad)
在这里插入图片描述

从图中可以看出:

  1. 在生成最终的scale时,需要对特征图卷积。
  2. scale分为3个尺度,当输入图片的大小为256时,尺度的大小分别为8,16,32.

SPP结构图如下图所示。论文中是修改后的SPP网络结构。maxpool(stride, size)
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值