目标检测算法:One-Stage

YOLO v1 :You Only Look Once

论文原文

算法思想

1、划分Gird Cell

将一幅图像分成SxS个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。

2、Bounding box 预测

每个网格要预测B个bounding box(B取2),每个bounding box除了要预测位置之外,还要预测一个confidence值。另外每个网格还要预测c个类别的分数。相当于每个bounding box要预测5个值,4个是位置,1个是confidence。

其中$Pr(Object)$如果网格内没有目标则为0,如果有目标为1。

在最终测试预测时,对于每一个目标最终的概率,会将类别分数与confidence相乘

!!!这里要注意的是,虽然一个grid cell预测两个bounding box,但是其实一个grid cel只预测一个类别,对于预测2个bounding box,最终只选择IOU最高的bounding box作为该类别检测的输。当一个格子中包含多个物体,只检测出一个。

网络最终输出的维度是SxSx(5xB+C)=7x7x(5x2+20),每个grid cell的输出排列如下图

$x,y$是bounding box中心位置相对于当前格子位置的偏移量,归一化到[0,1]

$w,h$是box的长和宽相对于input的长和宽的比例,归一化到[0,1]

3、网络结构

原文中在 imagenet 分类任务上以一半的分辨率对卷积层进行预训练(224 x 224输入图像),然后将分辨率加倍进行检测。

4、Loss 计算

算法缺陷

  1. 对群体性小目标检测很差,由于grid cell的限制。
  2. 当目标出现新的尺寸比例或结构,效果会变差。
  3. 大多数错误来源于预测位置不准。

SSD: Single Shot Multibox Detector

论文原文

SSD 网络框架

  • 输入图像大小为300x300
  • 前面使用VGG-16的部分,是从开始到Conv5_3。
  • 其中Conv4_3的输出作为预测特征层1
  • Conv5_3之后的池化层在VGG16中使用的是2x2-s2(池化核为2x2,步长为2)使特征图宽高减半,在这里使用的是3x3-s1(padding为1),输出的大小保持不变。
  • 小的特征图适合检测大目标,大特征图适合检测小目标,在不同特征图分别匹配不同尺度的目标,提升小目标检测效果。

Default Box 的 Scale 和 aspect

如果使用$m$个特征图来进行预测,每个特征图的默认的scale计算如下:

  • 其中对VOC数据集的训练中,$s_{min}=0.2,s_{max}=0.9$,这意味着最低层的scale为0.2,即默认宽高比$1:1$的box像素为300x0.2=60,最高层为300x0.9=270。

  • aspect比率:对于使用6个box的有五个$a_{r}\in{1,2,3,\frac{1}{2},\frac{1}{3}}$,对于使用4个box的3个$a_{r}\in{1,2,\frac{1}{2}}$。

  • 由此每个框的宽度为:$w_{k}^{a}=s_{k}\sqrt{a_{r}}$,高度为$h_{k}^{a}=s_{k}/\sqrt{a_{r}}$。
  • 另外每一个特征图都会添加一个box,scale比本层大一些,比下一层小一些,$s_{k}’=\sqrt{s_{k}s_{k+!}}$,这个box的aspect为$1:1$,由此每个box的是本层scale的5或3个aspect加上1个$s_{k}’$的box

  • 对于COCO数据集,目标较小,所以最小的default box的scale使用0.15替代0.2,同时conv4_3的default box的scale为0.07(300x300图像中的21个像素)。具体如下表所示。

特征图层 特征图层宽高 默认框scale与aspect 默认框数量
1 $38\times38$ $21\{1,2,\frac{1}{2}\}; \sqrt{21\times45}\{1\}$ $38\times38\times4$
2 $19\times19$ $45\{1,2,3,\frac{1}{2},\frac{1}{3}\}; \sqrt{45\times99}\{1\}$ $19\times19\times6$
3 $10\times10$ $99\{1,2,3,\frac{1}{2},\frac{1}{3}\}; \sqrt{99\times153}\{1\}$ $10\times10\times6$
4 $5\times5$ $153\{1,2,3,\frac{1}{2},\frac{1}{3}\}; \sqrt{153\times207}\{1\}$ $5\times5\times6$
5 $3\times3$ $207\{1,2,\frac{1}{2}\}; \sqrt{207\times261}\{1\}$ $3\times3\times4$
6 $1\times1$ $261\{1,2,\frac{1}{2}\}; \sqrt{261\times315}\{1\}$ $1\times1\times4$

Default box总数为8732

Predictor的实现

对于$m\times n$的特征图,使用$3\times 3$的卷积核来生成分类概率分数和边界框回归参数,和fasterRCNN的预测器类似。对于特征图上的每个位置会生成$k$个default box,对每个box计算$c$个类别分数(包括背景)和4个回归参数,也就是$(c+4)k$个卷积核(filter),对于一个$m\times n$的特征图会生成$(c+4)kmn$个输出值。

注意:在Fast—RCNN中边界框回归参数是$4\times c\times k$个,而SSD中是$4\times k$个,是不关注边界框回归参数是关于哪个类别的

损失计算

其中$N$为匹配到的正样本个数,平衡系数$\alpha$为1

YOLO v2 (YOLO9000)

论文原文

性能改进

在YOLO v1的基础上进行一系列改进来提升性能,改进尝试如下:

Batch Normalization

