对象上下文语义分割:OCR论文笔记(Object-Contextual Representations for Semantic Segmentation )
对象上下文语义分割:OCR
原文:Object-Contextual Representations for Semantic Segmentation
论文链接: https://arxiv.org/abs/1909.11065
pytorch official code: https://github.com/HRNet/HRNet-Semantic-Segmentation/tree/HRNet-OCR
笔记时间:2020.11.25
文章发表在了ECCV2020
微软和中科大提出的HRNet可以保持高分辨率的特性可以用于对位置信息敏感的任务中。
在语义分割的任务中进一步的提出了一个聚合上下文信息的模块。也就是今天说的这个OCR。
看到目前的分割文章都有一种A+B的感觉,A是一个backbone(resnet,inception)等等。B是一个语义聚合的模块(包括pspnet中的PPM,deeplab中的ASPP)等等
Abstract
文章的总体思路是:像素的标签是像素所在的对象的标签,并且通过用相应的对象区域表示来表征每个像素来加强像素表示。
主要分为三个步骤:
- First, we learn object regions under the supervision of the ground-truth segmentation.(这里的object regions可以大概理解成我先搞一个粗略的分割)
- Second, we compute the object region representation by aggregating the representations of the pixels lying in the object region.
- Last, we compute the relation between each pixel and each object region, and augment the representation of each pixel with the object-contextual representation which is a weighted aggregation of all the object region representations.
具体看这些步骤好像很乱,事实上大概目标就是计算像素和对象之间的关系,最后来加强每个像素的表示。
Introduction+Related work
对于上下文信息的利用最早就有aspp和ppm这种具有固定区域结构的空间表示。但是本文提出的OCR对比固定空间表示的上下文聚合更具灵活性。可以看到下图:
对于aspp来讲,每个像素去提取上下文信息都是固定空间位置的。对于OCR来讲,他提取的上下文信息是提取目标像素所在对象的上下文信息。
论文整体的思路有点有粗到细的感觉。先根据粗的分割结果表示出对象。再通过对象和像素之间的关系,加强表示像素的信息。但是这个粗分割的结果只用于生成上下文信息。
Approach
文章这个部分写了很多的公式。直接看公式可能有点云里雾里,直接看代码可能更清楚些。
看的是上面这个文件的代码
https://github.com/HRNet/HRNet-Semantic-Segmentation/blob/HRNet-OCR/lib/models/seg_hrnet_ocr.py
633行之前都是进行HRNet,从633行开始才是OCR的部分
# ocr
#这句的作用是进行粗分割,形成对应论文中的软对象区域,也就是粉色框里的东西
out_aux = self.aux_head(feats)
# compute contrast feature
#这里feats就是图中的蓝色框里的东西,对应论文中的pixel reprations
feats = self.conv3x3_ocr(feats)
#这里形成的是object region representation,就是紫色框里的东西
context = self.ocr_gather_head(feats, out_aux)
#计算pixel和object region的关系。最后形成的是augmented #representation也就是黄色框里的深蓝色块(这步里面进去看有很多的步骤)
feats = self.ocr_distri_head(feats, context)
#最后分类到对应的channel数
out = self.cls_head(feats)
在看代码的过程中没有看到最后上采样4倍的地方,找了好久,最后发现好像写在了criterion.py 交叉熵损失那里,不知道为啥要这么做。
对比实验验证对象区域监督对性能有不小的影响
Experiments
训练:用于监督目标区域的损失设置损失权重为0.4。进行了数据增强。
作者不仅在性能上进行了对比,在内存使用,参数量等也进行了对比。
Conclusions
文章提出了一种面向语义分割的对象上下文表示方法。主要的想法就是认为像素的标签是像素所在的对象的标签,并且通过用相应的对象区域表示来表征每个像素来加强像素表示。