当前位置: 代码迷 >> 综合 >> CASENet: Deep Category-Aware Semantic Edge Detection论文解读
  详细解决方案

CASENet: Deep Category-Aware Semantic Edge Detection论文解读

热度:68   发布时间:2023-10-20 19:30:59.0

背景

语义边缘检测已经变成了一个逐渐吸引关注的计算机视觉任务方向,因为其他的计算机视觉任务会有帮助,尤其是对分割领域。
在语义边缘检测中,有一类任务更具挑战性,不仅将语义边缘检测出来,还要将边缘属于哪一类(category-aware)也检测出来,这是一个多label分类的问题,即边缘像素的label不是一种。举个例子:

一个人的边缘的一部分也恰恰是一栋建筑的边缘,那么这部分的边缘的label就有两类。
所以 one hot编码不能用于这种label
官方代码使用了uint32来表示label,按照位数来判断像素的label,如果像素属于第一类也属于第5类,那么他的label就是1000…010001,一共32位数字,最高位代表loss是否计算这个样本。

1 主要思路

在网络的设计上,不能和语义分割的设计一致,不能使用encorder,因为边缘属于低级特征,需要从低到高的设计网络。而语义属于高级特征,才可以用decorder结构,不断对高级语义特征refine。

主干网络采用resnet101,前3个stage的特征都送到侧特征提取器(side extractor),然后和最后一个stage的特征做一个融合,用于监督计算loss。

如果数据集有k类,则网络最后的输出应该为厚度为k的特征图,每个像素位置都有k维向量。向量的值描述属于对应的类别的概率。这是一个多label分类问题。

主要共享:

  • 为了解决感知类别的边缘检测,提出了一种多label分类的框架,比起传统多类方法,提升了性能
  • 提出新颖的简洁的结构,并不对resent的顶层进行监督,而是利用低级特征(底层特征)增强高级特征用于分类。同时做了实验证明对resnet的顶层进行监督并不能得到好的结果。
  • 在sbd和cityscapes数据集上取得state of the art的效果

2 关键要素

2.1损失函数的设计

作为多label分类问题,自然不能用多分类问题的交叉熵做损失了。多label分类和多分类不是一样的概念
假设III是输入图像,label是一组分辨率一样的二值图像{ Y?1,Y?2,...,Y?k\overline Y_1,\overline Y_2,...,\overline Y_kY1?,Y2?,...,Yk?}。
那么多lable的损失函数为
CASENet: Deep Category-Aware Semantic Edge Detection论文解读
β 是非边缘像素点的比例,用来平衡样本的不均性。p只每一个像素位置。
该损失函数很好解释,可以视作对每一类别都进行一次二分类的交叉熵。最后将k个结果叠加

2.2 网络结构

CASENet: Deep Category-Aware Semantic Edge Detection论文解读
CASENet: Deep Category-Aware Semantic Edge Detection论文解读
CASENet: Deep Category-Aware Semantic Edge Detection论文解读
CASENet: Deep Category-Aware Semantic Edge Detection论文解读
其中fused classification用的是group卷积。
网络有几个特点:

  • 对前三个stage的特征提取特征,输出通道为1
  • 对第5个stage做分类,输出k的通道的特征
  • 以上两个模块都有上采样环节,保证了输出的分辨率和原图一致
  • 在concat的部分,采用的是slice的方式做concat,这个算是很新颖了。

作者认为,底层特征的感受野有限,所以让前几层去做语义分类是不合理的,所以前3个特征仅仅作为特征输入到另一个side feature extractor中。
所以语义分类应该进行才高层中,因为高层特征有很强的高级信息。
同时底层特征因为具有更加详细的边缘位置信息和结构信息,用来增强高层的分类任务是有帮助的。所以设计了这样的结构:前三层的低级特征,融合到第5个stage的高级特征最后的监督。

2.3如何能体现是低级特征帮助高级特征用于分类呢?

注意到,side feature的输出通道为1,classification的输出通道为k,也是类别的输入。shared concat的做法是,对classification的每一个特征图(for map in k maps),前3个stage的输出都插队排进去,所以最终的特征图通道是4*k的。
而且fused classification中,用到的是group卷积,虽然示意图中一个卷积核对厚度为3的特征图卷积,但实际网络这里是每4个map一组做卷积,每四个map,其中一个来自于高级特征,剩下三个来自于低级特征。

总体的思路见原文:
CASENet: Deep Category-Aware Semantic Edge Detection论文解读

2.4 加入膨胀因子

因为修改了resnet的结构,stride改变了,最后的特征图的分辨率是原来的1/8,所以感受野也变小了。为了增大感受野,在stride本来为2的层之后的卷积层都是用空洞卷积。

3 实验

作者在sbd和cityscapes上做了测试。
我接下来仅介绍预处理部分,因为这才是对我们复现代码有帮助的。实验结果,具体的表现请自行参考论文。

3.1 implementation details

考虑到人工标注和真实的边缘存在错误标注和label领域的像素的label又具有不明确的类别信息,作者生成了更粗一点的label为网络的训练GT。这可以通过在label边缘的邻域内寻找和分割标签不一样位置的像素,把这些像素也归为边缘得到。(要我说直接用形态学操作也行吧)

除了对label的预处理,还有几点细节需要注意:

  • resnet使用空洞卷积,在除了第一个conv,和1x1的卷积,其他的卷积都使用空洞率为2的卷积。
  • 使用预训练模型,在ms coco上的做预训练
  • 参数和数据增强见下

CASENet: Deep Category-Aware Semantic Edge Detection论文解读

CASENet: Deep Category-Aware Semantic Edge Detection论文解读

代码

我目前正在复现语义边缘检测的方法,框架并不使用casenet,基于BDCN的。如果效果好的话,也会开源的。有兴趣请在下方留言,届时我会通知大家。

update on 2019.7.15
CPPR2019 的STEAL 使用了CASENet网络作为backbone,大家可以去GitHub上搜索一下。STEAL的性能已经超过了CASENet

  相关解决方案