新人小白,第一次写博客,望指教。
全景分割(panoptic segmentation),是图像分割任务的一个新坑,提出于2018年。一句话概括全景分割,就是为图像中每一个pixel赋予class label和instance ID。Each pixel of an image must be assigned a semantic label and an instance id.
之前的图像分割主要有两个方向,一个是语义分割(semantic segmentation):常用来识别天空、草地、道路等等不可数且没有固定形状的stuff;另一个是实例分割(instance segmentation):常用来识别人、动物、工具等可数且相互独立的things。语义分割预测每个pixel的class label,不区分实例;实例分割预测每个instance对应的像素区域,区分实例,通常采用mask标记目标。
现在,全景分割就是把这两个任务结合起来,做到“完全理解整幅图像”:给每个pixel加上标签 ( l i , z i ) (l_i,z_i) (li,zi),其中 i i i表示第 i i i个像素, l l l表示语义类别, z z z表示实例ID。当 l i l_i li属于stuff时,忽略 z i z_i zi,识别stuff;当 l i l_i li属于things且 l i = z i l_i=z_i li=zi时,该pixel属于某一things。Pixel with the same label and id belongs to the same object; for stuff labels the instance id is ignored.
评估标准上,开山之作“Panoptic Segmentation”提出了评价指标panoptic quality(PQ):
P Q = ∑ ( p , g ) ∈ T P I o U ( p , g ) ∣ T P ∣ + 1 2 ∣ F P ∣ + 1 2 ∣ F N ∣ PQ=\frac{\sum_{(p,g) \in TP} IoU(p,g)}{|TP|+\frac{1}{2}|FP|+\frac{1}{2}|FN|} PQ=∣TP∣+21∣FP∣+21∣FN∣∑(p,g)∈TPIoU(p,g)PQ可以看作是segmentation quality(SQ)和recognition quality(RQ)的乘积 P Q = S Q × R Q = ∑ ( p , g ) ∈ T P I o U ( p , g ) ∣ T P ∣ × ∣ T P ∣ ∣ T P ∣ + 1 2 ∣ F P ∣ + 1 2 ∣ F N ∣ PQ=SQ \times RQ=\frac{\sum_{(p,g) \in TP} IoU(p,g)}{|TP|} \times \frac{|TP|}{|TP|+\frac{1}{2}|FP|+\frac{1}{2}|FN|} PQ=SQ×RQ=∣TP∣∑(p,g)∈TPIoU(p,g)×∣TP∣+21∣FP∣+21∣FN∣∣TP∣式中,TP代表匹配的segments pairs;FP代表不匹配的predicted segments;FN代表不匹配的GT segments。注意,当predicted segments和GT segments的IoU>0.5时则认为两个segments匹配。下图给出了person类的segments划分为TP、FN和FP的例子。
具体计算时,先分别对每一类计算PQ,再计算所有类的平均值。RQ相当于F1 score,SQ相当于匹配后的预测segment与标注segment的mIoU。对于类别不平衡问题,PQ不敏感。并且PQ只关心每个实例的分割质量而没有考虑不同实例的大小不同。之后工作(DeeperLab)提出了parsing covering(PC)指标: C o v i = 1 N i ∑ R ∈ S i ∣ R ∣ max R ′ ∈ S i ′ I o U ( R , R ′ ) Cov_i = \frac{1}{N_i} \sum_{R \in S_i}{\left| R \right| \max \limits_{R' \in S'_i}IoU(R,R')} Covi=Ni1R∈Si∑∣R∣R′∈Si′maxIoU(R,R′)其中, R ′ , R R',R R′,R分别表示对应类别的预测 segments 与真实 segments, ∣ R ∣ \left| R \right| ∣R∣表示对应类别的实例在真实标注中像素点数量, N i N_i Ni表示类别为 i i i的真实标注像素点总和。通过对大的实例物体赋予更大的权重,使评价指标能够更明显地反映大物体的分割指标。
N i = ∑ R ∈ S i ∣ R ∣ N_i= \sum_{R \in S_i} {\left| R \right|} Ni=R∈Si∑∣R∣ P C = 1 C ∑ i = 1 C C o v i PC=\frac{1}{C} \sum_{i=1}^{C}{Cov_i} PC=C1i=1∑CCovi从公式分子分母入手,分子有点像加入实例大小的加权求和,最后得到的是加权平均。
全景分割数据集需要有语义分割标注和实例分割标注。目前有四个全景分割数据集:
PS baseline算法采用PSPNet和Mask R-CNN分别进行语义和实例分割,并将语义和实例分割的输出采用类似NMS的启发式方法融合得到全景分割的输出,文章最后将machine results与human results进行比较。作者还指出PS的创新方向主要有两个,一个是深度end-to-end模型,以同时处理PS中的stuff-and-thing;另一个是采用高层的推理帮助解决PS中不能有重叠segments的问题(如learnable NMS)。
本文的关键点在于:
在Unified Panoptic Segmentation Network(UPSNet)工作中,作者认为现有的分割方法忽略了语义和实例分割的联系,并设计了一个统一这两种分割的模型。结构图如下:
UPSNet结构中设计有三个Head,分别是Semantic Head(语义头),Instance Head(实例头),以及Panoptic Head(全景头)。其中语义头建立在可变性卷积的基础上,且利用来自特征金字塔网络(FPN)的多尺度信息;实例头与Mask R-CNN类似输出mask segmentation, bounding box和相关类;全景头利用了前两个头的logits,且添加了一个新的logits通道(对应于额外的一个未知类),全景头存在的目的是解决实例分割和语义分割之间的冲突,有助于准确地预测实例和类标签。
下面详细解释:
Backbone: 采用原始Mask R-CNN作为backbone(特征提取采用ResNet +FPN;RPN判断proposals是否为前景,并生成bbox的坐标变换系数;PymaridMaskTarget用于生成前景RoIs)。
Instance Segmentation Head: 实例头遵循了Mask R-CNN的设计,带有边界框回归输出、分类输出和分割掩码输出。
Semantic Segmentation Head: 语义头以FPN的多尺度特征图作为输入,采用FPN的 P 2 , P 3 , P 4 , P 5 P_2,P_3,P_4,P_5 P2,P3,P4,P5(256通道)特征图,他们首先经过相同的可变性卷积网络,然后均上采样到 P 2 P_2 P2尺度,再接着将他们concate起来并应用1×1卷积(softmax)来预测语义类别。具体看下图:
语义头采用沿像素的交叉熵损失。为了更加强调前景对象(如行人),文章还考虑了RoI损失——根据Mask R-CNN的做法,训练阶段,采用实例的GT bounding box来裁切1×1卷积后得到的logits map,然后将其resize成28×28的mask,RoI损失通过计算28×28 patch的交叉熵得到,RoI 损失相当于在instance中对错误分类的像素进行更多的惩罚(之后消融实验证明了RoI损失再不损失语义分割精度的基础上提高了全景分割性能,但是从消融实验可以看出,RoI损失在提高了stuff分割效果的同时降低了thing的分割效果,如此一来RoI损失的有效性不能够严谨证明)。
Panoptic Segmentation Head: 全景头的设计需要接受来自语义头和实例头的logits信息。结构如下所示:
语义头产生的语义分割的logits定义为 X X X,尺寸为 ( N s t u f f + N t h i n g , H , W ) (N_{stuff}+N_{thing},H,W) (Nstuff+Nthing,H,W),代表(通道数,高,宽), X X X可以理所当然地沿着通道被分为两个tensor X s t u f f X_{stuff} Xstuff和 X t h i n g X_{thing} Xthing。 N s t u f f N_{stuff} Nstuff在一个数据集中是确定值,而 N t h i n g N_{thing} Nthing并不是一个定值。训练阶段,确定实例数量 N i n s t N_{inst} Ninst是根据GT完成,推理阶段,采用mask pruning来确定 N i n s t N_{inst} Ninst。全景头的第一步需要生成一个tensor Z Z Z,其尺寸是 ( N s t u f f + N t h i n g , H , W ) (N_{stuff}+N_{thing},H,W) (Nstuff+Nthing,H,W)。
掩码修剪(mask pruning):在推理过程中,从实例分割头中得到输出框、掩码和预测类标签后,就可以跟据mask pruning来确定哪个mask被用来构造全景logits。具体方法是首先执行与类无关的非最大值抑制(IoU阈值0.5),然后对剩余box的预测类概率进行排序,剔除概率小于阈值(0.6)的box。对于每个类,创建一个与图像大小相同的画布。然后,将该类的mask插值到图像scale,并按照概率的递减顺序将它们逐个粘贴到相应的画布上。每当粘贴一个mask,如果当前mask和已存在于当前mask之上的mask的交集大于阈值(0.3),就放弃这个mask。否则,需要将非相交部分粘贴到画布上。语义头和全景头的logits是输入图像的原始尺度。
首先将 X s t u f f X_{stuff} Xstuff填充到 Z Z Z的前 N s t u f f N_{stuff} Nstuff个维度,对于实例 i i i,从实例头可得其mask logits Y i Y_i Yi(28×28),box B i B_i Bi和class ID C i C_i Ci。训练阶段 B i B_i Bi和 C i C_i Ci都来自GT,推理阶段时 B i B_i Bi和 C i C_i Ci都来自mask R-CNN的预测。第 i i i个实例可以从语义头获得表示 X m a s k i X_{mask_i} Xmaski(大小H×W,并且在box B i B_i Bi外的值都为零)。然后通过双线性插值和在box外补零插值 Y i Y_i Yi直到与 X m a s k i X_{mask_i} Xmaski到相同尺寸,记为 Y m a s k i Y_{mask_i} Ymaski(大小H×W),第 i i i个实例最终表示为 Z N s t u f f + i = X m a s k i + Y m a s k i Z_{N_{stuff}+i}=X_{mask_i}+Y_{mask_i} ZNstuff+i=Xmaski+Ymaski。只要用所有实例的表示填充 Z Z Z后,便可以沿着通道维度来预测像素的类——若最大值落在前 N s t u f f N_{stuff} Nstuff维,则它属于一个stuff类,否则其最大值的index代表其instance ID。
推理阶段,一旦预测了instance ID,仍需要确定每个instance的class ID,可使用Mask R-CNN预测的 C i n s t C_{inst} Cinst或语义头预测的 C s e m C_{sem} Csem确定。文章采用了一个启发式规则:对于任一instance,需要得知哪些pixel对应于它(沿着 Z Z Z的通道维度取argmax等于pixel的instance ID),对于这些像素首先检查 C i n s t C_{inst} Cinst和 C s e m C_{sem} Csem的一致性,如一致,class ID = C i n s t C_{inst} Cinst,如不一致,统计这些 C s e m C_{sem} Csem的mode,记作 C ^ s e m \hat C_{sem} C^sem,如果mode的频率>0.5且 C ^ s e m \hat C_{sem} C^sem属于stuff,则class ID = C ^ s e m \hat C_{sem} C^sem,否则class ID = C i n s t C_{inst} Cinst。【mode具体是何意,求教】
Unknown Prediction: UPSNet的一种新机制,允许UPSNet将一个pixel分类为未知类,而不是做出错误的预测。文章的解释是如果一个错误是不可避免的,拒判的好处是只会让一个类的FN+1,不会让另一个类的FP+1,无论是thing类还是stuff类都一样可以拒判,这样能比给出一个错判下的评价指标PQ高。计算额外未知类的logits是 Z u n k n o w n = max ( X t h i n g ) − max ( X m a s k ) Z_{unknown}=\max{(X_{thing})}- \max{(X_{mask}}) Zunknown=max(Xthing)−max(Xmask),其中 X m a s k X_{mask} Xmask是 X m a s k i X_{mask_i} Xmaski沿着通道维度concate起来的,大小为 N i n s t × H × W N_{inst}×H×W Ninst×H×W,最大值也是沿着通道维度取得的,文章给出的解释是对任一pixel,如果 max ( X t h i n g ) > max ( X m a s k ) \max{(X_{thing})}> \max{(X_{mask}}) max(Xthing)>max(Xmask),则很可能会错过一些实例【为什么这么说,求教】。为了生成unknown类的GT,训练时随机采样30%的GT masks并且设置其为unknown;在评价时,忽略属于unknown类的像素,设置其为void。
Loss Function: UPSNet一共8个loss,语义分割两个(全图交叉熵损失+像素级分类RoI损失),全景分割一个(全图像素分类损失),RPN两个(分类损失和回归损失),实例分割三个(分类损失,回归损失,mask分割损失)。这8个loss在不同加权下结果也不相同,消融实验发现loss平衡策略最优——即确保所有loss的大致规模相同可以得到较好的结果。
实验结果:
可以看出,新网络在backbone不是很复杂的情况下任然取得了不错的成绩。
文章提出了一种bottoom-up,single-shot的全景图像解析方法。本文的关键点在于:
网络结构如下所示(采用encoder-decoder的形式,语义分割和实例分割来自共享的decoder输出,再经过融合获得最后的图像解析结果):
对于图像解析任务来说,输入需要较高的分辨率(文章基于 Mapillary Vistas数据集,分辨率大小为1441×1441)会造成大量的内存占用及冗余。如何平衡准确率和内存占用是一个问题。
Encoder:
Xception-71(获得较高的分辨率,目的在于高精度)或加宽版MobileNetV2(轻量级网络,用于更快地推理,目的在于高速度),并在末尾加了ASPP(目的是增加感受野),encoder输出的特征图stride为16,即其空间分辨率等于每个空间维度上的输入大小降采样16倍。
- 空洞空间金字塔池化结构(ASPP)首次在DeepLabV2中提出,特点是以多尺度来分割目标物体。通过不同sample rates的filters对应不同大小的感受野,来获得多尺寸下的语义信息。具体操作是,对一张图片并行地采用不同尺寸的空洞卷积操作,得到多尺度特性,不同sample rate提取的特征经过单独后处理和融合进而生成最终的结果。
- 加宽版MobileNetV2: 虽然标准的MobileNetV2在输入大小为224×224的ImageNet图像分类任务中表现较好,但对于较高输入分辨率的图像解析任务,其有限的感受野(491×491)无法捕捉大范围的上下文信息。正如Xception-71那样,叠加更多3×3的卷积是增大感受野的一种方式,然而增加的额外的网络层会造成大量的内存占用。考虑到计算资源有限,将MobileNetV2中的所有3×3的卷积替换为5×5的卷积。这种方法在不增加内存占用的条件下有效地增加了感受野的大小(981×981),计算量会稍有增加。本文称其为加宽版MobileNetV2。
Decoder:
Decoder的目的是恢复目标物边界的细节信息,借鉴了DeepLabV3+。文章采用将encoder输出的激活层的feature map(stride=16)与backbone的较低层次的feature map(stride=4)进行融合。ASPP的输出与低层feature map分别被1×1 conv降维然后concat。
在concat前,DeepLabV3+再上采样已经降维后的ASPP的输出,但上采样会带来内存消耗,于是采用space-to-depth (S2D)。
后面还使用两个7x7的depthwise conv来增大感受野,通道数为4096。然后通过depth-to-space (D2S)降维来实现上采样操作,得到一个通道数为256,stride为4的feature map,作为image parsing处理的输入。具体过程见下图:
Image Parsing Prediction Heads:
图像解析包括5个预测头,都是由两个卷积层(7×7和1×1各一个)组成。其中,一个预测头有256个滤波器(第一个7x7的卷积核的通道数为256),用于语义分割;另外四个预测头有64个滤波器(第一个7x7的卷积核的通道数为64),用于类别无关的实例分割。
文章提出的bootstrappd cross-entropy loss如下
l = − 1 K ∑ i = 1 N w i ⋅ 1 [ p i , y i < t K ] ⋅ log p i , y i l =-\frac{1}{K} \sum_{i=1}^{N}{w_i \cdot 1[p_{i,y_i} < t_K] \cdot \log{p_{i,y_i}}} l=−K1i=1∑Nwi⋅1[pi,yi<tK]⋅logpi,yi其中 y i y_i yi是pixel i i i的目标类, p i , j p_{i,j} pi,j是pixel i i i预测属于 j j j类的后验概率, 1 [ x ] = 1 1[x]=1 1[x]=1 if x x x is TRUE and 0 0 0 otherwise。 t K t_K tK设置为损失在top-K的pixel。文章对于area小于64的instance,其pixel的权值 w i = 3 w_i=3 wi=3,否则设为 w i = 1 w_i=1 wi=1。通过这样做,网络被训练成同时关注奇异像素(hard pixel)和small instance。
Prediction Fusion:
将4个预测融合到一个类不相关的instance segmentaion map,再最终融合semantic和instance segmentation map。
实验结果:
DeeperLab 作为新的全景分割算法,其在精度和速度之间取得了很好的平衡,论文中做了大量实验和tricks。