Press "Enter" to skip to content

mAP提升40%!YOLO3改进版—— Poly-YOLO:更快,更精确的检测和实例分割

本文转载自AI深度视线。

精彩内容

YOLOv3改进版来了!与YOLOv3相比,Poly-YOLO的训练参数只有其60%,但mAP却提高了40%!并提出更轻量的Poly-YOLO Lite,还扩展到了实例分割上! 通读完这篇文章,结合自己使用YOLOV3的经验,觉得这篇改进确实良心之作,改在点上 ,多边形实例分割也极具创新。

 

代码刚刚开源:

 

https://gitlab.com/irafm-ai/poly-yolo

 

作者团队:奥斯特拉发大学

 

Introduction 摘要

 

 

本文提出了性能更好的YOLOv3新版本,并扩展了名为Poly-YOLO的实例分割。Poly-YOLO建立在YOLOv3的原始思想的基础上,并消除了它的两个弱点:

 

大量重写的标签   &&   无效的anchor分配

 

Poly-YOLO通过使用stairstep上采样通过hypercolumn技术聚合轻型SE-Darknet-53骨干网中的特征来减少问题,并产生高分辨率的单尺度输出。与YOLOv3相比:

 

Poly-YOLO的可训练参数只有60%,但mAP却提高了40%。

 

更少参数和更低输出分辨率的 Poly-YOLO  Lite,具有与YOLOv3相同的精度,但体积小三倍,速度快两倍 ,更适用于嵌入式设备

 

最后, Poly-YOLO使用边界多边形执行实例分割 。训练网络以检测在极坐标网格上定义的尺寸无关的多边形。预测每个多边形的顶点具有可信度,因此Poly-YOLO生成具有不同数量顶点的多边形。

 

 

YOLOv3  problem

 

YOLOv3在设计时,遇到了两个我们发现的问题,而这两个问题在原始论文中没有描述: 重写标签 和在 输出尺度上不平衡的锚点分布 。解决这些问题对于提高YOLO的性能至关重要。

 

2.1 Label rewriting

 

由于YOLO系列都是基于图像cell栅格作为单元进行检测,以416*416大小的图像为例,在图像分辨率随着卷积下降到13*13的特征图大小时,这时候特征图一个像素点的感受野是32*32大小的图像patch。 而YOLOV3在训练时候,如果出现相同两个目标的中心位于同一个cell,那幺前面一个目标就会被后面目标重写 , 也就是说两个目标由于中心距离太近以至于在特征图上将采样成为同一个像素点的时候,这时候其中有个目标会被重写而无法进行到训练当中 。如下图所示,红色目标为因为重写而没有加入到训练中的目标,可以看到,在这样一个特征图上,重写的目标数量还不少,27个目标里有10个都被重写,特别是比较稠密的地方。

 

 

作者在不同数据集上对重写的标签率进行了统计和比较, 可以看出原始YOLOV3的标签重写率还是蛮高,而改进后的POLY-YOLO大大降低了该重写率 。

 

 

2.2 Anchor distribution

 

YOLOv3 anchor机制 :

 

使用9种anchor,每个输出scale使用3个anchor。一个特定的GroundTruth框与哪个sclae的anchor匹配度最高,就会被指定给哪个scale。

 

YOLOv3是通过k-means算法进行目标大小统计,最后获得聚类质心来表示九个anchor的。这些anchor被分成三个一组,与在输出层中检测到的小、中、大box相连接。

 

不幸的是,这种根据三种尺寸来分anchor的原则通常是合理的,但是有个前提就是要满足下面这个分布 :

 

 

但这种情况在不能保证适用于各种情况,例如当 ,均值u=0.5r,标准差σ^2 = r是一个更现实的情况,这将导致大多数box将被中间输出层(中等大小)捕获,而其他两个层将未得到充分利用 。

 

为了说明这个问题,假设两个box:m1和m2;前者与放置在高速公路上的摄像头的车牌检测任务相连接,后者与放置在车门前的摄像头的人检测任务相连接。对于这样的任务,我们可以获得大约M1∼(0.3r,0.2r),因为这些牌将会覆盖小的区域,而m2∼(0.7r,0.2r)因为人类将会覆盖大的区域。

 

对于这两个集合,分别计算anchor。第一种情况导致的问题是,中、大型的输出规模也将包括小的anchor,因为数据集不包括大的目标。这里,标签重写的问题将逐步升级,因为需要在粗网格中检测小目标。反之亦然。大目标将被检测在小和中等输出层。在这里,检测将不会是精确的,因为中小输出层有有限的感受野。三种常用量表的感受野为{85×85,181×181,365×365}。 这两种情况的实际影响是相同的:性能退化。

 

