【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写

YOLO系列算法论文解读

手撕YOLOv3代码部分:https://github.com/lzneu/handwriten_net/tree/master/yolov3

目录

YOLOv1

1、直接看网络的输出如何表示目标

2、网络架构

3、损失函数

YOLOv2

1、背景

2、相比较YOLOv1的改进

2.1 Batch Normalization

2.2 High Resolution Classifier

2.3 Convolutional With Anchor Boxes

2.4 Dimension Clusters

2.5 Direct location prediction

2.6 Fine-Grained Features

2.7 Multi-Scale Training

3、网络架构

3.1 backbone

3.2 Training for classification

3.3 Training for detection

3.4 联合训练策略

3.5 训练细节

YOLOv3

1、背景

2、结构介绍

2.1 backbone

2.2  Bounding box设置

2.3 Class Prediction

2.4 跨尺度预测

2.5 整体架构

2.6 训练

4、其他论文中没有的点:

参考文献


YOLOv1

1、直接看网络的输出如何表示目标

如Fig2

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第1张图片

  • 最终的输出层特征尺寸为S*S大小的grid,每个grid单元代表一个输出预测;
  • 每个输出预测包括B个bbox以及C个类别的置信度
    • bbox表示为[x,y,w,h, 置信度],其中,xy 为相对于gridcell边界的中心;w,h 为相对于整个图片的距离;置信度预测为预测框和真实框的IOU值,当grid cell中不存在目标时,其值为0
    • C个类别置信度为Pr(Classi| Object),其中P(Object)为bbox中的置信度
    • 注意,无论B为多少,都只预测一组C值
  • 因此最终的输出特征的维度为:S*S*(B*5+C)

其中,在PASCAL VOC数据集上,设置S=7,B=2,C=20

因此,输出层最终的特征尺寸为:7*7*30

2、网络架构

整体的思路是:卷积网络提取特征+全连接层编码输出

网络架构图如fig3

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第2张图片

  • 使用24个卷积层+2个全连接层
  • 使用224尺寸的图片,ImageNet数据集训练前20个卷积层
  • 使用1*1卷积进行通道变换
  • 增加4个卷积层和2个全连接层使用随机初始化参数
  • 最后放大输入图片尺寸到448作为检测的卷积网络的输入
  • 最后一层使用线性激活函数;其余层均使用leaky 线性激活函数,如公式(2)所示

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第3张图片

3、损失函数

全部使用平方和误差,但是有3个明显问题:

1)位置损失和类别损失不能具有相同的权重

2)大部分的grid cell不具有object,导致训练初期都为0,训练不稳定

3)平方和误差对于大box和小box的惩罚程度不同,导致小目标惩罚过轻

作者对此采取了一些措施:

1)使用两个参数λcoord=5和λnoobj=0.5来控制bbox损失和无目标预测的损失

2)使用宽高的平方根来计算位置损失,减少大小目标惩罚程度不同的问题

整体损失函数如公式(3)

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第4张图片

其中:

  • 代表在gridcell i出现
  • 代表在gridcell i 和bbox j  出现目标

YOLOv2

1、背景

  • 2017CVPR
  • 相比较YOLOv1mAP提升10+%,并且检测速度更快
  • 使用目标检测数据及学习定位,使用分类数据及学习类别判断,因此可以检测超过9000个类别,又称YOLO9000

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第5张图片

2、相比较YOLOv1的改进

2.1 Batch Normalization

- 提升mAP约2%

- 帮助正则化模型,移除了所有的dropout

- 注意:卷积之后加入BN,卷积层的bias可以去掉了,因为其值可由bn层的平移因子代替

2.2 High Resolution Classifier

- 先使用448*448的输入尺寸的ImageNet训练分类网络10个epoch(YOLOv1中是使用224的输入尺寸训练,然后直接应用到448输入的检测中)

- 提升4%的mAP

2.3 Convolutional With Anchor Boxes

- 移除fc层,使用anchor boxes来预测bbox,模型预测偏移量而不是绝对坐标使得网络更易于学习

- 去掉pooling层,让输出有更高的分辨率

- 输入图片从448调整为416,使得特征图有一个绝对的中心位置,便于预测超大目标

- 下采样倍数为32,从416到13

- mAP降低0.3%,recall提升7%,意味着模型有更大的提升空间

2.4 Dimension Clusters

- 使用k-means方法做anchor设置

- 聚类的距离公式如下,这使得priors带来一个优质的IOU score

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第6张图片

2.5 Direct location prediction

在使用anchor boxes时,遇到的一个问题是,模型不稳定。特别是在模型训练的早期,这是由于box中心位置(x, y)的预测导致的。坐标转化的公式如下:

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第7张图片

