性能提升30%以上!产业SOTA的实时实例分割算法SOLOv2,更快更强!
共 6924字,需浏览 14分钟
·
2020-12-11 06:13
点击上方“CVer”,选择加"星标"置顶
重磅干货,第一时间送达
目标检测无法精细获得目标边界形状和面积,语义分割无法区分不同目标个体,并分别获得位置。小伙伴们可能会疑惑,这段视频展示的实例分割效果显然兼具了目标检测和语义分割二者的能力,是通过什么技术实现的呢?
下面给大家介绍的这类相当牛气的方法:实时实例分割算法SOLOv2!
SOLOv2算法可以按位置分割物体,完成实例分割任务,同时还兼具实时性。由于其出色的兼顾了精度和速度,已经被广泛应用于自动驾驶、机器人抓取控制、医疗影像分割、工业质检和遥感图像分析等领域。
相较于目标检测和语义分割,实例分割算法的构建和训练难度是非常复杂、且具有挑战性的。如果要同时兼顾精度和速度,难度又上了一个台阶。不过莫慌,本文不仅为大家准备了极其干货的实力分割算法原理和优化方法,还为大家准备了产业SOTA的实例分割算法【实现机器人抓取】和【工业质检】两个产业实践的案例解析。
惊不惊喜?意不意外?值不值得关注、学习以及Star?<(罒ω罒)>
着急的小伙伴可以Github传送门直接走起:
https://github.com/PaddlePaddle/PaddleDetection/tree/release/0.5/configs/solov2
感兴趣的小伙伴也可以加入SOLOv2技术交流群,与业界开发者一同交流学习。
从文章开篇的视频里我们可以看到,算法可以同时检测并精细分割不同快速移动的球员个体。而这个算法,使用的是PaddleDetection研发团队深度优化过的实时实例分割算法SOLOv2。经过一系列的优化后,SOLOv2-Enhance(PaddleDetection提供的SOLOv2的增强模型,如图五角星所示)的性能表现如下图所示:
Tesla V100-SXM2 的单GPU环境中预测速度达到38.6FPS,提升了31.2%;
COCO val2017数据集上mask AP达到38.8%,提升2.4个百分点;
单机8卡训练速度是SOLOv2官方PyTorch版本的2.4倍;
在精度和预测速度性价比方面达到业界SOTA级别。
PaddleDetection提供的SOLOv2为何有如此优势呢?下面从实例分割算法、SOLO算法演进历程及PaddleDetection对于SOLOv2深度优化等几方面为大家逐层剖析背后的设计和实现思想。
实例分割算法
实例分割一般分为自上而下和自下而上两种方法。
自上而下的实例分割方法
简单的说,这种方法就是先检测后分割。这类方法的代表选手是Mask R-CNN。它的优点是定位精度高,但也有一定的局限,比如:预测时延高,达不到实时,实例分割结果在物体检测框的束缚下等。
业界很多大神都在持续尝试基于Mask R-CNN算法进行改进,希望解决上述局限问题,GCNet、PANet、HTC、DetectoRS等网络就是在Mask R-CNN算法上优化、演进而来的。但是预测速度慢的问题仍得不到解决。
第一类可以被称为实时的实例分割的模型是YOLACT和YOLACT++,它们基于RetainNet,将实例分割分为两个并行的子任务,采用单阶段的网络结构,使网络计算量尽量小,后者训练54个epoch左右,最终在COCO test-dev数据集上的mask AP达到34.6%,在Titan Xp的GPU环境中达到27.3~33.5FPS。
而CenterMask算法则基于Anchor Free模型FCOS更进一步提升了实例分割的精度和速度,改进了backbone,提出VoVNetV2,同时基于Mask R-CNN的mask分支,引入Spatial Attention-Guided Mask(空间注意力模块),实时的CenterMask-Lite模型在COCO Test-dev数据集上的mask AP达到36.3%,在Titan Xp的GPU环境中达到35.7FPS,成为新的SOTA模型。
自下而上的实例分割方法
这类方法比较好理解,先进行像素级别的语义分割,再通过聚类、度量学习等手段区分不同的实例。PolarMask、SOLO系列算法就是其中的代表。
PolarMask基于FCOS的思想,将回归到检测框四边的距离问题转换为回归基于中心点不同角度的36根射线的距离问题,通过联通整个区域获得分割结果。这种方法创新性很高,但问题也很明显,如:通过角点确定分割区域的方法不够准确,mask AP较低,预测速度也很慢。
而SOLO系列算法经过不断的优化,在精度和预测速度的性价比方面超均越了YOLACT++和CenterMask算法,下面我们就着重介绍一下SOLO系列算法的发展历程及PaddleDetection针对SOLOv2算法进行的优化。
SOLO算法发展历程
SOLO(Segmenting Objects by Locations)算法的核心思想是将分割问题转化为位置分类问题,从而做到不需要anchor(锚框)及bounding box,而是根据实例的位置和大小,对每个实例的像素点赋予一个类别从而达到对实例对象进行分割的效果。
具体而言,就是如果物体的中心落在了某个网格内,该网格就负责预测该物体的语义类别,并给每个像素点赋一个位置类别。
SOLOv1
在SOLOv1中有两个分支:类别分支和mask分支。类别分支预测语义类别;mask分支则分割物体实例。同时,使用FPN来支持多尺度预测,FPN的每一个特征图后都接上述两个并行的分支。
(来自论文《SOLO: Segmenting Objects by Locations》)
其中,类别分支负责预测物体的语义类别,共产出S×S×C大小的预测结果。Mask分支中每个有类别输出的网格(正样本)都会输出对应类别的mask,这里一个通道负责预测一个网格的mask,因此输出维度是H×W×S2。同时基于SOLOv1,作者又提出了Decoupled-SOLO改进算法,将S2个分类器解耦为两组分类器,每组S个,分别对应S个水平位置类别和S个垂直位置类别,优化之后的输出空间就从H×W×S2降低到了H×W×2S,从而降低了网络计算量,如下图(b)所示,最后将两个通道的特征图做element-wise乘,进行特征的融合。
(来自论文《SOLOv2: Dynamic and Fast Instance Segmentation》)
SOLOv2
SOLOv2继承了SOLOv1中的一些设定,将原来的mask分支解耦为mask核分支和mask特征分支,分别预测卷积核和卷积特征,如上图(c)中的Dynamic head所示。
输入为H×W×E的特征,F、E是输入特征的通道数,输出为卷积核S×S×D,其中S是划分的网格数目。
Mask核分支位于预测head内,平行的有语义类别分支。预测 head的输入是FPN输出的特征图。Head内的2个分支都有4个卷积层来提取特征,和1个最终的卷积层做预测。Head 的权重在不同的特征图层级上共享。同时作者在kernel分支上增加了空间性,做法是在第一个卷积内加入了CoordConv,即输入后面跟着两个额外的通道,操作如下图所示。
(来自论文《An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution》)
我们知道深度学习里的卷积运算是具有平移不变性的,这样可以在图像的不同位置共享统一的卷积核参数,但是这样卷积学习过程中是不能感知当前特征在图像中的坐标的。CoordConv就是通过在卷积的输入特征图中新增对应的通道来表征特征图像素点的坐标,让卷积学习过程中能够一定程度感知坐标来提升检测精度。
同时SOLOv2也使用了Matrix NMS,通过矩阵运算所有的操作都可以单阶段地实现,不需要递归,比传统的NMS快9倍。
经过以上的迭代,SOLOv2成为当前产业最实用的实例分割算法。而飞桨PaddleDetection不仅复现了该模型,还对其进行了一系列的深度优化,使其精度和速度相较原网络有了进一步的提升。
PaddleDetection中的SOLOv2
经过PaddleDetection深度优化后的SOLOv2在具有如下五大亮点:
更优的骨干网络:ResNet50vd-DCN+蒸馏
更稳定的训练方式:EMA、Sync-BN
更多的数据增强方法
更快的训练方式
多种部署方式
更优的骨干网络: ResNet50vd-DCN+蒸馏
针对SOLOv2,飞桨使用更加优异的ResNet50vd-DCN作为模型的骨干网络,它相比于原始的ResNet,可以提高1%-2%的检测精度,且推理速度基本保持不变。
而DCN(Deformable Convolution)可变形卷积的特点在于:其卷积核在每一个元素上额外增加了一个可学习的偏移参数。这样的卷积核在学习过程中可以调整卷积的感受野,从而能够更好的提取图像特征,以达到提升目标检测精度的目的,是一种引入极少计算量并提升模型精度的最佳策略。
进一步的,PaddleDetection采用飞桨自研的SSLD知识蒸馏方法优化过的ResNet50vd,在ImageNet上的Top-1分类精度从79.1%优化到82.4%。感兴趣的同学可以到PaddleClas中了解SSLD知识蒸馏方案详情。
PaddleClas链接:
https://github.com/PaddlePaddle/paddleclas
SOLOv2模型在使用了ResNet50vd的SSLD知识蒸馏之后更优的预训练权重进行训练后,COCO minival数据集的精度提升了1.4%(36.4%->37.8%)。在V100上的预测速度上,从29.4FPS提升至38.6FPS。
更稳定的训练方式:EMA、Sync-BN
飞桨团队采用了EMA(Exponential Moving Average)滑动平均方案,将参数过去一段时间的均值作为新的参数,让参数学习过程中变得更加平缓,有效避免异常值对参数更新的影响,提升模型训练的收敛效果。实验发现,使用EMA后网络收敛速度明显加快。
一般情况下,Batch Norm实现只会计算单卡上的均值和方差,相当于‘减小了’批大小。SOLOv2实际训练比较耗费显存,单卡的batch size较小,为2。针对这种情况,我们引入了同步的Batch Norm,即:Sync-BN,它可以统计全局的均值和方差,获得更稳定的统计值,相当于‘增大了‘批大小。
综上,通过训练过程中的指数滑动平均、Sync-BN的Trick,SOLOv2模型又提升了0.6%(37.8%->38.4%)。
更多的数据增强方法
在SOLOv2中除了采用空间变换(随机尺度变换、随机裁剪图片、随机翻转等)、颜色扭曲(透明度、亮度、饱和度等)、信息删除(增加随机噪声、随机遮挡等)等常用数据增强方法之外,还使用了一种新颖的信息删除方法:Grid-Mask方法。
Grid-Mask方法属于信息删除的方法。其实现方式是随机在图像上丢弃一块区域,作用相当于是在网络上增加一个正则项,避免网络过拟合,相比较改变网络结构来说,这种方法只需要在数据输入的时候进行增广,简单便捷。
经过数据增强之后,SOLOv2模型在保持原有速度的情况下,精度又提升了0.4%(38.4%->38.8%)。
更快的训练方式
而实际的训练过程往往是艰辛和漫长的,往往一次训练实验要耗费十几甚至几十个小时,PaddleDetection在网络训练层面,针对损失函数(loss)计算进行了针对性的工程优化,从而加快了训练速度。
预取Target: 在计算loss时,输入ground truth需要经过一定的映射转换,将此流程放到数据预处理中进行,因数据预处理和模型计算是异步进行,起到了预取的作用。
减少数据拷贝并GPU计算: 在官方PyTorch实现中,损失函数计算通过Numpy计算,在PaddleDetection中,由于飞桨框架提供了丰富算子,损失计算采用框架算子组合计算,不仅减少了数据的拷贝时间,还可以使用GPU计算加速。
Batch计算: 在官方PyTorch实现版本中,Loss计算时,循环计算每张图的损失,在PaddleDetection中,采用batch计算(比如batch size=2,那么同时对2张图运算),加快了整体的训练速度。
采用飞桨分布式训练能力,在8卡Tesla V100-SXM2上,COCO数据集上训练一个SOLOv2-R50-1x的模型,训练12个epoch,只需要10小时就能完成。
多种部署方式
除了科研、学习使用外,PaddleDetection还充分考虑了产业用户的需求,使SOLOv2支持多种环境、多种语言的预测方法,包括:
服务器端Python部署和C++部署:多用于工业、互联网等拥有服务器、工控机的环境;
Paddle-Serving服务部署:多用于希望进行云端部署的场景;
Paddle-Lite轻量化部署:多用户在边缘、轻量化设备、国产芯片等进行部署的场景;
Windows系统部署:充分考虑工业场景多为windows系统的现状。
优化前后的SOLOv2性能对比
经过网络优化后,SOLOv2算法在COCO minival数据集上的mask AP达到38.8%,在单张Tesla V100上单卡预测速度达到38.6FPS。相比于原论文,精度提升2.4%,预测速度提升31.2%。
除此之外,PaddleDetection还集成了基于MobileNetv3的轻量化模型,在最小输入尺寸448像素时,可以在V100上达到50FPS,COCO val2017数据集上mask AP达到30.0%,预测速度进一步提升。实验具体数据指标如下表所示:
注:表中带有**符号的模型代表PaddleDetection提供的开源模型。
产业实践
如开篇所说,实例分割算法在产业中有非常广泛的应用场景,如:自动驾驶、机器人抓取控制、医疗影像分割、工业质检和遥感图像分析。下面我们就通过机器视觉导视和机械总院带钢表面缺陷检测两个案例,介绍下实例分割在产业中的应用。
机器视觉导视
2D机械手抓取的思路往往是将算法提供的图像位置坐标信息转化为机械手的世界坐标,进而指导机械手实现抓取。实际的视觉导视里不仅需要了解目标的位置,还需要进一步了解目标的角度信息,因此实例分割逐渐被使用在了视觉导视中。
下面是利用机械手吸盘抓取屏幕实现自动化装配的案例图像。我们可以看到,单纯使用目标检测虽然可以得到坐标信息,但对于倾斜的产品的定位却很难做到精确,而使用SOLOV2实例分割,是可以精确的得到目标的轮廓信息。
再通过将SOLOv2输出得到的结果进行转化,将Mat图像转换成散点图坐标,得到整个点的位置坐标,根据产品的质心和轮廓点判断出经过计算传输给机械手较好的抓取坐标,进而实现精准抓取。
工业质检
在工业质检中,要求标准精细化与出货灵活化,因此需要对缺陷的精细量化,让厂家更好的控制产品的良品率。比如在A产品上,5mm的缺陷是NG产品;但是在B产品上,即使是10mm也属于OK产品。在工厂中产品有着严格的等级标准,质检人员通常使用菲林比对卡来看缺陷的大小。因此如果深度学习想要进一步的利用在缺陷检测中,不仅仅要实现对于缺陷的定性分析,也需要定量计算缺陷的大小。通过实例分割,可以实现对于缺陷的像素级别分割,通过单像素精度的换算可以算得缺陷的实际物理尺寸,进而配合质量标准进行产品管控。
实例分割算法就很好的实现对缺陷的位置及大小精确的捕捉量化,并且可以对缺陷类型进行分类。机械总院在带钢表面缺陷检测系统中采用PaddleDetection中提供的SOLOv2算法实现对于缺陷的识别和大小的计数,达到了良好的效果,在被生产监测系统集成后,直接推动产线质检效率、精度大幅度提升。
写到这里,你还不心动嘛!赶紧前往飞桨PaddleDetection项目地址,学习、试用吧!!!记得顺手帮我们点亮Star哦~
GitHub 链接:
https://github.com/PaddlePaddle/PaddleDetection
Gitee 链接:
https://gitee.com/paddlepaddle/PaddleDetection
更多飞桨的相关内容,请参阅以下内容。
官网地址:https://www.paddlepaddle.org.cn
飞桨开源框架项目地址:
GitHub: https://github.com/PaddlePaddle/Paddle
Gitee: https://gitee.com/paddlepaddle/Paddle
整理不易,请给CVer点赞和在看!