在介绍YOLOv3的文章中,作者说:“YOLOv3具有较高的小目标AP性能。但是,在中、大型目标上的性能相对较差。” 我们认为YOLOv3出现这些问题的原因就是在此。

 

POLY-YOLO 架构

 

3.1 问题总结

 

label重写问题 :不会在原分辨率大小时候发生, 本文的关注点是在尺度scale=1/8,1/16,1/32的尺度上的情况 。

 

anchor分布问题 ,有两种解决办法:

 

第一种方法是为三个输出尺度定义感受野,并定义两个阈值来分隔它们。然后,k-means将根据这些阈值计算聚类中心(用作anchor)。缺点是这样把数据驱动的anchor转成了问题驱动, 只能在固定的一些尺度上检测对应的目标,而不是全尺度,这样会浪费网络 。

 

第二种方法是 创建一个具有单个输出的体系结构,该输出将聚合来自各种scale的信息。然后一次性处理所有的anchor 。与第一种方法相比,anchor大小的估计将还是保持由数据驱动。

 

本文是采用第二种处理方法进行优化。

 

3.2 POLY-YOLO架构

 

 

 

上图显示了原始体系结构和新体系结构之间的比较。Poly-YOLO在特征提取器部分每层使用较少的卷积滤波器,并通过squeeze-and-excitation模块扩展它。较重的neck block被使用stairstep进行上采样、带有hypercolmn的轻量block所取代。 head使用一个而不是三个输出,具有更高的分辨率 。综上所述, Poly-YOLO的参数比YOLOv3少40%,但可以产生更精确的预测 。

 

这里使用hypercolmn实现对于多个尺度部分的单尺度输出合成 。

 

设O是一个特征图,u(·ω)函数表示以因子ω对输入图像进行上采样,m(·)函数表示一个转换,把a×b×c·转为a×b×c×δ维度的映射,δ是一个常数。此外,认为g(O1,…,On) 是一个n元的composition/aggregation函数。为此,使用 hypercolmn 的输出特征图如下所示:

 

 

从公式中可以明显看出,存在着很高的不平衡——一个O1的单值投影到O的单值中,而On的单值却直接投影成2^n−1×2^n−1的值中。 为了打破这种不平衡,我们建议使用计算机图形中已知的staircase方法,参见下图 。staircase插值增加(或降低)图像分辨率最大10%,直到达到期望的分辨率。 与直接上采样相比,输出更平滑 。这里使用最低可用的upscale因子2。形式上定义staircase输出特征映射O ‘为:

 

如果我们考虑最近邻上采样,O=O ‘保持不变。对于双线性插值(和其他),O/=O ‘用于非齐次输入。关键是,无论是直接上采样还是staircase方法,计算复杂度都是相同的。虽然staircase方法实现了更多的添加,但它们是通过分辨率较低的特征图计算的,因此添加的元素数量是相同的。

 

 

为了了解实际影响,进行了以下实验。从Cityscapes数据集中选了Poly-YOLO 200个训练图像和100个验证图像,用于 hypercolmn 中直接上采样和staircase。我们为两种方式各进行了五次训练,并在下图中绘制了训练进度图。从图中可以看出,差异很小,但是很明显,在 hypercolmn 中staircase插值产生的训练和验证损失略低,在相同的计算时间下得到了改进。

 

 

修改YOLO架构的最后一种方法是在主干中使用squeeze-and-excitation(SE)块 。像其他许多神经网络一样,Darknet-53使用重复块,其中每个块由卷积和跳连组成。 (SE)块允许使用空间和通道的信息,这带来准确性的提高。通过(SE)块和提高输出分辨率,降低了计算速度 。由于速度是YOLO的主要优势, 为了平衡我们在特征提取阶段减少了卷积滤波器的数量 , 即设置为原始数的75%。

 

此外,neck和head较轻,共有37.1M的参数,明显低于YOLOv3(61.5M)。不过, Poly-YOLO比YOLOv3的精度更高 。

 

再者, 我们还提出了poly-yolo lite,旨在提高处理速度。在特征提取器和head中,这个版本只有Poly-YOLO66%的滤波器数量 。最后,s1减到1/4。yolo lite的参数个数为16.5M。

 

POLY-YOLO 实例分割

 

4.1 多边形边框原则

 