通过添加BN层,对于训练收敛有很大的帮助,减少了一系列正则化操作。可以在移除Dropout操作后不过拟合。

相比YOLO v1的mAP提升了2%

High Resolution Classifier

采用更高分辨率的分类器,使用448x448的分辨率训练ImageNet,提升了4%mAP。

Convolutional with Anchor Boxes

使用基于Anchor的目标边界框预测。相对于直接预测坐标,使用带有偏移的Anchor边界框预测,可以简化目标边界框预测问题,使得网络更好训练。这里会使mAP有0.3%的轻微下降,但是recall增加了8%,这样的结果可以使模型有更大的提升空间。

Dimension Clusters

使用聚类算法提取anchor boxes的宽高。之前的anchor boxes是基于经验设定的,网络微调anchor box到实际位置的难度较大。这里的做法是对训练集合中标注的边界框进行聚类分析,已找到更好的尺寸。

论文中使用k-means作为聚类算法。聚类算法最重要的是选择如何计算边界框间距离,使用欧氏距离会导致大边界框有更大的误差。由于更加关心IOU所以我们定义计算公式为:

其中centroid是聚类时被选作中心的边框,box就是其它anchor boxes。IOU越大,距离越近。

Direct location prediction

在实验中发现如果不进行限制,anchor boxes可能会出现在图像中的任意点,导致anchor偏离ground truth很远。这里对预测公式进行调整,将预测边界框中心约束在grid cell内:

其中,$b_{x},b_{y},b_{w},b_{h}$是预测边界框的中心和宽高。

$\sigma$是sigmoid函数,控制边界框中心在网格内。

$t_{x},t_{y},t_{w},t_{h},t_{o}$是要学习的参数,分别用于预测边框中心和宽高以及置信度

$c_{x},c_{y}$是当前网格左上角到图像左上角的距离。

$p_{w},p_{h}$是先验框bounding box prior或者说是预设的框的宽高

Fine-Frained Features

论文提到YOLO使用13x13的特征图进行大物体预测拥有很好的效果,即细粒度特征(Fine-Frained Features),而相对比较小的物体则一般。这里引入一种passthrough层的方法在特征图上保留一些信息。

passthough层如下图

passthrough层是将前面更高分辨率的图作为输入,将其连接到后面的低分辨率特征图上,但是为了使特征图大小一致进行拼接,会将channles增加4倍。以416x416分辨率为例,对于26x26x512的特征图,通过passthrough层后转换为13x13x2048的特征图,可以与后面的13x13x1024的特征图进行拼接。

YOLO v2完整网络结构图:

Multi-Scale Training

YOLOv2没有券链接层,所以对网络输入大小没有限制,但是由于缩放因子为32(下采样倍数),需要输入尺寸为32的倍数。为了增加模型的鲁棒性,训练时每10个batch就改变一次输入图像大小从320x320到608x608。

速度改进

BackBone:Darknet-19

删除Darknet-19的最后一个卷积层,并用3个3x3卷积层和一个1x1卷积替代。

对于VOC数据集,每个网格中预测5个bounding boxes,每个boundingbox有5个参数(4个边界框回归参数+confidence)和20分类,即1+4+20=25,每个网格为5x25=125个filters。

YOLO v3

报告原文

由于原文是一篇技术报告,所以在很多地方讲解的都是很模糊的。

网络结构

主干网络使用Darknet-53,添加了残差结构

Darknet53:

在使用时移除了FC层。

目标边界框预测

YOLOv3在3个特征图中发的分别通过$(4+1+c)\times k$个大小为1x1的卷积核进行预测,$k$为预设边界框(bounding box prior)的个数(k默认取3)。

根据COCO数据集聚类得到预设边界框尺寸:

特征图层 特征图大小 预设边界框尺寸 预设边界框数量
特征图层1 13x13 (116x90);(156x198);(373x326) 13x13x3
特征图层2 26x26 (30x61);(62x45);(59x119) 26x26x3
特征图层3 52x52 (10x13);(16x30);(33x23) 52x52x3

正负样本匹配

针对每一个GT分配一个Bounding box prior ,即每一个GT分配一个正样本,一个图片中有几个目标,就有几个正样本。分配原则是:将与GT重合程度最高的bounding box prior作为正样本,对于bounding box与GT重合但是不是最大但是超过阈值(0.5)则忽视,其他的则为负样本。如果bounding box prior没有被分配给GT,则它没有定位损失和类别损失,只有confidence。

损失函数

$\lambda_{1},\lambda_{2},\lambda_{3}$为平衡系数

confidence损失:Binary Cross Entropy

$\hat{c}_{i}=Sigmoid(c_{i})$为预测值c通过Sigmoid函数得到的预测置信度

$o_{i}\in[0,1]$表示一侧,表示预测目标边界框与真实边界框的IOU

原文中$o_{i}$只取0或者1,正样本为1,负样本为0

N为正负样本个数

类别损失

$O_{ij}$取0或1,表示目标框i中是否存在第j类目标

$N_{pos}$是正样本个数

eg:

类别[A, B, C]

真实标签:

Object1:[0, 0, 1]

Object2:[0, 0, 1]

预测概率:经过Sigmoid处理,不是softmax,所以概率和不为1

Object1:[0.1, 0.8, 0.9]

Object2:[0.2, 0.7, 0.8]

定位损失

t是网络预测的回归参数,g是GT中心点坐标x,y与宽高(映射在grid cell中)

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信