【酷干货】任海兵:精准快速的物体分割算法

简介: 本文根据《优酷技术沙龙——优酷认知实验室专场》现场,阿里巴巴资深技术专家任海兵的演讲《精准快速的物体分割算法》整理成文。

写在前面:

本文根据《优酷技术沙龙——优酷认知实验室专场》现场,阿里巴巴资深技术专家任海兵的演讲《精准快速的物体分割算法》整理成文。

image.png

大家下午好,我是优酷认知实验室的任海兵,大家对CV了解的话都知道物体分割确实是CV界的经典题目,最近几年随着深度学习的发展,物体分割方面的研究取得了很大的进展。我主要给大家介绍一下,我加入优酷以来,在物体分割算法方面做的一些工作。

首先我会跟大家介绍一下我们为什么会选这个题目。可能很多同学对分割这块不是很了解,我接着给大家讲一下几个基本的概念,方便大家对后面的这几个算法有更深入的了解。后面这几块是我做的一些研究工作:

第一块是我们目前已经基本完成的,是图像的物体分割算法。

第二块是我们目前重点做的,基于类别无关的物体分割算法。

最后我们会介绍一些我的计划,关于视频物体分割算法,因为优酷的主要业务是视频,所以视频物体分割算法是我们研究的重要目标。

我们都知道AI的几个要素,就是算法、算力、数据和应用场景,数据是非常重要的,我们大家都知道imagenet数据集,它是CV界的一个非常重要的数据集,直到现在我们还用imagenet数据做我们模型的pretain。我们算法每次都会快速的迭代更新,但数据是可以沉淀下来,对我们有长期的帮助。但是数据的获取不是说那么容易的事情。如果你有一个很好的数据集,运行一下基本的算法,就可以发一篇很好的CVPR的paper。我们可以看一看,就是说我们数据集获取到底有什么问题,有什么难度。

image.png

右边两个图是我们经常用的图像分割数据集,最下面这个是微软的COCO数据集,它这个标注其实是很不准确的,这个图片还是选的比较好的标注结果。如果我选一些自行车的话,标注准确度就更差了,自行车车轮都是八边形、九边形,那样的车子根本就没法骑。

相对于MS coco,pascol voc的标注更加准确。但是我们可以看出它有好多白边,白边什么意思呢?白边的意思就是说这是物体的边界,我们的标注不是很准确,研究人员用数据训练模型、计算Loss函数的时候,这个白色的区域你要把它忽略掉的。否则你训练出来的模型准确率不会很高。

我们优酷也有自己的数据标准平台,前段时间他们在帮着标注一些区域的精确边缘,我们就发现了标注的难度是很高的。通常的一个物体需要10-20分钟才能标出一个精细的边界出来。所以,我们的想法是说能不能用我们的算法来帮助标注人员,使他们能够快速的标注。

我们先给大家看一个视频,这个是Deep System公司的智能标注平台,它以标注的车为例。左边这个是一个传统的标注方式,一点点手工去标,右边是用算法赋能的标注平台,我们可以比较一下它们的标注效率。我们先看左边,一个点一个点的去标注。其实车是一个比较好标的物体,因为它是一个非常有规则的物体,而且是刚体,没有很大的变形。跟车相比,人是非常难标的,因为人的头发、发丝,人的衣服的褶皱都是很不规律的,有时候人的身体上还有一些窟窿的地方,都需要标下来。

image.png

从上面的视频可以看出,智能标注平台的效率是普通标注的10倍。利用AI智能标注算法,打上两个点,左上跟右下,就把车给分割出来。

那么我们看看它是怎么来标的。它或者用算法来检测这个物体框,或者说人手工来画物体框,然后用分割算法自动分割出物体边缘。Deep system公司用的是Unet的分割算法。我们来看看这种方法,看起来好像是很美好的,可以很快就标出物体边缘,实际上有很多问题。一个最重要的问题就是它为什么能把车智能的分割出来?因为它是先训练了一个很好的分割模型,怎么训练这个分割模型?需要事先有足够的这种训练数据来训练。我们为了训练比如说人的一个分割模型的话,你先给我标出5000张人的图片,按照传统的方法来标,然后我再给你训练这一个分割模型,然后你用它来智能的标人。如果车的话,再先手工标出5000张车的边缘。所以,它是一个跟类别相关的分割算法。它这种标注工具就不能够标注事先没有训练过的物体类别,原因是分割算法就不能够来分割这种没有事先训练过的物体的类别。