在这里,我们引入一个多边形表示,它能够检测具有不同数量顶点的目标,而不需要使用会降低处理速度的递归神经网络。

 

在一个公共数据集中,许多对象都被类似的形状所覆盖,不同之处在于对象的大小。例如,汽车牌照、手势、人类或汽车都有几乎相同的形状。 一般的形状可以很容易地用极坐标来描述,这就是为什幺我们用极坐标系统而不是笛卡尔坐标系来描述多边形的原因 。 以边界框的中心用作原点,αi,j代表一个顶点到中心的距离(除以box的对角线长进而归一化到[0,1]),βij为顶点到中心的角度。当检测到多边形边界框,可以通过对角线长乘以αi,j来获得多边形的box。 该原则允许网络学习与大小无关的一般形状,而不是具有大小的特定实例。

 

βij ∈[0,360],可以通过线性变换将其更改为βi,j∈[0,1]。 当某个极单元cell具有高置信度时,顶点必位于该单元内部。   通过与极坐标单元的原点和位置之间的距离,可以知道其近似位置,并且可以通过极单元内部的角度来精确调整位置。

 

 

 

4.2 与Poly-YOLO集成

 

检测边界多边形的思想是通用的,可以很容易地集成到任意的神经网络中。通常,必须修改三个部分: 数据准备的方式 、 体系结构 和 损失函数 。从语义分割标签中提取边界多边形见5.1节。所提取的边界多边形必须以与边界框数据相同的方式进行扩充。

 

在Poly-YOLO,输出层中卷积滤波器的数量必须更新。当我们只检测box时,最后一层输出维度为n=n a (n c + 5) ,n a =9(anchor个数),n c 为类别数。对基于多边形的目标检测进行集成,得到n=n a (n c + 5 + 3n v ) , n v 为每个多边形检测到的顶点数的最大值。

 

n v 对convolutional filter的数量有很大的影响 。例如,当有9个锚点、20个类和30个顶点时,输出层检测边界盒和多边形的过滤器将比只检测边界盒时多4.6倍。另一方面,增加只发生在最后一层;所有剩下的YOLO层具有相同数量的参数。 从这个角度看,神经网络参数的总数增加了微不足道的0.83% , 而且处理速度没有受到影响 。 缺点在于增加的部分在最后一层,这一层处理高分辨率的特征图。这导致在训练网络时对符号张量的VRAM需求增加,这可能导致在学习阶段使用的最大batch-size减少。

 

POLY-YOLO的损失函数为:

 

 

其中:

 

 

所述的集成方案可以同时检测box和多边形。 由于多边形顶点总是位于box中,两者检测的是同一个目标,因此两者可以互相支持,如果具有多边形形状检测的YOLO训练更有效,收敛速度更快的话。这一原理在文献中被称为“ 辅助任务学习 ” 。

 

例如一种特殊的情况,当目标是一个垂直的方形目标。在这种情况下,box的轮廓会与边界多边形的轮廓重合,并且边界框和多边形都会检测到左上角的顶点。但是,这两种检测将是协同的,所以训练时间应更短。

 

POLY-YOLO 实验效果

 

5.1 三个数据集

 

 

5.2 效果展示

 

 

 

 

总结

 

6.1 检测

 

对于特征提取,可以使用任意的SOTA主干,如(SE)ResNeXt或高效网络,这可能会提高整体精度 。这种方法也可以在 YOLOv4 中看到, YOLOv4 作者使用了不同的主干和其他一些技巧(也可以应用在本文方法中),但是原始YOLOv3的head没有改变。

我们在Poly-YOLO中描述的问题实际上来自于YOLOv3 head的设计,简单交换主干并不能解决这些问题

模型仍然会遭受标签重写和不适当anchor分布。

在本文工作中,关注的是通过概念变化而不是蛮力实现的性能改进。这样的改进可以广泛应用,并且可以很容易地集成到主干。

 

6.2 分割

 

如果两个顶点属于同一个极坐标单元,则取与边界框中心距离较大的顶点。该图还显示了这种限制的实际影响。这不是训练或推理的问题,这是标签创建的问题;网络本身是经过正确训练的,并根据(不精确的)训练标签做出预测。 在连接单个顶点之后,将第一个顶点与最后一个顶点连接起来,这可能会给强非凸对象带来问题 。不过, 这种行为不会在所有非凸对象上发生。如果两个顶点位于两个不同的极单元中,那幺即使是非凸的目标也可以正确地处理 ,如下图所示,Poly-YOLO甚至可以很好地处理非凸的星星。

 

 

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注