大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
进入2017年之后,深度学习计算机视觉领域有了新的发展。在以往的研究中,深度神经网络往往是单任务的,比如图像分类(AlexNet, VGG16等等),图像分割(以FCN为代表的一众论文),目标检测(R-CNN,Fast R-CNN和Fatser R-CNN,以及后来的YOLO和SSD,目标检测领域已经实现多任务)。而在最新的研究中,上述的任务往往被集成了,通过一个框架完成,代表就是实例分割。先来看看实例分割的例子:
第一个是户外的测试结果:
第二个是检测的泰迪熊:
大家可以看到,实例分割的效果一共有三点:
1. 将物体从背景中分离(测试结果上只是没有画出目标框),即目标检测。
2. 对检测到的物体进行逐像素提取,即图像分割。
3. 对检测到的物体进行类别划分,即图像分类。
因此,实例分割是一个很综合的问题,融合了目标检测,图像分割与图像分类。实例分割的结果包含的信息相当丰富,代表作包括Mask R-CNN与本文介绍的FCIS,前者是Facebook团队贡献的(Mask R-CNN的一作何凯明之前也供职于微软),后者是是微软的团队贡献的,下面,笔者就来分析一下FCIS。
首先,要达到“实例分割”效果,我们先来看一下以FCN为代表的传统图像分割算法有什么问题:
上面的图片是一张DeepLab论文中的效果图,图中的白色框和黄色框是笔者自己加上的。大家可以看到,如果是实例分割,在白色框的内部某些像素会被分类成“person”,属于前景,而剩余的像素则是背景。同样地,在黄色框内,某些像素会被划分为”motorcycle”,而其余的像素会被划分为背景。那么,在白色框与黄色框重复的区域,有些像素的语义就出现了差池,如在白色框中是背景,在黄色框中是前景。对于这个问题,由于传统的图像分割网络采用交叉熵,结合图像标签端到端训练,在标签中,对于一个像素点,语义类别是固定的,一个像素点只能对应一种固定的语义,由于卷积的平移不变性,一个像素点只能对应一种语义,因此没有办法达到实例分割的效果。也因此,产生了实例分割的问题。
对于这个问题,论文中的阐述是:
However, conventional FCNs do not work for the instance-aware semantic segmentation task, which requires the detection and segmentation of individual object instances. The limitation is inherent. Because convolution is translation invariant, the same image pixel receives the same responses (thus classification scores) irrespective to its relative position in the context. However, instance-aware semantic segmentation needs to operate on region level, and the same pixel can have different semantics in different regions. This behavior cannot be modeled by a single FCN on the whole image.
那么,现存的实例分割领域的方法是如何解决上面的问题呢?主要是通过多任务网络来解决(Multi-task Network),笔者以Instance-aware Semantic Segmentation via Multi-task Network Cascades这篇代表作举例(值得一提的是,这篇文章也是微软团队贡献的,何凯明位居二作,发表于CVPR 2016)。多任务网络是这样做的:首先,通过卷积神经网络先提取初级特征,并提出ROI(region of interest)。然后,对于每个ROI区域,通过ROI Warping和ROI Pooling提取出对应的特征。接着,使用全连接层(FC layer)进行前景与背景的划分(Mask Predictoin)。最后,再针对每一个ROI,使用全连接层(FC layer)进行图像分类。示意图如下(该示意图来自论文):
然后,我们来看一看上述的多任务网络方法有什么问题:
问题1:由于全连接层的输入要求,所有ROI区域都要被转化为相同的尺度,这对于不同尺度的目标(尤其是面积比较大的目标)来说,细节信息损失巨大。大家都知道,全连接层的本质是矩阵乘法,因此需要相同尺度的输入,才能和固定尺度的参数进行矩阵相乘得出结果。那么,所有目标区域(ROI)都要被放大或者缩小成一样的尺度(这个被称为ROI-Pooling技术被Fast R-CNN提出,该论文发表于ICCV 2015,值得一提的是这也是微软团队的工作)。那么,在前景与背景分离这个问题上面,对于面积大的目标区域,是将其缩小之后再进行分离,然后将得到的结果(Mask)放大到原来的尺度作为前景,这样对ROI区域的操作非常容易损失掉目标的细节信息(比如说,车子的轮子在缩小的过程中就没了,再放大之后也不会再有)。
对于问题1,论文做出了如下表述:
First, the ROI pooling step losses spatial details due to feature warping and resizing, which however, is necessary to obtain a fixed-size representation for fc layers. Such distortion and fixed-size representation degrades the segmentation accuracy, especially for large objects.
问题2:全连接层参数规模庞大,这种尾大不掉的架构很有可能发生过拟合。从笔者的caffemodel解析这一篇博文中提到了,将一个简单的LeNet模型的可训练参数提取出来,最后两个全连接的参数竟然达到了网络参数规模的90%以上。由于这个问题,训练与测试的代价也会增多。
对于问题2,论文做出了如下表述:
Second, the fc layers over-parametrize the task, without using regularization of local weight sharing.
问题3:在ROI区域提出后,图像分割的子任务与图像分类的子任务之间没有共享参数。大家从上图可以看到,在图标区域提出后,图像分割任务与图像分类任务都是各自训练不同的全连接层,这样使得架构的效率异常低下。
对于问题3,论文做出了如下表述:
Last, the per-ROI network computation in the last step is not shared among ROIs. As observed empirically, a considerably complex sub-network in the last step is necessary to obtain good accuracy. It is therefore slow for a large number of ROIs (typically hundreds or thousands of region proposals).
针对以上3个问题,我们来看看FCIS是怎么解决的。
首先针对问题1,ROI-Pooling被取消了,取而代之的是对ROI区域的聚合,实质就是复制粘贴。
然后针对问题2,全连接层(FC layer)被取消了,取而代之的是分类器(softmax)。
最后,针对问题3,图像分割与图像分类使用的是相同的特征图。
下面详细讲述一下FCIS的解决方案。
对于卷积层的平移不变性,本文采用的方法是生成若干组特征图(k×k组),但这个方法并不是FCIS的首创,而是在论文Instance-sensitive fully convolutional networks中提出,该篇论文发表于ECCV 2016。值得一提的是,这篇论文依然是微软团队的作品,何凯明依然是二作。该篇论文提出的方案采用了如下的做法:
对于每一张输入图片,生成k×k组特征图(在上图的例子中k为3),每一组特征图,称为score map。每一组score map,表示的是输入图像中每一个ROI的不同位置的分数(score)。比如,左上角的一张score map,代表的就是输入图像中每一个ROI中的左上角部分(标志为1的小框内部)的score,其他的类推。score代表的含义是某个特定位置(小窗)的像素点属于ROI中的前景的分数。
那么,这么做有什么好处呢?这样做解决了卷积的平移不变性带来的问题,使得不同ROI中的重叠区域在不同ROI中的score是不一样的。见下图所示:
大家可以看到,输入图像中的红点区域被不同ROI共享,那么,在不同的score map中,该区域对应的score完全不同。这就很好的实现了,相同区域,不同语义的问题。
那么,这样做可以解决图像分割这个子问题。可是,没法解决图像分类的问题。对于图像分类的问题,目前的方案往往是采用一个后续的网络进行,也就是说,图像分割和图像分类的子任务还是串联方式完成的,并没有并联。
针对上述的问题,FCIS是怎么实现图像分类与图像分割的并联呢?答案是通过两类score map解决,一类叫inside score map,一类叫outside score map。inside score map表征了像素点在ROI区域内部中前景的分数,如果一个像素点是位于一个ROI区域内部并且是目标(前景),那么在inside score map中就应该有较高的分数,而在outside score map中就应该有较低的分数。反之亦然,如果一个像素点是位于一个ROI区域内部并且是背景,那么在inside score map中就应该有较低的分数,而在outside score map中就应该有较高的分数。针对图像分割,使用两类score map,通过一个分类器就可以分出前景与背景。针对图像分类,将两类score map结合起来,可以实现分类问题。
这样做还有一个好处,通过两类score map的结合,可以甄别出ROI检测失误的区域。
对于上面的描述,论文中的原句是:
For each pixel in a ROI, there are two tasks: 1) detection: whether it belongs to an object bounding box at a relative position (detection+) or not (detection-); 2) segmentation: whether it is inside an object instance’s boundary (segmentation+) or not (segmentation-).
大家可以看到,上图中的left/right: position-sensitive inside/outside score maps,分别表示了所有ROI中的不同区域的inside/outside scores。为啥是所有ROI呢?因为这一系列score map是所有ROI共享的,大家可以留心上图中从上到下三组inside/outside score maps(每组18张)都是相同的。
针对图像分割任务和图像分类任务的并行,FCIS这样处理:
首先,对于每个ROI区域,将inside score maps和outside score maps中的小块特征图复制出来,拼接成为了ROI inside map和ROI outside map。针对图像分割任务,直接对上述两类map通过softmax分类器分类,得到ROI中的目标前景区域(Mask)。针对图像分类任务,将两类map中的score逐像素取最大值,得到一个map,然后再通过一个softmax分类器,得到该ROI区域对应的图像类别。在完成图像分类的同时,还顺便验证了ROI区域检测是否合理,具体做法是求取最大值得到的map的所有值的平均数,如果该平均数大于某个阈值,则该ROI检测是合理的。
针对输入图像上的每一个像素点,有三种情况:第一种情况是inside score高,outside score低;则该像素点位于ROI中的目标部分。第二种情况是inside score低,outside score高,则该像素点位于ROI中的背景部分。第三种情况是inside score和outside score都很低,那么该像素点不在任何一个ROI里面。因此,我们在上一段中描述的,针对ROI inside map和ROI outside map中逐像素点取最大值得到的图像:如果求平均后分数还是很低,那么,我们可以断定这个检测区域是不合理的。如果求平均后分数超过了某个阈值,我们就通过softmax分类器求ROI的图像类别,再通过softmax分类器求前景与背景。
对于上面的阐述,论文中的原句如下:
Our joint formulation fuses the two answers into two scores: inside and outside. There are three cases: 1) high inside score and low outside score: detection+, segmentation+; 2) low inside score and high outside score: detection+, segmentation-; 3) both scores are low: detection-, segmentation-. The two scores answer the two questions jointly via softmax and max operations. For detection, we use max to differentiate cases 1)-2) (detection+) from case 3) (detection-). The detection score of the whole ROI is then obtained via average pooling over all pixels’ likelihoods (followed by a softmax operator across all the categories). For segmentation, we use softmax to differentiate cases 1) (segmentation+) from 2) (segmentation-), at each pixel. The foreground mask (in probabilities) of the ROI is the union of the per-pixel segmentation scores (for each category).
FCIS的架构如下所示:
图像输入进来,经过卷积层提取初步特征,然后利用这些特征,一边经过RPN(Region Proposal Network)网络提取ROI区域,一边再经过一些卷积层生成2×(C+1)×k×k个特征图。2代表inside和outside两类;C+1代表图像类别一共C类,再加上背景(未知的)1类;k×k代表每一类score map中各有k个(上图的例子中k就为3)。在经过assembling之后(其实就是复制粘贴),对于每一个ROI,k×k个position-sensitive score map被综合成了一个,然后放小了16倍(长宽各变成1/4),得到2×(C+1)个特征图。然后开始并行操作,第一条线:对于每一类的ROI inside map和ROI outside map逐像素取最大值,得到了C+1个特征图,对这C+1个特征图逐个求平均值,将平均值同阈值比较,若大于阈值,则判定该ROI合理,则直接送入softmax分类器进行分类,得到图像类别。若小于阈值,则不进行任何操作。第二条线:做C+1次softmax分类,对每一个类别得到前景与背景,然后根据第一条并行线的分类结果,选择出对应类别的前景与背景划分结果。
对于训练过程,对于每一个ROI,loss由三部分组成,如下表述:
1. 在C+1类上面的分类loss(softmax loss)。
2. 对于positive ROI,有一个前景与背景的分类loss(softmax loss)。
3. 对于positive ROI,有一个包围框回归的loss(L1 loss)(由Fast R-CNN提出)
positive ROI指的是,这个ROI与Ground Truth上面与其最近的目标包围框重叠区域占比在0.5以上。
论文中的表述如下:
Training: An ROI is positive if its box IoU with respect to the nearest ground truth object is larger than 0:5, otherwise it is negative. Each ROI has three loss terms in equal weights: a softmax detection loss over C + 1 categories, a softmax segmentation loss over the foreground mask of the ground-truth category only, and a bbox regression loss as in. The latter two loss terms are effective only on the positive ROIs.
看到这里,大家千万不要以为loss就此结束了,loss部分还缺了一大块,这一大块就是RPN,RPN在Faster R-CNN中被提出,主要目的是提出检测区域。RPN的loss分成两大部分,即
4. 分类loss(softmax loss),区分提出的ROI到底是前景还是背景。
5. 包围框回归loss(L1 loss),目的是在粗糙程度上提出最合理的ROI。
对于RPN的表述,详情请参考Faster R-CNN,本篇博文不再叙述。最后的总的目标函数分成五大部分,由于论文中没有提到RPN的训练,笔者特地去作者公开的代码中求证了一下,发现确实是直接继承的Faster R-CNN的RPN。
训练的细节上面,首先是使用了孔洞卷积(atrous convolution),并且使用SGD优化器端到端训练。值得一提的是,使用了8块GPU(K40)联合训练,每一块GPU只能运行一个mini batch,由此来看,训练成本还是比较高的。
实验也体现出了比较好的效果,针对目前的现行的实例分割的方法,都有比较大的提升。
最后,给FCIS做个总结。
1.Techniques come and go, RPN stays eternal. 就是说,无论创新是怎么样的,RPN总是必须的。因为如果没法提出ROI,之后的图像分割与图像分类的子任务就没法进行。个人认为这也是微软团队引以为傲的地方,在Faster R-CNN中提出的RPN颠覆了以往的计算架构。
2.fully shared score maps for the object segmentation and detection sub-tasks 本方法使用的score maps,是针对图像分割与图像分类两个子任务共享的,并且完全抛弃了全连接层,使得网络更加轻量,并且从集成的score map到最后的结果,没有可训练参数存在,存在的只是分类器。
3.inside/outside score maps 这样的架构,使得图像分割与图像分类完全可以共享特征图。
博文到这里,FCIS的解析就接近尾声了,笔者想再说一些自己的思考:
深度学习发展到2017年,浪潮历经5年时间。从最开始的小网络,单任务架构,发展到了集成模块,多任务架构。这不仅得益于计算平台的高速发展,同时也彰显算法发展速度迅猛。在这个过程中,团队的力量尤其令人瞩目,以目标检测-实例分割为例,该领域已经几乎被微软团队主宰。从早期的R-CNN,SSP,再到后来的Fast R-CNN,Faster R-CNN,FCIS,Mask R-CNN(前微软)等,无一不体现出微软团队的强大实力。具体体现在算法思想高明,计算框架科学,编程实现规范并且迅速(具体参阅这几篇文章的微软开源代码)。因此,人工智能时期还是以人为本的时期,团队的力量尤其重要,在此再次向微软深度学习团队致敬,感谢他们引领了一个时代。
欢迎阅读笔者后续博客,各位读者朋友的支持与鼓励是我最大的动力!
written by jiong
幸福,是奋斗出来的!
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/172424.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...