另外,它只有图象的分割没有视频的分割。

而我们对于智能标注平台的预期是什么?

第一,它要能够自动标注很精细的物体边界,远远要比CoCo,要比Pascal VOC要精细的很多。

第二,它能够智能的标注一些非训练过类别的物体,这其实是要求分割算法要能够来分割这种非事先训练类别的物体,你要有类别无关的物体分割算法能力。

第三,要有智能的视频物体分割算法。

我们采取的算法策略是:第一步我们为了标注精细的边界,我们希望能有一个精细边界分割能力的图象物体分割算法。第二点,我们希望能够有一个类别无关的物体分割算法。什么叫类别无关呢?就是说我们的算法学了标车、标人,那它还能够给我标一些动物,它能给我标一些鱼,它有一定的类别泛化能力。

另外,根据我们实际的情况,我们采用了少量的人工交互信息。当然我们不是像这种传统的人工交互信息。为了把这个人标出来,传统算法需要在靠近边界的前景区域划很多线,背景区域再划很多线,然后我们再用这种分割算法来进行分割。我们觉得这样太复杂的。我们希望就像刚才那样,画两个点,或者画一条线等等这种,尽量少的人工标注。

第二点,我们希望还要有基于运动信息的类别无关物体分割算法。因为这是对视频里面的物体分割是有极大帮助的。

最后,我会说一下我们后续的计划:快速视频分割算法的一些设想。

我首先给大家介绍几个基本概念。

image.png

第一,图象的语义理解。图象的语义理解意思就是说,给一个图片,我们对它的每个象素都要做分类,分的类别是我们事先会定义的。比如说PASCAL VOC的数据集,它事先定义了20类,人、小轿车、自行车等等这些类别。语义理解这个象素是人的这个类别,它不会分这里面的象素属于哪一个人,对它来讲只要是人就OK了,语义理解在自动驾驶里已经是足够了。

它的评估标准一般都是用IoU来评估的,IoU是什么意思呢?有了物体真值的区域和我们分割的结果区域,它们两个交的面积除以它们两个并的面积就得到了IoU。如果这两个区域完全不交的话,就是0,如果这两个区域完全重合的话,就是1。1就是一个最好的结果。

目前比较好的语义理解算法有FCN、Deeplab系列等。Deeplab现在已经有多个版本:V1、V2、V3、V3+。目前V3+是最好的语义理解算法。它的优点就是分割结果的边缘比较准确,但是它的缺点当然很明显了,它不能分清楚到底是哪一个物体。我们学术上来说,它就是不能进行物体实例分割。

第二种分割算法是物体实例的分割算法。同样是这个图,我们既要把每一个象素把它的类别给得到,而且我们要知道它是不同实例的。像这张图像上的5个人,我们要分清楚这ABCDE5个不同的物体实例。

它一般的评估标准是在IoU大于0.5的时候AP值。对每一个实例算一个IoU,大于0.5就认为它是一个正确的检测。AP是我们检测里面常用的,这种通过Recall rate、Precision rate算出来的一个值。

最经典的算法就是Mask r-cnn。它的缺点其实也是比较明显的,如果我们用过Mask r-cnn都知道,它里面核心输出的Mask分辨率只有28×28象素,所以它的分割边缘精细程度是不够的。

下面我们就着重讲一下我们的算法,我们就先从图片物体分割开始。像我们优酷,人是我们图片里面最重要的信息,所以我们先从人的分割做起,我们希望把人从图片里分割出来。图片物体分割算法不仅对我们的业务有很大帮助,像这张图片是我们的业务团队给我们的,他们希望我们的算法能把图片里的人精细的分割出来,包括这个手指头。

这也是我们自己分割算法的一个结果,我们可以看出它还是蛮不错的。从算法的角度来讲,基于图片的物体分割算法,也是其它分割算法的一个基础。我们可以利用Transfer Learning这种方式把它迁移到类别相关的物体分割上面,而且它是一些视频分割算法的重要的模块的基础,比说这个Mask Propagation、Mask refinement等等。