注意,这里有人认为原文的公式错误,应该是x=(tx *wa) + xa, y=(ty*ha)+ya,但我觉得这里的转换可以通过参数学习来决定,xa or -xa是可以学习到的,因此正号还是负号对模型来说没有影响

而tx, ty没有限制,则任何一个anchor转化后的x, y可以漂移到图像的任何一个位置

因此模型在学习的初始阶段需要很长时间才能预测初合理的偏移量

因此,YOLOv2遵循v1的思路,预测gridcell的相对便宜量

具体的做法是,每个bbox预测的5个值为:

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第8张图片

其中:

- tx ty, tw, th为预测的位置,to为有目标的置信度,cx, cy为anchor中心相对于13*13gridcell中的某个cell相对于图片左上角的偏移量分数

- σ为sigmoid函数,将相对gridcell的位置映射为0-1之间

- pw,ph是bbox 的prior的宽和高

- 可视化的转化如Fig3所示

- 使用anchor聚类+相对预测的方法,提升5%mAP

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第9张图片

2.6 Fine-Grained Features

- 修改后的YOLO预测输出的特征图尺寸为13*13,这对大目标很友好,但是小目标检测效果不好,因此作者增加了以下改进

- 添加一个passthroungh层来使用前面的26*26的卷积输出,concate到输出层,将26*26*1024转化为13*13*2048

- 提升约1%

2.7 Multi-Scale Training

- 每10个batch,随机选择一次图片尺寸,以32为一个尺度:{320, 352, 608},共10个尺度

3、网络架构

3.1 backbone

- 相比较YOLOv1使用Googleenet,v2使用DarkNet-19,类似vgg使用了大多数的3*3卷积核,在pooling之后翻倍通道数

- 具有19个卷积层和5个maxpooling层,91.2%top-5 accuracy高于VGG16(90%)

- 网络层架构图

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第10张图片

3.2 Training for classification

3.3 Training for detection

- 移除最后一个卷积层

- 增加一个1*1卷积层,对于VOC 预测5个boxeshe 5个坐标+20个类别,总共125个通道;5个boxes的原因是之前聚类的anchor的k=5

- 增加一个passthrough层来利用低级别特征,修改后的网络如下图

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第11张图片

- 一个小细节,论文给出的passthrough layer为26*26*1024-> 13*13*2048,而源码中的实现为经过了一个1*1的conv进行通道缩减,然后输出为13*13*256

- 每个卷积块如上图右上所示:convolutional包括一个不含bias的conv2d、一个bn层和一个Leaky Relu构成

- PassThrough 层的操作如下

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第12张图片

3.4 联合训练策略

- 混合了分类数据及和目标检测数据及,当网络推理的是分类图片,仅回传分类损失;当推理的是检测图片,回传整个损失

3.5 训练细节

- 论文没有对正负样本、损失函数进行介绍,具体细节见源码

YOLOv3

1、背景

- 2018CVPR

- 整体感觉:无较大创新点,整合了当时网络的一些优点和tricks

- 在工业界应用非常广泛

2、结构介绍

2.1 backbone

 - 直接看图,Darknet-53,具有53个卷积层,其top5 acc与resnet152持平,速度为其2倍

几个细节:

1)使用卷积块堆叠+残差的结构,利用了VGG与ResNet的优点

2)与resnet不同的是,使用convolutional代替maxpooling进行下采样

3)convolutional由3个部分构成,Conv2d(No bias)->BN层->LeakyReLU

残差和Convolutional的结构如下图所示:

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第13张图片

 

2.2  Bounding box设置

- 使用与YOLO9000相同的策略,聚类确定anchor种类

- 网络预测4个坐标, tx, ty, tw, th 

- anchor的中心距离图片左上角的偏移为cx, cy;pw, ph为anchor的宽高,则转化目标边界框的坐标为

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第14张图片

- 使用逻辑回归预测其中的objectness score。其中,若某个anchor的预测与obj的交叠比在该图片中最大,则其值为1;若不是最大,但大于阈值0.5,则忽略该预测,即计算loss时忽略该部分loss

- 每个gt object只匹配一个anchor预测

- 没有匹配到gt object的anchor预测,只计算objectness loss,不计算coor和class loss

- 这个部分仍然使用平方和损失

2.3 Class Prediction

- 使用独立的逻辑回归预测类别

- 使用二值交叉熵损失函数

- 目的是方便预测多标签,适应重叠目标等问题,softmax只能输出单一类别

2.4 跨尺度预测

- 在3个不同的尺度特征下进行boxes预测

- 在COCO数据集下,每个尺度预测3个boxes,每种尺度的输出形状为:N*N*(3*(4+1+80)),其中N是特征尺寸,3代表3个box,4代表tx,ty,tw,th,1代表objectness score,80是COCO的类别数