image.png

基于图片物体分割算法,我们首先讲类别相关的物体分割算法。它最大的难点就是整体信息和局部信息的结合。以右边的图为例,这是一张原图,我们希望我们的分割结果能像旁边的真值图像,实际上如果我们过度依赖于整体信息的话,它的分割结果就是左下的图,整体觉得还行,还是一个人的样子,但是它会丢掉一些精细局部的区域。如果我们过分依赖于它的局部特征的话,就有引入很多的毛刺,有些奇怪了。有的时候甚至就不像人了。

image.png

我们说一下整体特征是什么,一般的分割网络它都有一个编码、解码的过程。它的高层特征可以理解成为编码CNN网络的高层参数,同一类别的高层特征它的离散比较小,意思是说它都非常相似,例如不同人的图象,它的高层特征其实很相似的。不同类别物体的高层特征类间距离很大,重叠性很小。例如人跟车属于不同类别,它们的高层特征之间差别很大。所以,这是很好的一种特征。我们做物体检测的时候,仅仅利用这种高层特征就OK了。

低层特征是什么呢?是一些局部特征,也就是CNN编码网络的低层网络。从感观上来讲,给你一个小小的局部区域,你能够看出来它是属于哪个物体类别吗?肯定是看不出来,这就说明了同一类别局部特征类内的离散度很大,类间也有一个很大的重叠,它的泛化能力是很差的,你仅仅通过这个局部的信息其实很难做物体的分割。

但是,这个局部特征又非常重要,因为我们想分清楚物体的精细边界,就要把局部体征很好的利用。不知道大家用不用Photoshop等这一类工具,我们想把一个物体人工的扣出来,为了扣得准确,常常要把图片放的很大,盯着那个边缘区域仔细看,这说明它的局部特征对于物体精细边界的分割是非常重要的,尤其是对我们优酷而言。我们优酷做的东西是干嘛的?是给人看的,人的肉眼比任何的评估标准都要严格,因为我们的眼睛是非常敏感的。

传统的方法是怎么结合整体和局部特征呢?我们可以看看这个图,这是刚才说的Unet的网络,左边是编码网络,右边是个解码网络。它输入图片过来,左上是CNN编码网络的低层,坐下是高层。它的解决措施就是加skip连接,每个编码层的特征连接到的对应的解码层。

然后,进行feature concat,意思是说把他们特征合在一起。一般feature concat之前常常会加1×1的卷积,把它的通道数要改变一下。比如说改变完了之后是16个通道的低层编码特征,这边是64个通道的解码特征,feature concat就把它合起来变成80个通道的特征。

这种能有很好的效果,但是还是有一定的问题。我们能感觉到的最直观问题是,如果testing集合中有一些局部特征在training集合没有出现过或者出现频度很低,它的分类效果也是很不好的。其实本质原因就是我们前面提的,局部特征的泛化能力很差,所以你完全基于Machine learning的角度去学习的话,并没有提高泛化能力。我们就举个例子,这个是原图,这个是分割结果,分割结果中很明显少了一大块。为什么少了?我们分析原因就是在training集合中没有这种类似的衣服款式,就是它没有学习到这样的局部特征。所以,依靠Machine learning的方法并没有真正解决局部特征的泛化能力。

如果我们对这种传统的分割算法了解比较多的话,我们可以知道很多传统分割算法并不是强烈依赖Machine learning,很多都是基于一些实际规则信息,就不存在这种局部特征的泛化问题。当然,如果单单用这种方法去分割的话,一个很大的问题就是它太拘于规则了,没有语义知识,有时它会得到各种奇形怪状的结果。

所以,我们提出来一个策略:通过语义理解信息,强制约束传统算法来进行一个分割。语义理解的特征它不是说我们前面分割结果,它既包含了一些整理特征,又包含了一些局部特征。我们采用的就是传统算法里面比较好图分割的策略,它的能量函数有两部分,x表示它的分割结果,h是我们加进去的一个高层语义特征。

第一项是unary energy,就是说跟每个像素点单独相关的能量。这个是Pairwise energy,就指的两个象素之间关系的能量。我们对这两项中加入了一些强制约束,我们额外又加了一个能量项,这样我们就可以达到一个很好的效果。

image.png

我们利用Pascal VOC,Supervizely,还有包括我们自己的一些数据,来组建了一个人体数据集,我们算法平均IoU大于95%,95%是个什么概念呢?我们来看这个分割结果吧,这个结果大概就96%、97%,就比平均结果稍微好一点。从这个结果来看,95%IoU已经是很高的正确率了。所以,从实验结果看,我们的方法已经可以很好的解决了局部特征的泛化能力问题。

同样我们把这个算法往多类别物体分割进行推广,也取得一些还不错的效果。比如说这个图片,人跟摩托车,分的还不错。但是我们发现了一个很大的问题,我们在原来数据上引入了COCO的数据,COCO数据的标注跟Supervizely的数据标注是有冲突。又是数据问题,处理那数据问题我们要重新来对数据进行重标、清洗等等,我们又回到了起点。

通过这个事情,我们发现基于传统的类别相关的分割算法是有很大局限性的,我们要加速类别无关分割算法的研究。我们后来又看到了一篇He Kaiming2018年的论文,是关于MaskxR-cnn。我们都知道He Kaimin是Mask R-cnn的作者。这个算法引起了我们的共鸣,在这篇论文里面它提出了类别无关的物体分割。现实中,我们能够拿得到有分割标注的数据类别是非常少的,比如说Pascal VOC是20类,COCO有80类物体,实际上我们的世界里的物体类别,几千类、几万类都是有的,我们不可能为每一类都标注大量的样本去训练模型。

所以,我们一定要做一款与类别无关的分割算法,这一点引起了我们的共鸣。我们结合我们的实际,引入了人工标注信息,让算法知道这个图片里面感兴趣的物体。目前,我们是画一个框,让算法知道我们是对框里的这个人是感兴趣的,你就把这个人给我分出来。另外一个框里面我们是对老虎感兴趣,你把老虎给我分割出来。我们事先训练集没有老虎的图片,人图片应该是非常多的。

物体框作为强约束,使得这种算法能够理解我们的人所关注的兴趣点。

同时我们还在做一些以画线、打点为交互信息的研究,因为画线和打点从理论上来讲,比物体框能够提供更强有力的指导信息,更方便我们的算法找到我们人的关注点。

我们的算法思路其实是来自于去年CVPR的一个Masklab算法,这个法本身不是类别无关的,它是一个类别相关的实例分割算法,它把实例分割看成了一个多任务学习,检测物体框是一个任务。而在我们场景中,物体框是用户可以直接提供的,所以我们可以改变它的算法策略,把框直接加入到我们的输入参数里面。另外,它这个里面还学了象素的实例中心方向的任务,在我们算法里面,把它作为一个隐含任务,通过物体框来约束得到一个端到端的策略。

image.png

除了刚才的分割结果,我们还有很好的一些分割结果,比如说这个是人骑着摩托车,我们画一个摩托车的框,就可以得到摩托车的分割区域,然后画一个人框,得到人的分割结果。这都是我们真正的实验结果。而且它是一个完全实例的分割,比如这个图像里有三个人,我只对右边这个人感兴趣,那么这框一画,就把右边这个人给我分割出来了。

下面给大家讲一下我们刚开始做的基于运动信息的物体实例分割,咱们看一下旁边的视频。这是一个车运动的视频,在这个视频里我们只是在第一帧上面画了一个框,然后它就能够在整个视频里面把这个车的去给我分割开来。

image.png

它是利用的运动信息来分割物体。这里面背景的运动模式只是说摄像机的运动造成的;车的运动是由两部分造成的,一部分是车本身的运动,另一部分是摄像机的运动,所以车的运动模式跟背景的运动模式是不一样的。所以这两种不同的运动模式是给了他一个很强的辅助信息。