- 然后将两个卷积层以前的特征 upsampling * 2,并与网络前一尺度的特征concate,然后使用几个卷积层输出同样的预测结果,N变为原来的2倍

- 重复该操作至最后一个尺度

- 使用k-means聚出9个类,然后在3个尺度上均匀划分成3*3,在COCO上的设置为:(10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90),(156×198),(373×326)。(注意:小尺寸的anchor添加到大特征图中,大尺寸的anchor添加到小特征图中)

 

2.5 整体架构

这里直接使用csdn博主@太阳花的小绿豆 画出的一幅图来说明

2.6 训练

- No HNM

- 使用了多尺度训练

- 使用了很多数据增强

- 添加BN层

4、其他论文中没有的点:

1、特征提取网络

1)全卷积网络,无pooling层,对输入尺寸不固定

2)网络下采样的stride参数,用来表示被下采样的倍数,例如stride=32,输入尺寸/输出特征尺寸==32

2、Output

1)使用1*1卷积来生成输出

2)输出的feature map中的一个单元的长度是(B x (5 + C)) ,B代表每个cell预定义个anchor,5代表YOLO经典的坐标+目标分数,C代表类别数

一个感性的理解:

若原始图片中的目标的中心位置,存在于某个输出特征的cell的感受野中,这个目标就应该是该cell预测出来的

因此,首先要做的是:将输入图片划分为等于输出特征数量的grid

假设输入图片是416*416,网络的stride是32,那么输出特征尺寸是416/32=13

因此将输入图片划分为13*13的grid,如下图

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第15张图片

其中,红色的就是目标的中心位置,处于grid的第7行,第7列

那在Feature Map中的位置也是第7行第7列,包含3个box,每个box展开都是(B x (5 + C))个元素

2.1 Anchor Boxes

1)YOLOv3的每个预测单元有3个anchor,对应着3个bbox

2)确定哪一个bbox是以及其anchor对应正样本的规则是:取所有的bbox中,与gtIOU最大的那个

2.2 Making Predictions

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第16张图片

bx, by, bw, bh就是最终的预测的坐标值

tx, ty, tw, th是网络的输出

cx, cy是anchor的中心/也是该gridcell的左上角距离图片左上角的距离

pw, ph是anchor的宽高

其中的一些细节:

1)使用sigmoid函数sigmoid(tx)、sigmoid(ty)的原因:使用基于gridcell尺寸的归一化,对训练相对更稳定

例如:在13*13的输出特征中,假设sigmoid(tx)、sigmoid(ty) = (0.4, 0.7)、在第6个cell中,那么该box的中心坐标为:

  • bx = 6.4
  • by = 6.7

2) tw、th应用了log函数,然后乘以anchor的宽高pw, ph(归一化后),因此假设:bw, bh = (0.3, 0.8),则

  • 实际w = 0.3*13
  • 实际h = 0.8*13

3) Objectness Score:原文中作者说该值为0/1的离散值,但是具体caffe实现中,把其计算方式改为sigmoid的离散值

4) Class Confidences:

  • YOLOv3之前,作者使用的softmax做类别预测
  • v3作者改为sigmoid代替,原因是方便支持多类以及重叠目标

5)多尺度预测

  • 使用了3种尺度预测,stride分别为: 32, 16, 8,也就是说当输入尺寸为416时,输出的多尺度 特征尺寸分别为: 13*13 26*26 52*52
  • 每种尺度的特征使用upsampling 操作,并与前一尺寸的特征进行concate操作,生成下一尺度的预测特征

【手撕经典算法】【论文解读】【目标检测】YOLO系列解读YOLOv3算法手写_第17张图片

6)Output Processing 对于每个416*416的图片,网络预测的bbox数量为:((52×52)+(26×26)+(13×13))×3=10647个,然而实际图片中的目标数量很少,接下来就是如何减少冗余预测的方法

  • Objectness score: 首先,使用过滤objectness score < 阈值的bbox
  • NMS过滤同一对象的预测

 

 

参考文献

【1】Redmon J , Divvala S , Girshick R , et al. You Only Look Once: Unified, Real-Time Object Detection[C]// Computer Vision & Pattern Recognition. IEEE, 2016.

【2】Redmon J , Farhadi A . YOLO9000: Better, Faster, Stronger[C]// IEEE Conference on Computer Vision & Pattern Recognition. IEEE, 2017:6517-6525.

【3】YOLOv3: An Incremental Improvement

【4】https://blog.csdn.net/qq_37541097/article/details/81214953

【5】https://blog.paperspace.com/how-to-implement-a-yolo-object-detector-in-pytorch/

 

你可能感兴趣的:(目标检测,图像识别,计算机视觉,算法)