具体的算法我们可以看一看,这是他网络的框架,这是很有意思的框架,先不看第一行,先从底下看。最下面一行的输入是我们感兴趣的物体,比如说刚才框区域。中间行的输入是我们第二帧的图片,我们希望在第二帧图片里面找到鸟的这样一个区域出来。我把它分成两部分,上面两行其实就是我们的一个分割网络,简单的一个分割网络,这里面有一些skip连接,feather concat要有的都有了。我们再看看下面这两行,下面这两行其实是一个基于深度学习的跟踪网络。这地方是我们目标区域征,这是我们整个图像的,这块是跟踪中response图片。所以这种算法把两种方法整个组合在一块了。

最后我们说一下视频的分割算法,视频分割算法领域里面研究最多题目是单一样本的视频分割。意思是在第一帧的图片给出感兴趣物体的区域,后续视频中用算法分割处理。例如旁边这个视频中,第一帧图片里面我们关注这三个物体,那么在视频的后续这里面你要把这三个人都给我分割出来,它是实例级别的分割。这里面不同instance之间会有遮挡,而且会有变形等等。后面的视频里有个花的实例,它的前面跟背面的表观变化很大。

德国亚琛大学提出来PreMVOS方法,拿到了去年最重要的两个比赛的冠军,一个Davis osvos,还有一个youtube vos。,Davis是很难的一个比赛,去年的第二名是商汤,商汤还是2017年比赛的第一名,去年的Davis第三名是腾讯AI Lab。

但是,这个算法有很大一个问题,当然是对我们来讲是一个很大的问题。就是它计算时间超长,它对每一个视频的每个实例都要Fine tune Mask R-CNN的网络、DeeplabV3+的网络以及 REID网络。所以,一个视频来之后,先花半个小时到一个小时Fine tune三个模型,然后再来做视频物体分割。这对我们标注平台是不可能的。

所以,我们预期是一个快速、高效、精准的视频分割算法。首先精准的物体边缘分割,我们计划采取的策略就是我们前面所说的基于语义理解约束的分割算法。

第二个是相对于OSVOS需要第一帧的人工标注的图片,我们希望能够采取尽量少的人工标注,能够算法自动生成初始帧实例分割区域。具体算法是我们刚才所说的基于交互信息的类别无关物体分割算法。

第三个就是一个快速的视频分割策略,不能有在线学习,在线学习时间太长了,我们希望借助于基于运动信息的物体分割算法,当然要加上视频分割里常用的一些策略,比如说像Mask propagation、Maskrefinement等等。

以上就是我的分享,谢谢大家。

相关文章
|
2月前
|
机器学习/深度学习 监控 算法
yolov8+多算法多目标追踪+实例分割+目标检测+姿态估计(代码+教程)
yolov8+多算法多目标追踪+实例分割+目标检测+姿态估计(代码+教程)
114 1
|
4月前
|
算法 数据挖掘 计算机视觉
Python利用K-Means算法进行图像聚类分割实战(超详细 附源码)
Python利用K-Means算法进行图像聚类分割实战(超详细 附源码)
99 0
|
6月前
|
算法 测试技术 C#
C++算法前缀和的应用:分割数组的最大值的原理、源码及测试用例
C++算法前缀和的应用:分割数组的最大值的原理、源码及测试用例
|
4月前
|
算法 测试技术 C++
C++算法:分割回文串
C++算法:分割回文串
|
2月前
|
算法 测试技术 C++
【动态规划】【数学】【C++算法】805 数组的均值分割
【动态规划】【数学】【C++算法】805 数组的均值分割
|
3月前
|
算法 测试技术 C#
【动态规划】【数学】【C++算法】805 数组的均值分割
【动态规划】【数学】【C++算法】805 数组的均值分割
|
3月前
|
存储 算法 JavaScript
|
3月前
|
机器学习/深度学习 算法 搜索推荐
快速排序:高效分割与递归,排序领域的王者算法
快速排序:高效分割与递归,排序领域的王者算法
37 1
|
3月前
|
机器学习/深度学习 算法 计算机视觉
【论文速递】CVPR2021 - 基于自引导和交叉引导的小样本分割算法
【论文速递】CVPR2021 - 基于自引导和交叉引导的小样本分割算法
23 0
|
4月前
|
算法 数据挖掘
[Halcon&图像] 阈值分割算法拓展
[Halcon&图像] 阈值分割算法拓展
51 1